Python測試框架之pytest(一)


pytest是一個非常成熟的全功能的python測試框架,主要有以下幾個特點:

  • 簡單靈活,容易上手
  • 支持參數化
  • 能夠支持簡單的單元測試和復雜的功能測試,還可以用來做selenium/appium等自動化測試,接口自動化測試(pytest+request)
  • pytest具有很多第三方插件,並且可以自定義擴展,比較好用的如pytest-selenium(集成selenium)、pytest-html(完美html測試報告生成)、pytest-rerunfailures(失敗case重復執行)、pytest-xdist(多CPU分發)等
  • 測試用例的skip和xfail處理
  • 可以很好的和Jenkins集成
  • report框架----allure 也支持了pytest

1.Pytest安裝

  1. 安裝
pip install -U pytest

   2.驗證安裝

pytest --version #會展示當前自己安裝的版本

  

 

   3.pytest文檔

官方文檔:https://docs.pytest.org/en/latest/contents.html

在pytest框架中,有如下約束:

  • 所有的單測文件名都需要滿足test_*.py格式或*_test.py格式。
  • 在單測文件中,測試類以Test開頭,並且不能帶有 init 方法(注意:定義class時,需要以T開頭,不然pytest是不會去運行該class的)
  • 在單測類中,可以包含一個或多個test_開頭的函數。
  • 此時,在執行pytest命令時,會自動從當前目錄及子目錄中尋找符合上述約束的測試函數來執行。

  4. Pytest運行方式

 # file_name: test_abc.py
 import pytest # 引入pytest包
 def test_a(): # test開頭的測試函數
     print("------->test_a")
     assert 1 # 斷言成功
 def test_b():
     print("------->test_b")
     assert 0 # 斷言失敗
 if __name__ == '__main__':
        pytest.main(["-s","test_abc.py"]) # 調用pytest的main函數執行測試

  

 

  •  測試類主函數
pytest.main(["-s","test_abc.py"])
通過python代碼執行 pytest.main()
1.直接執行pytest.main() 【自動查找當前目錄下,以test_開頭的文件或者以_test結尾的py文件】
2.設置pytest的執行參數 pytest.main(['--html=./report.html','test_login.py'])【執行test_login.py文件,並生成html格式的報告】
main()括號內可傳入執行參數和插件參數,通過[]進行分割,[]內的多個參數通過‘逗號,’進行分割
運行目錄及子包下的所有用例  pytest.main(['目錄名'])
運行指定模塊所有用例  pytest.main(['test_reg.py'])
運行指定模塊指定類指定用例  pytest.main(['test_reg.py::TestClass::test_method'])  冒號分割

     
-m=xxx: 運行打標簽的用例
-reruns=xxx,失敗重新運行
-q: 安靜模式, 不輸出環境信息
-v: 豐富信息模式, 輸出更詳細的用例執行信息
-s: 顯示程序中的print/logging輸出
--resultlog=./log.txt 生成log
--junitxml=./log.xml 生成xml報告

  

  • 命令行模式
pytest 文件路徑/測試文件名
例如:pytest ./test_abc.py

  或者直接輸入pytest也可以執行

 

  5.Pytest Exit Code 含義清單

  • Exit code 0 所有用例執行完畢,全部通過
  • Exit code 1 所有用例執行完畢,存在Failed的測試用例
  • Exit code 2 用戶中斷了測試的執行
  • Exit code 3 測試執行過程發生了內部錯誤
  • Exit code 4 pytest 命令行使用錯誤
  • Exit code 5 未采集到可用測試用例文件

   6. 如何獲取幫助信息

  查看pytest版本

pytest --version

  顯示可用的內置函數參數

pytest --fixtures

  通過命令行插件幫助信息及配置文件選項

pytest --help

  7. 控制測試用例執行

在第N個用例失敗后,結束測試執行

pytest -x  #第01次失敗就停止測試
pytest --maxfail=2   #出現2個失敗就終止測試

  

# file_name: test_abc.py
import pytest # 引入pytest包
def test_a(): # test開頭的測試函數
     print("------->test_a")
     assert 1 # 斷言成功
def test_b():
     print("------->test_b")
     assert 0 # 斷言失敗
def test_c():
    print("------->test_c")
    assert 0  # 斷言失敗
def test_d():
    print("------->test_d")
    assert 0  # 斷言失敗
if __name__ == '__main__':
        pytest.main(["-s","test_abc.py"]) # 調用pytest的main函數執行測試

  

 

 

 通過node id指定測試用例

node id 由模塊文件名,分隔符,類名,方法名,參數構成

運行模塊中的指定用例

pytest test_mod.py::test_func:
pytest test_abc.py::test_a

 

運行模塊中的指定方法

pytest test_mod.py::TestClass::test_method :

pytest test_abc.py::Test_Class::test_c

 

import pytest
def test_a():
    assert 1
def test_b():
    assert 0
class Test_Class():
    def test_c(self):
        assert 1
if __name__ == '__main__':
        pytest.main(["-s","test_abc.py"])

  

 通過標記表達式執行

pytest -m slow

  這條命令會執行被裝飾器 @pytest.mark.slow 裝飾的所有測試用例

通過包執行測試

pytest --pyargs pkg.testing

  這條命令會自動導入包 pkg.testing,並使用該包所在的目錄,執行下面的用例。

8.多進程運行cases

當cases量很多時,運行時間也會變的很長,如果想縮短腳本運行的時長,就可以用多進程來運行。

安裝pytest-xdist:

pip install -U pytest-xdist

  運行模式:

pytest test_se.py -n NUM

  其中NUM填寫並發的進程數。

9.重試運行cases

在做接口測試時,有事會遇到503或短時的網絡波動,導致case運行失敗,而這並非是我們期望的結果,此時可以就可以通過重試運行cases的方式來解決。

安裝pytest-rerunfailures:

pip install -U pytest-rerunfailures

  運行模式:

pytest test_se.py --reruns NUM

  NUM填寫重試的次數。

10.顯示print內容

在運行測試腳本時,為了調試或打印一些內容,我們會在代碼中加一些print內容,但是在運行pytest時,這些內容不會顯示出來。如果帶上-s,就可以顯示了。

運行模式:

pytest test_se.py -s

  另外,pytest的多種運行模式是可以疊加執行的,比如說,你想同時運行4個進程,又想打印出print的內容。可以用:

pytest test_se.py -s -n 4

  11,pytest參數

1、-K EXPRESSION

執行某個關鍵字的用例
用例要匹配給出的表達式;使用python的語法,匹配的范圍是文件名、類名、函數名為變量,用and來區分

2、--maxfail=num

當錯誤個數到達給定數時,退出測試,這里就不列舉實例了,結果與-x類似

3、-m MARKEXPR

  只能運行有相應標識的測試用例,使用這個參數,測試用例要使用@pytest.mark.marker修飾

4、 -v, --verbose

詳細結果

5、-q, --quiet

 極簡結果顯示,簡化控制台的輸出,可以看出輸出信息和之前不添加-q不信息不一樣, 下圖中有兩個..點代替了pass結果

6、-s

輸入我們用例中的調式信息,比如print的打印信息等,我們在用例中加上一句 print(driver.title),我們再運行一下我們的用例看看,調試信息輸出

7、-V

可以輸出用例更加詳細的執行信息,比如用例所在的文件及用例名稱等

8、--junit-xml=path

輸出xml文件格式,在與jenkins做集成時使用

9、 --result-log=path

將最后的結果保存到本地文件中

注意:標黃的是經常使用的


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM