天天看點

測試開發必知必會:Pytest架構實戰

作者:碼同學軟體測試

每天進步一點點,關注我們哦,每天分享測試技術文章

本文章出自【碼同學軟體測試】

碼同學公衆号:自動化軟體測試

碼同學抖音号:小碼哥聊軟體測試

應用場景:

pytest 架構可以解決我們多個測試腳本一起執行的問題。

它提供了測試用例的詳細失敗資訊,使得開發者可以快速準确地改正問題。它相容最新版本的 Python。它還相容 unittest、doctest 和 nose,開箱即用。接下來我們詳細了解下pytest架構。

01

安裝和介紹

概念:

pytest 是 python 的一種單元測試架構,同自帶的 Unittest 測試架構類似,相比于 Unittest 架構使用起來更簡潔,效率更高

官網:https://docs.pytest.org/en/latest/

中文文檔位址:https://www.osgeo.cn/pytest/

01

特點和書寫規則

特點:

  • 非常容易上手,入門簡單,文檔豐富,文檔中有很多執行個體可以參考
  • 支援簡單的單元測試和複雜的功能測試
  • 支援參數化
  • 執行測試過程中可以将某些測試跳過,或者對某些預期失敗的 Case 标記成失敗 支援重複執行失敗的 Case
  • 支援運作由 Nose, Unittest 編寫的測試 Case
  • 具有很多第三方插件,并且可以自定義擴充
  • 友善的和持續內建工具內建

安裝:

通過pip指令安裝指定版本

pip3 install pytest==5.4.3           

pytest是python的第三方測試架構,是基于unittest的擴充架構,比unittest更簡潔,更高效。

使用 pytest編寫用例,必須遵守以下規則:

測試檔案名必須以“test”開頭或者"test"結尾(如:test_ab.py)

測試方法必須以“test”開頭。test*.py 或 *test.py

測試類命名以“Test”開頭。用例識别:包含所有test_*的方法(測試類不能帶有— init—方法)

斷言使用基本的assert即可

使用 pytest 需要更改 pycharm 內建設定
Pytest 可以執行 uinttest 寫的用例和方法           

02

運作方式

運作方式分為兩種

  • 指令行模式【建議】
  • 主函數模式

指令行模式【建議】

測試開發必知必會:Pytest架構實戰
指令行中執行 pytest -s test_demo01.py           

主函數模式

import pytest
class Test:def test_case01(self):print(1)
def test_case02(self):print(2)# 主函數執行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])           

在 test_demo01.py檔案中增加主函數

-s 表示支援控制台列印,如果不加,print 不會出現任何内容

運作結果

  • . 表示成功
  • F 表示失敗
小結:建議使用指令行的形式運作,對比主函數模式更加友善

03

setup 和 teardown

pytest 在運作自動化腳本的前後會執行兩個特殊的方法,分别是 setup 和 teardown 在執行腳本之前會執行 setup方法,在執行腳本之後會執行 teardown 方法,我們可以在 setup 中進行擷取驅動對象的操作,在teardown 中進行關閉驅動對象的操作

應用場景:

函數級别方法

運作于測試方法的始末,運作一次測試函數會運作一次 setup 和teardown。

示例代碼

import pytestclass Test:
def setup(self):print('test--->setup')def teardown(self):print('test--->teardown')def test_case01(self):print('test--->1')
def test_case02(self):print('test--->2')
# 主函數執行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])           

執行結果

示例代碼

import pytestclass Test:
def setup_class(cls):print('test--->setupcls')def teardown_class(cls):print('test--->teardowncls')def test_case01(self):print('test--->1')
def test_case02(self):print('test--->2')
# 主函數執行if __name__ == '__main__':pytest.main(['-s','test_demo01.py'])           

執行結果

測試開發必知必會:Pytest架構實戰

02

Pytest-常用插件

插件清單網址: https://plugincompat.herokuapp.com包含很多插件包,大家可依據工作的需求選擇 使用。

01

Pytest-html測試報告

應用場景

自動化測試腳本最終執行是通過還是不通過,需要通過測試報告進行展現

使用指令進行安裝 指定版本

pip install pytest-html=2.1.1
           

執行指令

pytest test_login.py --html=report.html
           

檢視報告

測試開發必知必會:Pytest架構實戰

報告展示:

02

控制函數執行順序

應用場景:

現實生活中,如果想下訂單,必須先登入,我們可以通過插件的形式來控制函數執行的順序 安裝
使用指令 pip3 install pytest-ordering
           
  • 标記于被測試函數,@pytest.mark.run(order=x)
  • 根據order傳入的參數來解決運作順序
  • order值全為正數或全為負數時,運作順序:值越小,優先級越高
  • 正數和負數同時存在:正數優先級高

示例代碼

import pytest

