為什么需要自動化測驗
自動化測驗有很多優點,但這里有3個主要的點
- 可重用性:不需要總是撰寫新的腳本,除非必要,即使是新的作業系統版本也不需要撰寫腳本,
- 可靠性:人容易出錯,機器不太可能,當運行不能跳過的重復步驟/測驗時,速度會更快,
- 全天運行:您可以在任何時間或遠程啟動測驗,夜間運行正在測驗你的軟體,即使是在你睡著的時候,
成熟的、功能齊全的Python測驗工具——pytest
目前有多種可用的測驗框架和工具,這些框架的風格也各不相同,比如資料驅動、關鍵字驅動、混合、BDD等等,您可以選擇最適合您的要求,
Python和pytest在這場競爭中占據了巨大的份額,Python及其相關工具之所以被大量使用,可能是因為與其他語言相比,沒有或很少編程經驗的人更能負擔得起它們,
pytest框架使得撰寫小型測驗變得很容易,但是可以擴展到支持應用程式和庫的復雜功能測驗,
Pytest的一些主要特性:
- 自動發現測驗模塊和功能
- 有效的CLI來更好地控制您想要運行或跳過的內容
- 大型第三方插件生態系統
- 固定裝置-不同的型別,不同的范圍
- 與傳統的單元測驗框架一起作業

自動和可配置的測驗發現
在默認情況下,pytest期望在名稱以test_開頭或以_test.py結尾的python模塊中找到測驗,在默認情況下,它期望測驗函式名以test_ 開頭,但是,可以通過在pytest的一個組態檔中添加您自己的配置來修改這個測驗發現協議,
# content of pytest.ini # Example 1: have pytest look for "check" instead of "test" # can also be defined in tox.ini or setup.cfg file, although the section # name in setup.cfg files should be "tool:pytest" [pytest] python_files = check_*.py python_classes = Check python_functions = *_check
讓我們看一下非常基本的測驗函式,
class CheckClass(object): def one_check(self): x = "this" assert 'h' in x def two_check(self): x = "hello" assert hasattr(x, 'check')
你注意到什么了嗎?沒有花哨的assertEqual或assertDictEqual等,只是簡單明了的斷言,對于比較兩個物件的簡單操作,不需要匯入這些斷言函式,assert是python已經提供的功能,因此無需重新發明,
固定裝置會起作用的
查看測驗功能,測驗錢包軟體的基本操作,比如,
// test_wallet.py from wallet import Walletdef test_default_initial_amount(): wallet = Wallet() assert wallet.balance == 0 wallet.close()def test_setting_initial_amount(): wallet = Wallet(initial_amount=100) assert wallet.balance == 100 wallet.close()def test_wallet_add_cash(): wallet = Wallet(initial_amount=10) wallet.add_cash(amount=90) assert wallet.balance == 100 wallet.close()def test_wallet_spend_cash(): wallet = Wallet(initial_amount=20) wallet.spend_cash(amount=10) assert wallet.balance == 10 wallet.close()
嗯,有意思!你注意到了嗎,很多樣板檔案,另一件值得注意的事情是,測驗除了測驗功能之外還做了一些其他的事情,例如實體化錢包并關閉它——Wallet .close()
現在讓我們看看如何使用pytest fixture去除樣板
import pytest from _pytest.fixtures import SubRequest from wallet import Wallet#==================== fixtures @pytest.fixture def wallet(request: SubRequest): param = getattr(request, ‘param’, None) if param: prepared_wallet = Wallet(initial_amount=param[0]) else: prepared_wallet = Wallet() yield prepared_wallet prepared_wallet.close()#==================== testsdef test_default_initial_amount(wallet): assert wallet.balance == [email protected](‘wallet’, [(100,)], indirect=True) def test_setting_initial_amount(wallet): assert wallet.balance == [email protected](‘wallet’, [(10,)], indirect=True) def test_wallet_add_cash(wallet): wallet.add_cash(amount=90) assert wallet.balance == [email protected](‘wallet’, [(20,)], indirect=True) def test_wallet_spend_cash(wallet): wallet.spend_cash(amount=10) assert wallet.balance == 10
整潔!不是嗎,測驗函式非常微妙,只做它們想做的事情,夾具錢包負責設定和拆卸、實體化和關閉錢包,它不僅有助于撰寫可重用的代碼,還增加了資料分離的本質,如果仔細看,錢包數量是一塊測驗邏輯之外提供的測驗資料,而不是硬編碼在測驗函式內部,
@pytest.mark.parametrize(‘wallet’, [(10,)], indirect=True)
在更可控的環境中,您可以在存盤庫中有一個測驗資料檔案,例如test-data.ini,以及讀取該檔案的包裝器,并且您的測驗函式可以呼叫包裝器的另一個介面來讀取測驗資料,
但是,建議將您的fixture作為conftest.py檔案的一部分,這是pytest中的一個特殊檔案,它允許測驗發現全域fixture,
但是,有一個針對許多不同資料集執行的測驗用例!
不用擔心,pytest有一個很酷的特性來引數化您的fixture,讓我們用一個例子來看看它,
假設您的產品公開CLI介面以在本地管理它,此外,您的產品在啟動時設定了許多默認引數,您需要驗證所有這些引數的默認值,
我們可以考慮為每個設定撰寫一個測驗用例,但是使用pytest就容易得多了
@pytest.mark.parametrize(“setting_name, setting_value”, [(‘qdb_mem_usage’, ‘low’), (‘report_crashes’, ‘yes’), (‘stop_download_on_hang’, ‘no’), (‘stop_download_on_disconnect’, ‘no’), (‘reduce_connections_on_congestion’, ‘no’), (‘global.max_web_users’, ‘1024’), (‘global.max_downloads’, ‘5’), (‘use_kernel_congestion_detection’, ‘no’), (‘log_type’, ‘normal’), (‘no_signature_check’, ‘no’), (‘disable_xmlrpc’, ‘no’), (‘disable_ntp’, ‘yes’), (‘ssl_mode’, ‘tls_1_2’),])def test_settings_defaults(self, setting_name, setting_value): assert product_shell.run_command(setting_name) == \ self.”The current value for \’{0}\’ is \’{1}\’.”.format(setting_name, setting_value), \ ‘The {} default should be {}’.format(preference_name, preference_value)
很酷,不是嗎!,你只寫了13個測驗用例(每個不同setting_value),在未來如果你添加一個新的設定到你的產品,你需要做的就是,再添加一個tuple上面,
它是如何與selenium和API測驗的UI測驗集成的
嗯,你的產品可以有多種界面,CLI -就像我們上面討論的,類似地,GUI和API,在部署軟體之前,對所有軟體進行測驗是很重要的,在多個組件相互依賴和耦合的企業軟體中,某個部分的更改可能會影響其他部分,
記住,pytest只是一個促進“測驗”的框架,而不是特定型別的測驗,因此,您可以使用selenium構建GUI測驗,或者使用Python的請求庫構建API測驗,然后使用pytest運行它,
例如,在高層次上,這可能是您的測驗存盤庫結構,

