如果想從頭學起pytest,可以去看看這個系列的文章!
https://www.cnblogs.com/miki-peng/category/1960108.html
前言
目前有兩種純測試的測試框架,就是unittest和pytest。
unittest這個已經是老框架了並且廣為人知,很多人都是用它來做接口自動化或web自動化。它是python內嵌的測試框架,是標准庫,即python自帶的,安裝python以后可以直接導入。unittest提供了test cases、test suites、test fixtures、test runner相關的類,讓測試更加明確、方便、可控。
而pytest則是python的第三方庫,是基於unittest開發的擴展框架,需要獨立安裝,但要注意兼容性,不是一定要安裝最新版,最新版如果會與你的python版本不兼容,可能會存在安裝不成功,或者是某些庫的功能使用不了。pytest比unittest更簡潔,更高效:
- 📕 不需要像unittest需要使用TestSuite去收集、加載用例添加到測試套件再運行,它會自動發現用例自動執行
- 📘 使用assert斷言更簡潔:assert 表達式
- 📙 靈活運行指定的測試用例,可以給用例打上各種各樣的標簽,如:回歸、正向、冒煙
- 📔 可以將某些用例跳過(skip),或者對某些預期失敗的case標記成失敗
- 📒 fixture夾具靈活管理環境,可以指定哪些類、方法使用與否,功能相當於unittest的setup,teardown
- 📔 插件非常豐富,如returnfailures用例失敗重運行機制,allure更美觀的測試報告等
- 📘 較好的兼容性,支持運行unittest/nose編寫的測試用例
安裝
安裝:pip install -U pytest
查看版本:pytest --version
用例命名規則
發現用例規則
pytest是自動發現、收集、執行測試用例的,當你在哪個目錄下執行pytest.main()
指令,那么pytest就會自動發現當前目錄下所有符合規則的py文件,將這些文件當成測試用例文件,根據以下規則去發現用例:
🔸 模塊名: test_*.py
或者是 *_test.py
(即以test_開頭或_test結尾的py文件)
🔸類名:Test
開頭,且類里沒有__init__函數(否則容易報錯)
🔸方法名:test_
開頭

注意:pytest是以方法為單位發現用例的,因此,測試用例並不一定要以類的形式存在,可以直接以函數方法的形式存在;並且它是根據規則按順序匹配先:模塊 > > 類名 > > 方法名,如果你的方法名符合規則,但方法寫在一個不符合規則的類名或者模塊名下,那么該方法是不會被發現也不會被執行的。
# test_search.py
def login_test():
print(11111)
def test_login():
print(22222)
class TestClass:
def test_one(self):
print(33333)
def test_two(self):
print(44444)
def test3(self):
print(44444)
如上,會查找到3個測試用例,分別為test_login
、test_one
、test_two
。
自定義查找規則
我們還可以自定義查找的規則,但自定義的規則配置文件要放在你要運行的項目的根目錄下(見上圖),且配置文件要嚴格以pytest.ini命名,pytest.ini文件內容舉例如下:
[pytest] # 只能修改=右邊的值
python_files = demo_*.py # 模塊名以demo_開頭
python_functions = demo_* # 方法名以demo_開頭
python_classes = Demo* # 類名名以Demo開頭
運行方式
代碼形式
if __name__ == '__main__':
pytest.main() # 直接寫在py文件中運行,()里可以填寫運行的參數,也可以不寫
命令行的形式
在pycharm中調出控制台,輸入pytest
,會自動去搜索當前目錄下所有符合規則的測試用例,也可以指定運行某個文件,如:pytest start.py
。

或者使用windows的cmd命令行,但要先切換到項目的目錄下

pycharm運行
右擊選擇以pytest運行,但一次只能運行單個py文件,除非該文件中有pytest.main()
指令,才會去搜索所在目錄的所有測試用例。
運行前在模塊中右擊可以查看運行是否是以pytest形式運行:

若顯示是以unittest形式則會以unittest框架去運行,可以在設置中修改運行方式:

執行代碼
以下均為命令行中執行的pytest命令
- 直接執行,在當前目錄即子目錄搜索用例:
pytest
- 指定某個模塊:
pytest test_module.py
- 指定某個目錄及子目錄下的所有測試文件:
pytest testcase
- 指定某個模塊的某個方法,用兩個英文冒號分隔:
pytest test_module::test_function
- 指定某個模塊的某個類中的某個用例,用兩個英文冒號分隔:
pytest test_model.py::test_class::test_method
一些執行參數:
-q
:簡單打印執行日志,只打印測試用例的執行結果-s
:詳細打印執行日志-x
:遇到錯誤時停止測試--maxfail=num
:當用例錯誤個數達到指定數量時,停止測試-k
:匹配用例名稱- 執行用例名稱包含http的所有用例:pytest -s -k http start.py
- 排除用例名稱包含http的用例:pytest -s -k "not http" start.py
- 同時匹配不同的用例名稱:pytest -s -k "method or weibo" start.py
用例執行順序
unittest用例的執行順序是按照方法名的ASCII碼順序執行的,而pytest有自己內置的執行順序規則,一般是從上往下,即同一個py文件中,從上往下執行測試用例。