class Test:
def test_case01(self):print('test--->001')
@pytest.mark.run(order=2)def test_case02(self):print('test--->002')
@pytest.mark.run(order=1)def test_case03(self):print('test--->003')           

執行結果

03

失敗重試

免費領取 碼同學軟體測試 課程筆記+超多學習資料+完整視訊+最新面試題,可以轉發文章 + 私信「碼同學666」擷取資料哦

應用場景:

由于網絡的原因造成自動化腳本報錯,我們可以使用失敗重試的插件,當失敗後嘗試再次運作,一般情況最終成功可以視為成功,但最好進行進行排查時候是腳本問題
使用指令pip3install pytest-rerunfailures 進行安裝使用           

在配置檔案中的指令行參數中增加 -- reruns n

pytest  -s test_demo2.py --reruns 3
           

示例代碼

class Test:
def test_a(self):assert 1,1 # 斷言成功
def test_b(self):print('失敗')assert 0,1 # 斷言失敗           

運作結果

測試開發必知必會:Pytest架構實戰

R 表示重試

注意重試時,如果腳本通過,那麼後續不再重試

03

pytest進階用法

01

跳過測試函數

應用場景:

同一個軟體在不同的裝置上可能會有不同的效果,比如,iOS 的 3d touch 操作是需要 6s 以上裝置支援 的,6 和 6s 都可以安裝同一款應用,如果裝置不支援,那麼根本沒有必要去測試這個功能。此時,我們可以 讓這種函數進行跳過

使用方式:

在需要跳過的測試腳本之上加上裝飾器 @pytest.mark.skipif(condition, reason="xxx")

condition

reason

跳過的條件,必傳參數

标注原因,必傳參數

示例代碼:

class Test:
def test_a(self):assert 1,1 # 斷言成功@pytest.mark.skipif(condition=True,reason='x')def test_b(self):print('失敗')assert 0,1 # 斷言失敗           

執行結果

測試開發必知必會:Pytest架構實戰

02

預期失敗

應用場景:

舉例,測試手機号碼輸入框長度為11位數字,如果我們傳入一個 12 位數字,此時可以使用預期失敗
@pytest.mark.xfail(condition=None, reason=None, raises=None, run=True, strict=False)
           
  • condition 跳過條件,必填參數
  • reason 标注原因,必填參數

使用方式:

在需要标記預期失敗的測試腳本之上加上裝飾器示例

示例代碼:

class Test:
def test_a(self):print('-----testa')assert 1,1 # 斷言成功
@pytest.mark.xfail(condition=True,reason='x')def test_b(self):print('-----testb')assert 0,1 # 斷言失敗
@pytest.mark.xfail(condition=True, reason='x')def test_c(self):print('-----testc')assert 0, 2  # 斷言失敗           

執行結果:

測試開發必知必會:Pytest架構實戰

x 表示預期失敗結果失敗 不算是bug,X 表示預期失敗結果成功 算是bug

03

資料參數化

應用場景:

登入功能都是輸入使用者名,輸入密碼,點選登入。但登入的使用者名和密碼如果想測試多個值是沒有辦法 用普通的操作 實作的。資料參數化可以幫我實作這樣的效果。

方法名:

@pytest.mark.parametrize(argnames, argvalues, indirect=False, ids=None, scope=None)
           
  • argnames 參數名
  • argvalues 參數對應值,類型必須為可疊代類型,一般使用list

一個參數使用方式

  • argnames 為字元串類型,根據需求決定何時的參數名
  • argvalues 為清單類型,根據需求決定清單元素中的内容
  • 在測試腳本中,參數,名字與 argnames 保持一緻
  • 在測試腳本中正常使用

argvalues 清單有多少個内容,這個腳本就會運作幾次

示例代碼:

class Test:
@pytest.mark.parametrize('age',[18,19,23,21])def test_01(self,age):print(age)           

執行結果:

測試開發必知必會:Pytest架構實戰

多個參數:

class Test:
@pytest.mark.parametrize(('name','age'),[('zhangsan',18),('lisi',19)]) def test_01(self,name,age):print(name,age)           

執行結果:

測試開發必知必會:Pytest架構實戰

04

Pytest-fixture

應用場景:

fixture 修飾器來标記固定的工廠函數,在其他函數,類調用它時會被激活并優先執行,通常會被用于完成預置處理和重複操作

使用方式:

  • 通過函數引用

示例代碼:

class Testlogin:
@pytest.fixture()def test_login(self):print('登入操作')uname = 'lily'return uname
def test_a(self,test_login):print(f'test_a {test_login}')
def test_b(self):print('不需要登入操作')           

運作結果:

測試開發必知必會:Pytest架構實戰

免費領取碼同學軟體測試課程筆記+超多學習資料+學習完整視訊,可以關注我們公衆号哦:自動化軟體測試

本文著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。

繼續閱讀