程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python pytest測試框架詳解

編輯:Python

pytest介紹:
pytest是一個非常成熟的全功能的Python測試框架:
1.簡單靈活,容易上手
2.支持參數化
3.測試用例的skip和xfail,自動失敗重試等處理
4.能夠支持簡單的單元測試和復雜的功能測試,還可以用來做selenium/appnium等自動化測試、接口自動化測試(pytest+request)
5.pytest具有很多第三方插件,並且可以自定義擴展,比較好用的如pytest- allure(完美html測試報告生成)、pytest-xdist(多CPU分發)等
6.可以很好的和jenkins集成

安裝pytest:pip install -U pytest 其中-U是對pytest進行更新 pytest – version:查看版本號
測試用例的識別與運行:
識別:
測試文件:
1.test_.py
2.
test.py
用例識別:
1.Test*類包含的所有test
*的方法(測試類不能有__init__方法)
2.不在class中的所有test_*方法
pytest也可以執行unittest框架寫的用例和方法
運行:
pytest -v :可以運行出詳細的日志信息
pytest -s :可以打印出測試用例用print的內容
pytest 文件名.py::類名 :運行某個模塊裡面的類
pytest 文件名.py::類名::方法名 :運行某個模塊裡面的某個類的方法
pytest -v -k"類名 and not 方法名":跳過運行某個用例
pytest -m[標記名]:@pytest.mark.[標記名]將運行有這個標記的測試用例
pytest -x 文件名:一旦運行到報錯就停止運行
pytest --maxfail=[num]:當運行錯誤達到num的時候就停止運行

pytest執行-失敗重新運行:
場景:測試失敗後要重新運行n次,要在重新運行之間添加延遲時間,間隔n秒在運行
安裝:pip install pytest-rerunfailures
執行:
1.pytest – reruns 3 -v -s test_class.py(設置重新運行n次)
2.pytest -v – reruns 5 --reruns-delay 1(設置延遲時間)
pytest執行-多條斷言有失敗也都運行
場景:一個方法中寫多條斷言,通常第一條過不去,下面就不執行了,我們想報錯也都執行一下
安裝:pip install pytest-assume
執行:
1.pytest.assume(1==4)

2.pytest.assume(2==4)

pytest框架結構
import pytest 類似的setup,teardown同樣更靈活
1.模塊級(setup_module/teardown_module)模塊始末,全局的(優先最高)
2.函數級(setup_function/teardown_function)只對函數用例生效(不在類中)
3.類級(setup_class/teardown_class)只在類中前後運行一次(在類中)
4.方法級(setup_method/teardown_method)開始於方法始末(在類中)
5.類裡面(setup/teardown)運行在調用方法的前後

pytest-fixtrue的用法
場景:
1.用例1需要先登錄
2.用例2不需要登錄
3.用例3需要登錄
這種場景無法用setup和teardown實現
用法:在方法前面加@pytest.fixture()
場景:測試用例執行時,有的用例需要登陸才能執行,有些用例不需要登陸,setup和teardown無法滿足。fixture可以,默認scope(范圍)function
步驟:
1.導入pytest
2.在登錄的函數前面加@pytest.fixture()
3.在要使用的測試方法中傳入(登陸函數名稱),就先登錄
4.不傳入的就不登錄直接執行測試方法
前端自動化中應用-conftest
場景:你與其他測試工程師合作一起開發時,公共模塊要在不同文件下,要在大家都能訪問到的地方
解決:conftest.py這個文件進行數據共享,並且他可以放在不同位置起著不同范圍共享的作用
執行:系統執行到參數login時先從本文件中查找是否又這個名字的變量,之後在conftest.py中找是否有
步驟:將登陸模塊帶@pytest.fixture()寫在conftest.py中
conftest.py配置需要注意:
1.conftest文件名是不能換的
2.conftest.py與運行的用例要在同一個package下,並且有__init__文件
3.不需要import導入conftest.py文件,pytest用例會自動查找
4.全局的配置和前期工作都可以寫在這裡,放在某個包下,就是這個包共享的地方
前端自動化中應用-yieid
場景:你已經可以將測試方法前要執行或依賴的解決了,測試方法後銷毀清楚數據的要如何進行呢?范圍是模塊級別的。類似setupClass
解決:通過在同一模塊中加入yieid關鍵字,yield是調用第一次返回結果,第二次執行它下面的語句返回
步驟:在@pytest.fixture(scope=module)
在登錄的方法中加yieid,之後加銷毀清楚的步驟,注意,這種方式沒有返回值,如果希望返回使用addfinalizer
fixture的自動應用
場景:不想原測試方法有任何改動,或全部都自動實現自動應用,沒特例,也都不需要返回值時可以選擇自動應用
解決:使用fixture中參數autouse=True實現
步驟:
1.在方法上面加@pytest.fixture(autouse=True)
2.在測試方法上面加@pytest.mark.usefixtures(“start”)
autouse:可以把方法用到每一條測試用例中
fixture帶參數傳遞
場景:測試離不開數據,為了數據靈活,一般數據都是通過參數傳的
解決:fixture通過固定參數request傳遞
步驟:在fixture中增加@pytest.fixture(params=[1,2,3,‘linda’])在方法參數中寫request

