一、簡介
pytest是python的一種單元測試框架,與python自帶的unittest測試框架類似,但是比unittest框架使用起來更簡潔,效率更高。
二、安裝
安裝方法:
1 pip install -U pytest
安裝成功,查詢安裝的版本號
1 pytest --version
pytest常用的插件
pytest-selenium 集成 selenium
pip install allure-pytest 生成漂亮的allure測試報告
pip install pytest-sugar 優化運行效果
pip install pytest-rerunfailures 執行用例失敗后重新運行
pip install pytest-xdist 多線程並行與分布式執行
pip install pytest-assume 多條斷言前面報錯后面依然執行
pip install pytest-cover 測試覆蓋率
三、Demo
新建test_one.py,輸入以下代碼,cmd至文件目錄下,輸入pytest運行
1 def func(x): 2 return x + 1 3 def test_answer(): 4 assert func(3) == 5 5 #assert func(3) == 4
運行pytest命令,或py.test命令,或python –m pytest命令。(pytest的三種運行方式)
用例不通過與用例通過的結果展示,如下圖所示。
四、用例設計原則
- 文件名以test_*.py文件*_test.py
- 測試類以Test開頭,並且不能帶有init方法
- 以test_開頭的函數
- 以Test開頭的類
- 以test_開頭的方法
- 所有的包pakege必須要有__init__.py文件
- 斷言使用assert
五、斷言
pytest允許你使用標准Python斷言來驗證Python測試中的期望值。
常用斷言
pytest里面斷言實際上就是python里面的assert斷言方法,常用的有以下幾種:
assert xx 判斷xx為真
assert not xx 判斷xx不為真
assert a in b 判斷b包含a
assert a == b 判斷a等於b
assert a != b 判斷a不等於b
六、裝飾器
pytest.mark.skip 可以標記無法在某些平台上運行的測試功能,或者希望失敗的測試功能。
skip if意味着在不滿足某些條件時才希望測試通過,否則 pytest應該跳過運行測試。 常見示例是在非 Windows 平台上跳過僅限Windows 的測試,或跳過測試依賴於當前不可用的外部資源。
xfail 意味着你希望測試由於某種原因而失敗。 一個常見的例子是對功能的測試尚未實施,或尚未修復的錯誤。。
skip
跳過測試函數的最簡單方法是使用跳過裝飾器標記它,可以傳遞一個可選的原因。
例:
@pytest.mark.skip(reason=“本輪測試不執行此用例")
def test_the_unknown():
skipif
如果你希望有條件地跳過某些內容,則可以使用 skipif 代替。
例:
import sys
@pytest.mark.skipif(sys.version_info < (3,6),
reason="requires python3.6 or higher")
自定義標記 mark
pytest 可以支持自定義標記,自定義標記可以把一個 web 項目划分多個模塊,然后指定模塊名稱執行。
@pytest.mark.webtest
def test_send_http():
如果不想執行標記 webtest 的用例,那就用”not webtest”
七、Fixture
unittest 的都知道里面用前置和后置 setup 和 teardown 非常好用,在每次用例開始前和結束后都去執行一次。
setupClass 和 teardownClass,需配合@classmethod 裝飾器一起使用。
用例運行級別
- 模塊級(setup_module/teardown_module)開始於模塊始末,全局的
- 函數級(setup_function/teardown_function)只對函數用例生效(不在類中)
- 類級(setup_class/teardown_class)只在類中前后運行一次(在類中)
- 方法級(setup_method/teardown_method)開始於方法始末(在類中)
- 類里面的(setup/teardown)運行在調用方法的前后
運行的優先級
setup_class>setup_method>setup >用例>teardown> teardown_method>teardown_class
函數和類混合
如果一個.py 的文件里面既有函數用例又有類和方法用例,運行順序如下:
setup_module/teardown_module 的優先級是最大的。
函數里面用到的 setup_function/teardown_function和類里面的 setup_class/teardown_class 互不干涉
Fixture優勢
命名方式靈活,不局限於setup和teardown這幾個命名
conftest.py 配置里可以實現數據共享,不需要import就能自動找到一些配置
scope=”module” 可以實現多個.py跨文件共享前置
scope=”session” 以實現多個.py跨文件使用一個session來完成多個用例
1 fixture(scope="function", params=None, autouse=False, ids=None, name=None): 2 """使用裝飾器標記fixture的功能 3 可以使用此裝飾器(帶或不帶參數)來定義fixture功能。 fixture功能的名稱可以在以后使用 4 引用它會在運行測試之前調用它:test模塊或類可以使用pytest.mark.usefixtures(fixturename標記。 5 測試功能可以直接使用fixture名稱作為輸入參數,在這種情況下,夾具實例從fixture返回功能將被注入。 6 7 :arg scope: scope 有四個級別參數 "function" (默認), "class", "module" or "session". 8 9 :arg params: 一個可選的參數列表,它將導致多個參數調用fixture功能和所有測試使用它 10 11 :arg autouse: 如果為True,則為所有測試激活fixture func 可以看到它。 如果為False(默認值)則顯式需要參考來激活fixture 12 13 :arg ids: 每個字符串id的列表,每個字符串對應於params 這樣他們就是測試ID的一部分。 如果沒有提供ID它們將從params自動生成 14 15 :arg name: fixture的名稱。 這默認為裝飾函數的名稱。 如果fixture在定義它的同一模塊中使用,夾具的功能名稱將被請求夾具的功能arg遮蔽; 解決這個問題的一種方法是將裝飾函數命名 16 “fixture_ <fixturename>”然后使用”@ pytest.fixture(name ='<fixturename>')“”。
參數解析
fixture(scope="function", params=None, autouse=False,ids=None, name=None):
scope 有四個級別參數:function, class、Module、session
params: 一個可選的參數列表,它將導致多個參數調用fixture 功能和所有測試使用它。
autouse: 如果為 True,則為所有測試激活 fixture func 可以看到它。 如果為 False(默認值)則顯式需要參考來激活 fixture
每個字符串 id 的列表,每個字符串對應於 params 這樣他們就是測試 ID 的一部分。 如果沒有提供 ID 它們將從 params 自動生成。
name: fixture 的名稱。 這默認為裝飾函數的名稱。
conftest.py配置
conftest.py 配置腳本名稱是固定的,不能改名稱
conftest.py 和運行的用例要在同一個 pakage 下,並且有__init__.py 文件
不需要 import 導入 conftest.py, pytest 用例會自動查找
yield 執行 teardown
yield:提供fixture 里面的 teardown 功能,用 yield 來喚醒teardown的執行
yield 遇到異常
1.如果其中一個用例出現異常,不影響 yield 后面的 teardown 執行,運行結果互不影響,並且全部用例執行完成后, yield 呼喚 teardown操作。
2.如果在 setup 就異常了,那么是不會去執行 yield 后面的teardown 內容了。
3.yield 也可以配合 with 語句使用。
Fixture參數化
pytest.mark.parametrize 裝飾器可以實現測試用例參數化 它也可以標記單個測試實例在參數化 參數組合 若要獲得多個參數化參數的所有組合,可以堆疊參數化裝飾器
參考:
官方文檔翻譯教程:https://www.cnblogs.com/superhin/p/11677240.html
簡約教程:https://mp.weixin.qq.com/s/2ER7iEshVs3GPlOlwji4tw
官方API英文:https://docs.pytest.org/en/latest/reference.html