Pytest測試框架(一):pytest安裝及用例執行

測試開發小記發表於2021-01-01

PyTest是基於Python的開源測試框架,語法簡單易用,有大量的外掛,功能非常多。自動檢測測試用例,支援引數化,跳過特定用例,失敗重試等功能。

安裝

pip install -U pytest  # 安裝
pytest --version # 檢視版本
pytest -h # 檢視幫助資訊

用例識別

  • pytest識別檔名為test_.py或者_test.py的測試檔案
  • 測試檔案中可以在Test*類中寫測試用例(測試用例以test_*開頭,並且測試類不能有__init__方法)
  • 不在Test類中的test_用例也可以被識別到。

識別包含“add”的用例:

pytest -k "add" --collect-only

(base) D:\ProgramWorkspace\TestingDemo>pytest -k "add" --collect-only
============================================== test session starts ==============================================
platform win32 -- Python 3.7.6, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: D:\ProgramWorkspace\TestingDemo
plugins: hypothesis-5.5.4, arraydiff-0.3, astropy-header-0.1.2, doctestplus-0.5.0, openfiles-0.4.0, remotedata-0.3
.2
collected 20 items / 11 deselected / 9 selected                                                                  
<Package D:\ProgramWorkspace\TestingDemo\testing>
  <Module test_calc.py>
    <UnitTestCase TestCalc>
      <TestCaseFunction test_add_1>
      <TestCaseFunction test_add_2>
  <Module test_calc2.py>
    <Class TestCalc>
        <Function test_add[1-2-3]>
        <Function test_add[-1--2--3]>
        <Function test_add[0-1-1]>
        <Function test_add[0--1--1]>
        <Function test_add[0.1-0.2-0.3]>
        <Function test_add[999999-1000000-1999999]>
        <Function test_add_1>

列印檔案下所有用例:

pytest --collect-only

(base) D:\ProgramWorkspace\TestingDemo>pytest --collect-only
============================================== test session starts ==============================================
platform win32 -- Python 3.7.6, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: D:\ProgramWorkspace\TestingDemo
plugins: hypothesis-5.5.4, arraydiff-0.3, astropy-header-0.1.2, doctestplus-0.5.0, openfiles-0.4.0, remotedata-0.3
.2
collected 20 items                                                                                               
<Module test_pytest.py>
  <Function test_one>
  <Function test_two>
  <Function test_three>
<Module test_pytest2.py>
  <Class Test_Demo>
      <Function test_one>
      <Function test_two>
      <Function test_three>
<Package D:\ProgramWorkspace\TestingDemo\testing>
  <Module test_calc.py>
    <UnitTestCase TestCalc>
      <TestCaseFunction test_add_1>
      <TestCaseFunction test_add_2>
  <Module test_calc2.py>
    <Class TestCalc>
        <Function test_add[1-2-3]>
        <Function test_add[-1--2--3]>
        <Function test_add[0-1-1]>
        <Function test_add[0--1--1]>
        <Function test_add[0.1-0.2-0.3]>
        <Function test_add[999999-1000000-1999999]>
        <Function test_div[1-2-0.5]>
        <Function test_div[-1--2-0.5]>
        <Function test_div[0-1-0]>
        <Function test_div[1-0-0]>
        <Function test_div[0.1-0.2-0.5]>
        <Function test_add_1>

Pytest執行

一個簡單的測試用例test_pytest.py:

import pytest

def calc(a,b):
    return a + b

class TestDemo():
    def test_answer1(self):        
        assert calc(1, 1) == 2

    def test_answer2(self):        
        assert calc(2, 1) == 3
	
	@pytest.mark.answer3        
    def test_answer3(self):        
        assert calc(6, 6) == 12

if __name__=='__main__':
    pytest.main()

用例執行

# 執行test_pytest.py所有用例(模組)
pytest test_pytest.py 

# 執行test_pytest.py裡的TestDemo類
pytest test_pytest.py::TestDemo 

# 執行test_pytest.py裡的TestDemo類的test_answer2方法
pytest test_pytest.py::TestDemo::test_answer2

列印日誌資訊

# 列印詳細執行日誌資訊
pytest -v test_pytest.py 
pytest -s test_pytest.py

跳過某個用例

# 跳過執行某個用例
pytest -v -k "類名 and not方法名" 檔名
pytest -v -k "TestDemo and not test_answer2" test_pytest.py

執行某個標記的用例

# 將執行有這個標記的測試用例:@pytest.mark.[標記名]
pytest -m [標記名] 檔名
pytest -m answer3 test_pytest.py

報錯停止

# 一旦執行到報錯用例就停止執行
pytest -x 檔名
pytest -x test_pytest.py

# 當報錯達到num的時候就停止執行
pytest --maxfail=[num] 檔名
pytest --maxfail=[num] test_pytest.py

失敗重新執行

安裝 pytest-rerunfailures 外掛:

pip install pytest-rerunfailures

測試失敗後重新執行n次,在重新執行間延遲n秒再執行:

# 重新執行3次
pytest --reruns 3 -v -s test_pytest.py
# 重新執行5次,延遲1s
pytest --reruns 5 --reruns-delay 1 -v test_pytest.py

多條斷言

一個方法中有多條斷言,通常第一條失敗後下面就不執行了,pytest-assume外掛可以解決斷言失敗後繼續執行斷言的問題。

安裝

pip install pytest-assume

執行多條斷言:

# 寫法1
pytest.assume(x == y)
pytest.assume(True)
pytest.assume(False)

# 寫法2
with assume: assert calc(2, 1) == 4 
with assume: assert calc(2, 1) == 3 
with assume: assert calc(2, 2) == 3

修改測試用例test_pytest.py:

import pytest
from pytest import assume

def calc(a,b):
    return a + b

class TestDemo():
    def test_answer1(self):        
        assert calc(1, 1) == 2

    def test_answer2(self):
  		with assume: assert calc(2, 1) == 4
		with assume: assert calc(2, 1) == 3
		with assume: assert calc(2, 2) == 3
	
	@pytest.mark.answer3        
    def test_answer3(self):        
        assert calc(6, 6) == 12

if __name__=='__main__':
    pytest.main()

測試結果:

pytest.main()

除了在終端執行外,也可以通過pytest.main()來執行,pytest.main() 自動查詢當前目錄下以test_開頭的檔案或者以_test結尾的py檔案。

括號內可傳入執行引數,通過[]進行分割,[]內的多個引數通過逗號分割,所有的引數和pytest命令列方式一樣:

pytest.main(['-v', 'test_pytest.py']) # 執行test_pytest.py用例

或者直接在測試檔案最後寫如下程式碼,執行py檔案。

if __name__=='__main__':  
    pytest.main()   
    # pytest.main(['-v', 'test_pytest.py'])

更多pytest執行方法可參考官方文件:https://docs.pytest.org/en/latest/contents.html#toc

--THE END--

文章標題:Pytest測試框架(一):pytest安裝及用例執行
本文作者:hiyo
本文連結:https://hiyong.gitee.io/posts/install-pytest-and-run-test/
歡迎關注公眾號:「測試開發小記」及時接收最新技術文章!

相關文章