pytest(Chapter 2)

二、第二章

     2.1通過python -m pytest調(diào)用pytest ----- 調(diào)用方式后期完善其他調(diào)用
         這是在2.0版本中新引入的功能。 
         
         你可以通過python的解釋器,利用命令行來調(diào)用測試:
         
             python ‐m pytest [...]
             
         這種調(diào)用方式幾乎等同于直接調(diào)用pytest […],但需要注意的是這種通過python來調(diào)用的方式同時會
         將當(dāng)前目錄添加到sys.path
         
         
     2.2退出碼
         pytest有以下6種退出碼:
             Exit code 0: 找到所有測試用例并測試通過
             Exit code 1: 找到測試用例并運行但是部分測試用例運行失敗
             Exit code 2: 用戶中斷了測試
             Exit code 3: 執(zhí)行過程中發(fā)生了內(nèi)部錯誤
             Exit code 4: pytest命令行使用錯誤
             Exit code 5: 沒有找到任何測試用例
             
     2.3 版本信息,參數(shù)名,環(huán)境變量的幫助
     
         pytest ‐‐version #顯示pytest的import的路徑
         pytest ‐‐fixtures #顯示內(nèi)置的函數(shù)參數(shù)
         pytest ‐h | ‐‐help #幫助信息
         
         
     2.4 第一(N)次測試失敗后停止
         使用下面的參數(shù)可以讓測試在第1(N)次測試失敗后停止:
         
             pytest ‐x # 第一次測試失敗后停止測試
             pytest ‐‐maxfail=2 # 第2次測試失敗后停止測試
             
     2.5指定/選擇測試用例
         Pytest在命令行中支持多種方式來運行和選擇測試用例:
         對模塊中進行測試:
             pytest test_mod.py
         對文件夾中進行測試:
             pytest testing/
         通過關(guān)鍵字表達式來進行測試:
             pytest ‐k "MyClass and not method"
         這種方式會執(zhí)行文件名,類名以及函數(shù)名與給定的字符串表達式相匹配的測試用例。 上面的用例會執(zhí)
         行TestMyClass.test_something但是不會執(zhí)行TestMyClass.test_method_simple
         and not 在這里是表達式,未經(jīng)過測試
         通過節(jié)點id來進行測試
         每個被選中的測試用例都會被分配一個唯一的nodeid,它由模塊文件名和以下說明符組成:參數(shù)化的
         類名、函數(shù)名和參數(shù),用::分隔。
         可以通過下面的方式運行模塊中的指定的測試用例:
             pytest test_mod.py::test_func
         也可以通過下面這種方式:
         pytest test_mod.py::TestClass::test_method
         通過標(biāo)記符來進行測試
         pytest ‐m slow
         這種方式會運行所有通過裝飾器 @pytest.mark.slow進行裝飾的測試用例。
         關(guān)于標(biāo)記符請參考marks
         通過包來運行
         pytest ‐‐pyargs pkg.testing
         這種方式會導(dǎo)入pkg.testing,并且基于該包所在為止來查找并運行測試用例。
         
     2.6詳盡的測試報告

         參數(shù)**-r**可以用來在測試結(jié)束后展示一份“測試概要信息”,這使得在大型測試套中獲取一份清楚
         的測試結(jié)果(失敗,跳過等測試信息)十分簡單。
         示例:
         #test_example.py的內(nèi)容
         import pytest
         @pytest.fixture
         def error_fixture():
         assert 0
         def test_ok():
          print("ok")
         def test_fail():
         assert 0
         def test_error(error_fixture):
          pass
         def test_skip():
         pytest.skip("skipping this test")
         def test_xfail():
         pytest.xfail("xfailing this test")
         @pytest.mark.xfail(reason="always xfail")
         def test_xpass():
         pass
          C:\>pytest ‐ra
          
          
     2.7 測試失敗時自動調(diào)用PDB
         pytest允許通過命令行使能在測試失敗時自動調(diào)用python的內(nèi)置調(diào)試工具PDB:
             pytest ‐‐pdb
         這會在每次測試失敗(或者發(fā)生KeyboardInterrupt)的時候都去調(diào)用PDB。通常我們可能只需要在第
         一次測試失敗的時候來調(diào)用pdb:
             pytest ‐x ‐‐pdb       #首次失敗的時候調(diào)用pdb,然后結(jié)束測試進程
              pytest ‐‐pdb ‐‐maxfail=3    #前三次失敗的時候調(diào)用pdb
              
         注意所有的異常信息都會保存在sys.last_value, sys.last_type和sys.last_traceback中。 在交互使用
         中,這允許使用任何調(diào)試工具進入后期調(diào)試。我們也可以手動的訪問這些異常信息,如下:
         (Pdb) import sys
         (Pdb) sys.last_traceback.tb_lineno
         1448
         (Pdb) sys.last_value
         AssertionError('assert 0')
         (Pdb) sys.last_type
         <class 'AssertionError'>
         
         
     2.8 測試啟動時調(diào)用PDB
         pytest允許在測試啟動時立即調(diào)用pdb:
        pytest ‐‐trace
        這會在每個測試開始時立即調(diào)用python的pdb
        
        
     2.9 設(shè)置斷點
         在代碼中使用python的原生接口**python import pdb; pdb.set_trace()**來設(shè)置斷點,在pytest中
         會自動禁用該測試的輸出捕獲:
         *其他測試的輸出捕獲不會受影響
         *先前的測試中已經(jīng)被捕獲的輸出會被正常處理
         *同一測試中的后續(xù)輸出不會被捕獲,而被轉(zhuǎn)發(fā)給sys.stdout。注意即使退出交互式pdb繼續(xù)運行測
         試,這一設(shè)置依然生效
         
         
     2.10分析測試時間
             pytest.main()
         這和在命令行中使用pytest是一樣的, 這種方式不會拋出SystemExit異常,而會返回exitcode, 通
         過如下方式可以傳入調(diào)用參數(shù):
             pytest.main(['‐x', 'mytestdir'])
         你可以在pytest.main中指定額外的插件:
         # myinvoke.py的內(nèi)容
             import pytest
             class MyPlugin(object):
                 def pytest_sessionfinish(self):
                     print("*** test run reporting finishing")
             pytest.main(["‐qq"], plugins=[MyPlugin()])
             
         運行代碼就可以發(fā)現(xiàn)MyPlugin被添加到hook里并被調(diào)用:
         C:\>python myinvoke.py

         **注意:**調(diào)用pytest.main()會導(dǎo)入你的測試用例及其所引用的所有的模塊。因為python存在模塊導(dǎo)
         入的緩存機制,如果多次調(diào)用pytest.main(),后續(xù)的調(diào)用也不會再刷新這些導(dǎo)入的資源。因此,不建
         議再同一進程中多次調(diào)用pytest.main() (比如重新運行測試).
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容