Pytest學習筆記

Pytest特點

Pytest是Python的一個第三方單元測試庫。它的目的是讓單元測試變得更容易,並且也能擴展到支持應用層面複雜的功能測試。

Pytest的特點有:

  • 入門簡單,易上手,文檔豐富
  • 支持用簡單的assert語句實現豐富的斷言,無需複雜的self.assert*函數
  • 支持參數化
  • 自動識別測試模塊和測試函數
  • 執行測試過程中可以將某些測試跳過(skip),或者對某些預期失敗的case標記成失敗
  • 支持重複執行(rerun)失敗的 case
  • 模塊化夾具用以管理各類測試資源
  • 對 unittest 完全兼容
  • 可以很好的和jenkins集成
  • 豐富的插件生態,有各式各樣的插件,社區繁榮

快速入門

安裝pytest

使用 pip 進行安裝:

pip install pytest

安裝之後查看版本:

pytest --version

快速開始

1.創建測試函數

Pytest 使用 Python 的 assert 進行條件判斷,最簡單的測試函數如:

# testdemo.py

def test_passing():
	assert(1,2,3) ==(1,2,3)

2.運行測試函數

在當前文件目錄使用命令pytest運行測試函數:

image-20210616223825437

3.pytest運行規則

pytest會查找當前目錄及其子目錄下以test_開頭的文件或以_test結尾的文件,找到文件後,執行文件中以test開頭的 函數

4.創建測試類

# test_class.py

class TestClass:
	def test_a(self):
    x = "hello"
    assert "h" in x
  def test_b(self):
    x = "hello"
    assert "a" in x

在當前文件目錄使用命令pytest運行測試:

image-20210617002840628

第一次測試通過,第二次測試失敗。 可以在斷言中查看失敗的原因

Pytest執行用例命令行參數

除了pytest命令,pytest還提供了很多執行用例的命令行參數,如下:

1.-v

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

image-20210617141445528

2.-s

輸出用例中的調式信息,比如print的打印信息等,我們在之前的test_class.py第3行加上一句 print(「測試調試信息」)

# test_class.py

class TestClass:
	def test_a(self):
		print("測試調試信息")
    x = "hello"
    assert "h" in x
  def test_b(self):
    x = "hello"
    assert "a" in x

再執行一次用例看看

image-20210617141824233

3.-m

執行被標記的測試用例

我們修改test_class.py文件如下:

# test_class.py

import pytest
class TestClass:
	def test_a(self):
		print("測試調試信息")
    x = "hello"
    assert "h" in x
    
  @pytest.mark.run_this_case
  def test_b(self):
    x = "hello"
    assert "a" in x

使用命令 pytest -m run_this_case test_calss.py執行

image-20210617144012907

可以看到只執行了被標記的用例

4.-k

執行用例包含「關鍵字」的用例

我們修改test_class.py文件如下:

# test_class.py

import pytest
class TestClass:
	def test_a(self):
		print("測試調試信息")
    x = "hello"
    assert "h" in x
    
  def test_b(self):
    x = "hello"
    assert "a" in x
    
  def test_rock(self):
    x = "rock"
    assert "o" in x

使用命令 pytest -k "rock" test_class.py執行

image-20210617144500945

5.-q

簡化控制台的輸出,可以看到輸出信息和上面的結果都不一樣, 下圖中有三個.代替了pass結果

image-20210617145043766

6.–collect-only

羅列出所有當前目錄下所有的測試模塊,測試類及測試函數

image-20210617145514237

7.–tb=style

執行用例的時候,有些用例執行失敗的時候,屏幕上會出現一大堆的報錯內容,不方便快速查看是哪些用例失敗,--tb=style可以屏蔽測試用例執行輸出的回溯信息,可以簡化用例失敗時的輸出信息, style的選項有[‘auto’, ‘long’, ‘short’, ‘no’, ‘line’, ‘native’], 具體區別如下:

–tb=auto 有多個用例失敗的時候,只打印第一個和最後一個用例的回溯信息
–tb=long 輸出最詳細的回溯信息
–tb=short 輸入assert的一行和系統判斷內容
–tb=line 使用一行顯示錯誤信息
–tb=native 只輸出python標準庫的回溯信息
–tb=no 不顯示回溯信息

8.–lf和–ff

–last-failed 只重新運行上次運行失敗的用例(或如果沒有失敗的話會全部跑)

–failed-first 運行所有測試,但首先運行上次運行失敗的測試(這可能會重新測試,從而導致重複的fixture setup/teardown)

我們修改test_class.py文件如下:

# test_class.py

import pytest
class TestClass:
	def test_a(self):
		print("測試調試信息")
    x = "hello"
    assert "h" in x
    
  def test_b(self):
    x = "hello"
    assert "a" in x
    
  def test_rock(self):
    x = "rock"
    assert "o" in x
    
  def test_c(self):
    x = "world"
    assert "q" in x

使用命令pytest執行全部用例,結果如下:

image-20210617151647993

可以看到執行了4條用例,失敗了2條

然後使用命令pytest --lf,執行失敗的用例,結果如下:

image-20210617151841294

可以看到只執行了兩條失敗的用例

最後我們使用命令pytest --ff,先執行失敗的用例,再執行成功的用例,結果如下:

image-20210617152006219

可以看到先執行了2條失敗的用例,然後執行了2條成功的用例

以上就是命令行運行測試用例時經常使用到的參數,這些參數不僅可以單獨使用,也可以組合一起使用,可以使用--help來查看更多命令的幫助信息

Pytest收集測試用例的規則

  • 從一個或者多個目錄開始查找,你可以在命令行指定文件或者目錄,如果未指定那麼從當前目錄開始收集用例
  • 在該目錄和所有子目錄下遞歸查找測試模塊
  • 測試模塊是指文件名為test_.py或者_test.py的文件
  • 在測試模塊中查找以test_開頭的函數
  • 查找名字以Test開頭的類。其中首先篩選掉包含__init__()函數的類,再查找類中以Test_開頭的類方法

規則驗證

我們按照以下目錄結構新建一個項目

image-20210617155429499

代碼如下:

case01.py

# case01.py# 測試函數def test_02():    assert 1 == 1# 普通函數def func():    assert 1 == 1

test_01.py

# test_01.py# 測試函數def test_01():    assert 1 == 1# 普通函數def func_01():    print("這是一個普通函數")# 測試類class TestClass_01(object):    # 測試函數    def test_class_1(self):        assert 1 == 1    # 普通函數    def func_class_1(self):        assert 1 == 1# 普通類class NoTestClass_02(object):    # 測試函數    def test_class_2(self):        assert 1 == 1    # 普通函數    def func_class_2(self):        assert 1 == 1

case.py

# 測試函數def test_02():    assert 1 == 1# 普通函數def func():    assert 1 == 1

在項目根目錄下執行pytest --collect-only,結果如下:

image-20210617160120440

可以看到,只有2條有效的測試用例

使用pytest -v命令執行用例,結果如下:

image-20210617160637211

只有test_01.py被識別為測試模塊