正如您在上面看到的,這可以很好地分離組件,
- apiobjects:為呼叫API端點創建包裝器的好地方,您可以使用BaseAPIObject和派生類來滿足您的需求,
- helper:撰寫您的helper方法
- 庫檔案,它可以被不同的組件使用,例如你的fixture在conftest, pageobjects等,
- pageobjects:
pageobjects設計模式可用于創建不同GUI頁面的類,我們在站得住使用Webium,它是Python的一個頁面物件模式實作庫, - 套件:您可以在這里撰寫pylint代碼驗證套件,這將有助于您對代碼質量有信心,
- 測驗:可以根據測驗的風格對測驗目錄進行分類,它使管理和研究您的測驗變得容易,
這只是供參考,存盤庫的結構和依賴關系可以按照您的需要進行布局,
我有足夠的測驗用例,想并行運行它們
您的測驗套件中可能有大量的測驗用例,并且有時您可能想并行地運行測驗用例,以減少總體測驗執行時間,
Pytest提供了一個很棒的并行運行測驗的插件,名為Pytest -xdist,它用一些獨特的執行模式擴展了Pytest,使用pip安裝此插件
pip install pytest-xdist
讓我們通過一個示例來快速研究它,
我有一個自動化測驗存盤庫CloudApp,用于使用selenium進行GUI測驗,此外,它還隨著新的測驗用例不斷增長,現在已經有了數百個測驗,我想做的是并行運行它們,并減少測驗執行時間,
在終端中,只需在專案根檔案夾/ tests檔案夾中鍵入pytest,這將執行所有測驗,
pytest -s -v -n=2

并行運行測驗的pytest-xdist
這還可以幫助您在多個瀏覽器上并行運行測驗,
報告
Pytest內置支持創建結果檔案,可由Jenkins、Bamboo或其他持續集成服務器讀取,使用如下呼叫:
pytest test/file/path — junitxml=path
這可以生成很好的XML風格的輸出,可以由許多CI系統決議器解釋,
結論
Pytest的受歡迎程度逐年上升,此外,它還擁有廣泛的社區支持,這讓您可以訪問很多擴展,比如pytest-django,它可以幫助您為Django web應用程式集成撰寫測驗,記住,pytest支持運行unittest測驗用例,所以如果您正在使用unittest, pytest是值得考慮的,
如果你
①從事功能測驗,想進階自動化測驗
②在測驗界混了1、2年,依然不會敲代碼
③面試大廠卻屢屢碰壁
我邀你進群吧!來吧~~測驗員,313782132(Q群里有技術大牛一起交流分享,學習資源的價值取決于你的行動,莫做“收藏家”)獲取更多大廠技術、面試資料
如果對python自動化測驗、web自動化、介面自動化、移動端自動化、面試經驗交流等等感興趣的測驗人,可以關注微信公眾號:【傷心的辣條】,獲取軟體測驗工程師大廠面試資料!
最后:
凡事要趁早,特別是技術行業,一定要提升技術功底,豐富自動化專案實戰經驗,這對于你未來幾年職業規劃,以及測驗技術掌握的深度非常有幫助,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/238936.html
標籤:其他
