Python的hook函數(pytest_generate_tests())進行測試的參數化


 

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函數方式對測試數據進行參數化,不需要對測試函數進行任何改變,只要所有的測試函數使用相同格式的測試數據即可。在工作中,這種方式是非常常用的方法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM