zoukankan      html  css  js  c++  java
  • 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[u9a8cu8bc13+5=8] PASSED
    demo_1.py::test_eval[u9a8cu8bc12+4=6] PASSED
    demo_1.py::test_eval[u9a8cu8bc16*9=54] PASSED

    上面的结果表示:

    pytest_generate_tests这个Hook函数会在测试函数test_demo执行时自动执行,通过metafunc可以获得测试函数的上下文信息,比如测试函数的fixture信息。

    这里,如果测试函数中包含parameters这个fixture,通过metafunc.parametrize函数使用test_data对parameters这个fixture进行参数化,使用ids组成的列表来标记测试数据,并标记测试scope为function级别,表示每一个测试函数都会自动调用这个hook函数。

    通过Hook函数方式对测试数据进行参数化,不需要对测试函数进行任何改变,只要所有的测试函数使用相同格式的测试数据即可。在工作中,这种方式是非常常用的方法。

  • 相关阅读:
    [ PyQt入门教程 ] Qt Designer工具的使用
    [ PyQt入门教程 ] PyQt5开发环境搭建和配置
    Notepad++提升工作效率小技巧
    思考:测试人员如何快速成长
    Linux /tmp目录下执行脚本失败提示Permission denied
    使用Quartz实现定时任务
    算法篇(前序)——Java的集合
    深入理解 JVM(上)
    Linux集锦
    秒杀系统实现高并发的优化
  • 原文地址:https://www.cnblogs.com/ananmy/p/14817272.html
Copyright © 2011-2022 走看看