Python的hook函数(pytest_generate_tests())进行测试的参数化

Posted ananmy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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函数方式对测试数据进行参数化,不需要对测试函数进行任何改变,只要所有的测试函数使用相同格式的测试数据即可。在工作中,这种方式是非常常用的方法。

以上是关于Python的hook函数(pytest_generate_tests())进行测试的参数化的主要内容,如果未能解决你的问题,请参考以下文章

Python钩子函数

使用Python打造一款间谍程序

怎么hook linux open函数

Airflow BigQuery Hook - 通过 run_query 运行更新查询

python threading.timer怎么就收返回值

ucos里的hook函数是啥?为啥要有这些函数?干啥用的?