<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          如何使用Pytest進行自動化測試

          共 5614字,需瀏覽 12分鐘

           ·

          2021-02-24 18:38

          Python實戰(zhàn)社群

          Java實戰(zhàn)社群

          長按識別下方二維碼,按需求添加

          掃碼關(guān)注添加客服

          進Python社群▲

          掃碼關(guān)注添加客服

          進Java社群


          作者丨Huangwei AI
          來源丨Python學(xué)會

          為什么需要自動化測試


          自動化測試有很多優(yōu)點,但這里有3個主要的點:


          1. 可重用性:不需要總是編寫新的腳本,除非必要,即使是新的操作系統(tǒng)版本也不需要編寫腳本。

          2. 可靠性:人容易出錯,機器不太可能。當運行不能跳過的重復(fù)步驟/測試時,速度會更快。

          3. 全天運行:您可以在任何時間或遠程啟動測試。夜間運行正在測試你的軟件,即使是在你睡著的時候。


          成熟的、功能齊全的Python測試工具——pytest


          目前有多種可用的測試框架和工具。這些框架的風(fēng)格也各不相同,比如數(shù)據(jù)驅(qū)動、關(guān)鍵字驅(qū)動、混合、BDD等等。您可以選擇最適合您的要求。


          Python和pytest在這場競爭中占據(jù)了巨大的份額。Python及其相關(guān)工具之所以被大量使用,可能是因為與其他語言相比,沒有或很少編程經(jīng)驗的人更能負擔(dān)得起它們。


          pytest框架使得編寫小型測試變得很容易,但是可以擴展到支持應(yīng)用程序和庫的復(fù)雜功能測試。


          Pytest的一些主要特性:


          • 自動發(fā)現(xiàn)測試模塊和功能

          • 有效的CLI來更好地控制您想要運行或跳過的內(nèi)容

          • 大型第三方插件生態(tài)系統(tǒng)

          • 固定裝置-不同的類型,不同的范圍

          • 與傳統(tǒng)的單元測試框架一起工作


          自動和可配置的測試發(fā)現(xiàn)


          在默認情況下,pytest期望在名稱以test_開頭或以_test.py結(jié)尾的python模塊中找到測試。在默認情況下,它期望測試函數(shù)名以test_ 開頭。但是,可以通過在pytest的一個配置文件中添加您自己的配置來修改這個測試發(fā)現(xiàn)協(xié)議。


          # 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_*.pypython_classes = Checkpython_functions = *_check


          讓我們看一下非常基本的測試函數(shù)。


          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等,只是簡單明了的斷言。對于比較兩個對象的簡單操作,不需要導(dǎo)入這些斷言函數(shù)。assert是python已經(jīng)提供的功能,因此無需重新發(fā)明。??


          固定裝置會起作用的


          查看測試功能,測試錢包軟件的基本操作,比如,


          // test_wallet.pyfrom 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()


          嗯,有意思!你注意到了嗎,很多樣板文件。另一件值得注意的事情是,測試除了測試功能之外還做了一些其他的事情,例如實例化錢包并關(guān)閉它——Wallet .close()


          現(xiàn)在讓我們看看如何使用pytest fixture去除樣板


          import pytestfrom _pytest.fixtures import SubRequestfrom wallet import Wallet#==================== fixtures@pytest.fixturedef 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 == 0@pytest.mark.parametrize(‘wallet’, [(100,)], indirect=True)def test_setting_initial_amount(wallet):   assert wallet.balance == 100@pytest.mark.parametrize(‘wallet’, [(10,)], indirect=True)def test_wallet_add_cash(wallet):   wallet.add_cash(amount=90)   assert wallet.balance == 100@pytest.mark.parametrize(‘wallet’, [(20,)], indirect=True)def test_wallet_spend_cash(wallet):   wallet.spend_cash(amount=10)   assert wallet.balance == 10


          整潔!不是嗎。測試函數(shù)非常微妙,只做它們想做的事情。夾具錢包負責(zé)設(shè)置和拆卸、實例化和關(guān)閉錢包。它不僅有助于編寫可重用的代碼,還增加了數(shù)據(jù)分離的本質(zhì)。如果仔細看,錢包數(shù)量是一塊測試邏輯之外提供的測試數(shù)據(jù),而不是硬編碼在測試函數(shù)內(nèi)部。


          @pytest.mark.parametrize(‘wallet’, [(10,)], indirect=True)


          在更可控的環(huán)境中,您可以在存儲庫中有一個測試數(shù)據(jù)文件,例如test-data.ini,以及讀取該文件的包裝器,并且您的測試函數(shù)可以調(diào)用包裝器的另一個接口來讀取測試數(shù)據(jù)。


          但是,建議將您的fixture作為conftest.py文件的一部分。這是pytest中的一個特殊文件,它允許測試發(fā)現(xiàn)全局fixture。


          但是,有一個針對許多不同數(shù)據(jù)集執(zhí)行的測試用例!


          不用擔(dān)心,pytest有一個很酷的特性來參數(shù)化您的fixture。讓我們用一個例子來看看它。


          假設(shè)您的產(chǎn)品公開CLI接口以在本地管理它。此外,您的產(chǎn)品在啟動時設(shè)置了許多默認參數(shù),您需要驗證所有這些參數(shù)的默認值。


          我們可以考慮為每個設(shè)置編寫一個測試用例,但是使用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),在未來如果你添加一個新的設(shè)置到你的產(chǎn)品,你需要做的就是,再添加一個tuple??上面。


          它是如何與selenium和API測試的UI測試集成的


          嗯,你的產(chǎn)品可以有多種界面。CLI -就像我們上面討論的。類似地,GUI和API。在部署軟件之前,對所有軟件進行測試是很重要的。在多個組件相互依賴和耦合的企業(yè)軟件中,某個部分的更改可能會影響其他部分。


          記住,pytest只是一個促進“測試”的框架,而不是特定類型的測試。因此,您可以使用selenium構(gòu)建GUI測試,或者使用Python的請求庫構(gòu)建API測試,然后使用pytest運行它。


          例如,在高層次上,這可能是您的測試存儲庫結(jié)構(gòu)。




          正如您在上面看到的,這可以很好地分離組件。


          • apiobjects:為調(diào)用API端點創(chuàng)建包裝器的好地方。您可以使用BaseAPIObject和派生類來滿足您的需求。

          • helper:編寫您的helper方法

          • 庫文件,它可以被不同的組件使用,例如你的fixture在conftest, pageobjects等。

          • pageobjects: pageobjects設(shè)計模式可用于創(chuàng)建不同GUI頁面的類。我們在站得住使用Webium,它是Python的一個頁面對象模式實現(xiàn)庫。

          • 套件:您可以在這里編寫pylint代碼驗證套件,這將有助于您對代碼質(zhì)量有信心。

          • 測試:可以根據(jù)測試的風(fēng)格對測試目錄進行分類。它使管理和研究您的測試變得容易。


          這只是供參考,存儲庫的結(jié)構(gòu)和依賴關(guān)系可以按照您的需要進行布局。


          我有足夠的測試用例,想并行運行它們


          您的測試套件中可能有大量的測試用例,并且有時您可能想并行地運行測試用例,以減少總體測試執(zhí)行時間。


          Pytest提供了一個很棒的并行運行測試的插件,名為Pytest -xdist,它用一些獨特的執(zhí)行模式擴展了Pytest。使用pip安裝此插件


          pip install pytest-xdist


          讓我們通過一個示例來快速研究它。


          我有一個自動化測試存儲庫CloudApp,用于使用selenium進行GUI測試。此外,它還隨著新的測試用例不斷增長,現(xiàn)在已經(jīng)有了數(shù)百個測試。我想做的是并行運行它們,并減少測試執(zhí)行時間。


          在終端中,只需在項目根文件夾/ tests文件夾中鍵入pytest。這將執(zhí)行所有測試。


          pytest -s -v -n=2



          并行運行測試的pytest-xdist


          這還可以幫助您在多個瀏覽器上并行運行測試。


          報告


          Pytest內(nèi)置支持創(chuàng)建結(jié)果文件,可由Jenkins、Bamboo或其他持續(xù)集成服務(wù)器讀取,使用如下調(diào)用:


          pytest test/file/path — junitxml=path


          這可以生成很好的XML風(fēng)格的輸出,可以由許多CI系統(tǒng)解析器解釋。

          結(jié)論



          Pytest的受歡迎程度逐年上升。此外,它還擁有廣泛的社區(qū)支持,這讓您可以訪問很多擴展,比如pytest-django,它可以幫助您為Django web應(yīng)用程序集成編寫測試。記住,pytest支持運行unittest測試用例,所以如果您正在使用unittest, pytest是值得考慮的。??

          程序員專欄
          ?掃碼關(guān)注填加客服?
          長按識別下方二維碼進群

          近期精彩內(nèi)容推薦:??

          ?10年巨變,我女神成了我老婆...

          ?一個程序員的水平能差到什么程度?

          ?在一個公司死磕5-10年的程序員都怎么樣了?

          ?史上最污技術(shù)解讀,我竟然秒懂了




          在看點這里好文分享給更多人↓↓

          瀏覽 21
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  a在线视频中文字幕 | 777视频在线观看 | 亚洲一区二区网站 | 欧美操逼电影免费 | 国产精品久久久久一区欢美无码 |