摘要:无论什么自动化,部分测试用例均会运用到参数化,参数化可以帮助我们覆盖更多的测试用例,减少重复代码逻辑,然而自动化中也有多种实现参数化的方法,比如UnitTest的DDT模式,Pytest的fixture,以及Pytest的parametrize均可以实现测试用
前言
无论什么自动化,部分测试用例均会运用到参数化,参数化可以帮助我们覆盖更多的测试用例,减少重复代码逻辑,然而自动化中也有多种实现参数化的方法,比如UnitTest的DDT模式,Pytest的fixture,以及Pytest的parametrize均可以实现测试用例的参数化。
今天介绍新的一种方法,通过hook函数来实现测试用例的参数化,废话不多说,直接进入正文。
pytest_generate_tests
pytest_generate_tests钩子函数是Pytest框架中用来动态生成测试用例参数的钩子函数。通过它,我们可以在运行时动态地生成测试参数,从而避免手动编写重复的测试用例。
在conftest.py文件中编写对应的函数信息:
import pytestdefpytest_generate_tests(metafunc):if"data"in metafunc.fixturenames:metafunc.parametrize("data",metafunc.module.test_data,scope="function")(左右滑动查看完整代码)
其中代码中data表示测试用例中对应的传参,类似fixture名称传入,metafunc表示当前测试用例的模块对象,scope表示测试用例的作用域,默认为function。
方法一
简单编写两条测试用例,然后通过pytest_generate_tests实现测试用例的参数化:
import requestsurl = 'http://apis.juhe.cn/simpleWeather/query'# 测试数据test_data = [{"data":{"city": "上海","key": "xxxxxxxx"}},{"data":{"city": "北京","key": "xxxxxxx"}}]# 测试用例deftest_01(data):# 启动**data表示传入参数r = requests.post(url, **data)print(r.text)(左右滑动查看完整代码)
编写完成后,直接运行程序,通过结果发现已经执行成功。
方法二
通过上面的案例,小伙伴们可能懂了pytest_geerate_tests如何运行的.
其实该函数主要提供的就是动态方便我们实现测试用例,上述方法很显然不动态,小编在介绍一种使用方法,场景是根据不同的命令行,传入不同的测试数据。
这个时候就想到了pytest的另一个函数pytest_addoption,可以实现自定义命令行参数后,再次动态实现我们的参数化内容。更改conftest.py文件内容,增加pytest_addoption函数内容:
import pytestdefpytest_addoption(parser):# 添加自定义参数--anjingparser.addoption("--anjing", action="store", default="anjing", help="将'anjing'添加到pytest的配置参数中")defpytest_generate_tests(metafunc):if"data"in metafunc.fixturenames:# 获取命令行的参数信息result = metafunc.config.getoption("anjing")# 判断传参值,通过传参值进行不同传入参数if result == 'test':metafunc.parametrize("data",metafunc.module.test_shanghai,scope="function")if result == 'qa':metafunc.parametrize("data",metafunc.module.test_beijing,scope="function")同样根据刚才的测试用例,将测试数据进行分离,参数值为test的访问上海的参数,参数值为qa的我们访问北京的参数:
import requests# 上海的参数test_shanghai = [{"data":{"city": "上海","key": "xxxxxxxx"}},]# 北京的参数test_beijing = [{"data":{"city": "北京","key": "xxxxxxx"}}]deftest_01(data):'''线下数据'''url = 'http://apis.juhe.cn/simpleWeather/query'r = requests.post(url, **data)print(r.text)编写完成后,我们直接验证命令行传入不同参数,实现了动态参数化的内容。如果没有传入参数的话,系统会出现报错的。
总结
小编通过两种方法介绍了pytest_generate_tests的使用方法和一般的使用场景。
当然该函数肯定不仅仅只有这两种方法来使用,具体的使用方法可以根据对应的需求或者项目进行来完成,不同的需求不同的使用方法,如果有更好的使用方法可以下方留言,大家一起沟通交流。感谢您的阅读,希望本篇文章可以给您带来帮助。
☑️1次系统化学习>1年盲目探索
☑️转岗软件测试/野路子测试提升
☑️想了解更多涨薪技能提升方法
即可加入领取 ⬇️⬇️⬇️
转行、入门、提升、需要的各种干货资料
内含AI测试、 车载测试、AI大模型开发、银行测试、游戏测试、AIGC...
来源:彤茜教育