1. 程式人生 > 實用技巧 >pytest與unittest之間的故事

pytest與unittest之間的故事

unittest
-- 寫用例 - TestCase
-- 收集用例 -TestLoader.discover()
-- 生成報告 -HtmlTestRunner
-- 模板
pytest
-- 能夠執行unittest用例
-- 靈活

nose
behave - 行為驅動

共同點:
1、測試框架 - 通過python程式碼來編寫測試用例、收集用例、執行用例、生成報告。


pytest安裝:
pip install pytest

1、編寫用例上:
unitest: 繼承TestCase
pytest: 函式/類裡面的方法 -- 用例名稱必須以test_開頭。如果用例在類當中,類名必須以Test開頭。

前置後置:
unittest: setup/teardown setupClass,tearDownClass
pytest:
方案一:沿用了unittest的風格。
1、用例級別:setup,teardown -- 類和類外的用例都可以使用
2、類級別:setup_class teardown_class --- 類用
@classmethod
def setup_class(cls):
print(" 類 -- 前置 --")
3、模組級別:setup_module teardown_module

方案二:fixture

斷言:
unittest: self.assertXXXXX()
pytest: assert 表示式

2、收集用例和執行用例:
用例分散在多個檔案當中。
unittest: TestLoader.discover(目錄) - 收集到套件當中。run方法去執行。
pytest:
不需要寫任何程式碼去收集用例 - 自動收集/發現用例的方式。
執行用例的時候會自動收集:
pytest命令列:pytest [引數]

如何自動收集用例的?
1、目錄 - 從哪個目錄下開始搜尋用例。
rootdir: pytest命令在哪個目錄下執行,就以哪個目錄為rootdir.
2、檔名 - 命名符合test_*.py或者*_test.py條件的檔名,它裡邊兒是會有用例。
3、函式/類下方法 - 函式名以test_開頭
- 以Test開頭(不含__init__)的類下的test_開頭方法

收集並執行用例:
方式一:
命令列:pytest -s -v 控制檯顯示詳細的用例執行情況
方式二:
python檔案:pytest.main([命令列引數])

執行順序???:
1、檔名:ASCII
2、檔案內部:按程式碼先後順序


3、生成測試報告:
unittest: HtmlTestRunner、BeautifulReport
pytest: html-外掛
html插安裝命令:pip install pytest-html

allure-外掛
有非常多的外掛。allure-外掛 重執行-外掛


前置後置:
unittest:
setup/teardown
setup當中得到的變數,怎麼傳遞給測試用例的:self.XXX = value
setupClass,tearDownClass
setupClass當中得到的變數,怎麼傳遞給測試用例的:cls.XXX = value

fixture(pytest):

先定義再呼叫。

定義:
1、函式實現的,函式名稱不固定。 --- 如何知道它是前置後置?
@pytest.fixture
def fix():
pass

2、前置操作和後置操作,寫在一個函式裡。 -- 怎麼區分哪些是前置程式碼?後置程式碼?
@pytest.fixture
def fix():
前置程式碼
yeild # 分隔線
後置程式碼

3、4個作用域。測試函式(function)、測試類(class)、測試模組檔案(module)、測試會話(session)
@pytest.fixture(scope=function(預設值)/class/module/session)
def fix():
前置程式碼
yeild # 分隔線
後置程式碼

4、不跟測試類/測試函式放在一起。 ---如果說有測試類要用的話,怎麼辦?需要的時候再呼叫。


5、前置操作得到的一些資料,如何傳遞給測試用例?
yeild 返回值

在測試用例當中:以fixture函式名作為用例引數。用例引數接收返回值。
測試函式的引數:1、fixture 2、引數化



5、共享機制:conftest.py
conftest.py 定義fixture,可以定義多個。



呼叫:
用例/類 主動呼叫 fixtures.

哪兒需要哪兒調:

@pytest.mark.usefixtures("fixture的函式名稱")
測試類/測試函式

如果fixture有返回值,
那麼,將它作為測試函式的引數時,則可以不用使用: @pytest.mark.usefixtures("fixture的函式名稱")



官方文件:https://docs.pytest.org/en/stable/
pytest+allure整合:https://www.cnblogs.com/Simple-Small/p/11512337.html
pytest文章:https://www.cnblogs.com/Simple-Small/tag/pytest/