unittest:
import unittest
# 整個模塊開始前執行
def setUpModule():
print('模塊級別(setUpModule)開始')
# 整個模塊結束后執行
def tearDownModule():
print('模塊級別(tearDownModule)結束')
class Testcase(unittest.TestCase):
# 每個測試用例類開始前執行
@classmethod
def setUpClass(cls):
print('類級別(setUpClass)開始')
# 每個測試用例類結束后執行
@classmethod
def tearDownClass(cls):
print('類級別(tearDownClass)結束')
# 每條測試用例前執行
def setUp(self) -> None:
print('測試用例開始')
# 每條測試用例后執行
def tearDown(self) -> None:
print('測試用例結束')
# 編寫測試用例
def test_01(self):
print('測試用例01執行')
def test_02(self):
print('測試用例02執行')
if __name__ == '__main__':
unittest.main()
pytest:
import pytest
# 模塊級(setup_module/teardown_module): 作用域于模塊的開始與結束,不包含在類中
def setup_module():
print("1.模塊級別(setUpModule)開始")
def teardown_module():
print("1.模塊級別(tearDownModule)結束")
# 函數級(setup_function/teardown_function):作用域于函數的開始與結束,不包含在類中
def setup_function():
print("2.類外面函數級別(setup_function)開始")
def teardown_function():
print("2.類外面函數級別(teardown_function)結束")
def test_one():
print('test_one')
# ======================================================================================================================
class Testcase:
# 類級(setup_class/teardown_class):作用域類的開始與結束,僅在類中運行一次,包含在類中
def setup_class(self):
print("1.類里面,類級別(setup_class)開始")
def teardown_class(self):
print("1.類里面,類級別(teardown_class)開始")
# 方法級(setup_method/teardown_method): 作用域方法的開始與結束,包含在類中
def setup_method(self):
""" 和下面的 setup 方法一樣,二選一用"""
print("2-1.類里面,方法級別(setup_method)開始")
def teardown_method(self):
""" 和下面的 teardown 方法一樣,二選一用"""
print('2-1.類里面,方法級別(teardown_method)開始')
# 方法細化級別【兼容類里面的層級(setup/teardown):在每個調用方法前后運行】
def setup(self):
print("2-2.類里面,方法級別(setup)開始")
# 方法細化級別
def teardown(self):
print("2-2.類里面,方法級別(teardown)開始")
def test_01(self):
print('測試用例01執行')
# ======================================================================================================================
# 方法級別
@pytest.fixture(scope="function")
def test_1():
pass
# 類級別
@pytest.fixture(scope="class")
def test_2():
pass
# 模塊級別
@pytest.fixture(scope="module")
def test_3():
pass
# 包級別
@pytest.fixture(scope="package")
def test_4():
pass
# 會話級別
@pytest.fixture(scope="session")
def test_5():
pass
# ======================================================================================================================
# 鉤子函數
# conftest.py 作用范圍:在整個測試會話開始之前和結束之后執行。
def pytest_sessionstart(session):
print("\n會話開始前的全局設置(pytest_sessionstart)")
def pytest_sessionfinish(session, exitstatus):
print("\n會話結束后的全局清理(pytest_sessionfinish)")
# conftest.py 作用范圍:在測試收集完成之后和插件卸載(unconfigure)時執行。
def pytest_collection_finish(session):
print("\n測試收集完成后執行(pytest_collection_finish)")
def pytest_unconfigure(config):
print("\n插件卸載時執行(pytest_unconfigure)")
# conftest.py 作用范圍:在每個測試項(通常是一個測試函數或測試方法)執行前和執行后執行。
def pytest_runtest_setup(item):
print("\n每個測試項執行前的設置(pytest_runtest_setup)")
def pytest_runtest_teardown(item):
print("\n每個測試項執行后的清理(pytest_runtest_teardown)")
if __name__ == '__main__':
pytest.main(['-q', '-s', '-ra'])
使用鉤子函數:pytest_sessionstart / pytest_sessionfinish
conftest.py
import pytest
def pytest_sessionstart(session):
tl = Tools()
session.tl = tl
def pytest_sessionfinish(session, exitstatus):
if exitstatus == pytest.ExitCode.OK:
print("所有測試用例都通過了!")
elif exitstatus == pytest.ExitCode.TESTS_FAILED:
print("有測試用例失敗了。")
elif exitstatus == pytest.ExitCode.INTERRUPTED:
print("測試會話被用戶中斷。")
elif exitstatus == pytest.ExitCode.INTERNAL_ERROR:
print("pytest 內部錯誤。")
elif exitstatus == pytest.ExitCode.USAGE_ERROR:
print("pytest 命令行使用錯誤。")
elif exitstatus == pytest.ExitCode.NO_TESTS_COLLECTED:
print("沒有收集到任何測試用例。")
# 執行清理操作
session.tl.close()
test_demo1.py
@pytest.mark.parametrize("result", data)
def test_AI_AVATAR_COMPLEX(result, request):
tl = request.session.tl
使用鉤子函數:pytest_runtest_setup/ pytest_runtest_teardown
寫法一:
conftest.py
def pytest_sessionstart(session):
tl = Tools()
session.tl = tl
def pytest_runtest_setup(item):
tl = item.session.tl
item.tl = tl
test_demo1.py
@pytest.mark.parametrize("result", data)
def test_AI_AVATAR_COMPLEX(result, request):
tl = request.session.tl # 或者 tl = request.item.tl
寫法二:
conftest.py
def pytest_runtest_setup(item):
tl = Tools()
item.session.tl = tl
item.tl = tl
def pytest_runtest_teardown(item):
item.tl.close()
test_demo1.py
@pytest.mark.parametrize("result", data)
def test_AI_AVATAR_COMPLEX(result, request):
tl = request.session.tl
使用鉤子函數:pytest_collection_finish
conftest.py
def pytest_collection_finish(session):
tl = Tools()
session.tl = tl
test_demo1.py
@pytest.mark.parametrize("result", data)
def test_AI_AVATAR_COMPLEX(result, request):
tl = request.session.tl
鉤子函數的分類
初始化與配置階段
pytest_cmdline_main: 當從命令行運行pytest時被調用,是pytest的主入口點。
pytest_configure: pytest配置階段調用,用于設置測試環境。
pytest_plugin_registered: 當pytest插件注冊時調用。
pytest_report_header: 用于生成測試報告時的自定義標題。
pytest_addoption:用于向pytest的命令行解析器添加自定義選項。
pytest_sessionstart: 整個測試會話開始時調用。
用例收集階段
pytest_collect_file: 收集單個文件作為測試模塊時調用。
pytest_collect_directory: 收集目錄作為測試模塊時調用。
pytest_collect_module: 收集Python模塊作為測試模塊時調用。
pytest_collect_item: 收集單個測試項(如函數、方法或類)時調用。
pytest_generate_tests: 生成測試用例時調用,常用于參數化。
pytest_make_parametrize_id: 為參數化測試生成ID時調用。
pytest_collection_modifyitems: 修改已收集的測試用例項時調用。
pytest_collection_finish: 用例收集階段結束時調用。
用例準備與執行階段
pytest_runtest_protocol: 開始執行單個測試項之前調用,用于設置執行協議。
pytest_runtest_setup: 在執行測試項之前設置fixture和其他準備工作時調用。
pytest_runtest_call: 實際執行測試項(如函數或方法)時調用。
pytest_runtest_teardown: 在測試項執行完畢后進行清理時調用。
pytest_runtest_logstart: 用于開始測試項的日志記錄。
pytest_runtest_logfinish: 用于結束測試項的日志記錄。
報告與總結階段
pytest_make_collect_report: 生成收集階段的測試報告。
pytest_collectreport: 生成收集階段的測試報告。
pytest_make_test_report: 生成測試項的執行報告.
pytest_runtest_makereport: 生成測試項的執行報告。
pytest_report_teststatus: 報告單個測試項的狀態時調用。
pytest_terminal_summary: 在終端顯示測試總結信息時調用。
pytest_sessionfinish: 整個測試會話結束時調用。
異常與調試階段
pytest_exception_interact: 當未捕獲的異常導致測試失敗時,允許用戶交互地調試。
pytest_internalerror: 當pytest遇到內部錯誤時調用。
清理與卸載階段
pytest_unconfigure: 在pytest配置清理階段調用,用于清理測試環境。