@pytest.mark.skip(‘不執行此條case’):放在方法上面可以不執行此條用例
@pytest.mark.skipif(sys.platform==‘darwin’,reason=‘不在macOS執行’):通過判斷當前系統 給出不執行此條用例的原因

import pytest
# 方法名作為參數
test_user_data = ['jerry','Tome']
@pytest.fixture(scope='module')
def login_r(request):
# 這是接受並傳入的參數
user = request.param
print(f"\n 打開首頁准備登陸 登陸用戶{user}")
return user
@pytest.mark.skip('不執行此條測試用例')
# indirect=True,可以把傳過來的參數當作函數執行
@pytest.mark.parametrize("login_r",test_user_data,indirect=True)
def test_case01(login_r):
a = login_r
print(f"測試用例中login的返回值是:{a}")
assert a != ''
if __name__ == '__main__':
pytest.main()

skip使用場景
1.調試時不想運行這個測試用例
2.標記無法在某些平台上運行的測試功能
3.在某些版本中執行,其他版本中跳過
4.當前的外部資源不可用時跳過(如果測試數據是從數據庫中取到的,連接數據庫的功能如果返回結果未成功就跳過,因為執行也都報錯)
解決:
@pytest.mark.skip():跳過這個測試用例,可以加條件skipIf,在滿足某些條件下才希望通過,否則跳過這個測試
Xfail場景
1.功能測試尚未實施或尚未修復的錯誤,當測試通過時盡管預計會失敗(標記為pytest.mark.xfail),他是一個xpass將在測試摘要中報告
2.你希望測試由於某種情況而就應該失敗
解決:
@pytest.mark.xfail
使用自定義標記mark只執行某部分用例
場景:
1.只執行符合要求的某一部分用例,可以把一個web項目劃分為多個模塊,然後指定模塊名稱執行
2.App自動化時,如果想Android和IOS公用一套代碼時,也可以使用標記功能,表明哪些是IOS的用例,哪些是Android的運行時知道mark名稱運行就可以
解決:在測試用例方法上添加@pytest.mark.webtest
執行:
1.-s參數:輸出所用測試用例的print信息
2.-m:執行自定義標記的相關用例(使用命令執行)
pytest -s test.py -m=search
pytest -s test.py -m apptest
pytest -s test.py -m ‘not ios’
多線程並行與分布式執行
場景:測試用例1000條,一個測試用例執行一分鐘,一個測試人員執行需要1000分鐘,通常會用人力成本換取時間成本,加幾個讓人一起執行,時間就會縮短,如果10個人一起執行只需要1000分鐘,這就是一種並行測試,分布式場景。
解決:pytest分布式執行插件:pytest-xdist,多個cpu或主機執行 前提:用例之間都是獨立的,沒有先後順序,隨機都能執行,可重復執行不影響其他用例。
安裝:pip install pytest-xdist
多個CPU並行執行用例,直接-n 3是並行數量:pytest test.py -n 3
在多個終端下一起執行
pytest-html生成測試報告
安裝:pip install pytest-httml
生成測試報告:pytest -v -s --html=report.html --self-contained-html


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved