pytest_generate_tests()函數
1.介紹
pytest_generate_tests
這個Hook函數是在Pytest收集測試用例時被調用,它有一個參數metafunc,可以獲得測試函數的上下文信息,並且可以調用metafunc.parametrize()
對測試函數進行參數化。
2.該hook函數存放的位置
pytest_generate_tests()函數編寫在測試函數(test_XXX()函數) 相同目錄下的conftest.py文件中
3.舉個栗子
conftest.py
"""Define for conftest""" test_data = [{"test_input": "3+5", "expected": 8, "id": "驗證3+5=8" }, {"test_input": "2+4", "expected": 6, "id": "驗證2+4=6" }, {"test_input": "6 * 9", "expected": 54, "id": "驗證6*9=54" } ] def pytest_generate_tests(metafunc): ids = [] if "parameters" in metafunc.fixturenames: for data in test_data: ids.append(data['id']) # ids 表示測試用例的編號 metafunc.parametrize("parameters", test_data, ids=ids, scope="function") # 用test_data這個列表對parameters進行參數化。
test_demo.py
"""Define for test demo file using parametrize hook.""" import pytest def test_eval(parameters): assert eval(parameters['test_input']) == parameters['expected'] if __name__ == '__main__': pytest.main(["-sv", "demo_1.py"])
運行結果:
collecting ... collected 3 items
demo_1.py::test_eval[\u9a8c\u8bc13+5=8] PASSED
demo_1.py::test_eval[\u9a8c\u8bc12+4=6] PASSED
demo_1.py::test_eval[\u9a8c\u8bc16*9=54] PASSED
上面的結果表示:
pytest_generate_tests這個Hook函數會在測試函數test_demo執行時自動執行,通過metafunc可以獲得測試函數的上下文信息,比如測試函數的fixture信息。
這里,如果測試函數中包含parameters這個fixture,通過metafunc.parametrize函數使用test_data對parameters這個fixture進行參數化,使用ids組成的列表來標記測試數據,並標記測試scope為function級別,表示每一個測試函數都會自動調用這個hook函數。
通過Hook函數方式對測試數據進行參數化,不需要對測試函數進行任何改變,只要所有的測試函數使用相同格式的測試數據即可。在工作中,這種方式是非常常用的方法。