HttpRunner3.X学习笔记(9) 用例的参数化
前言:
做过接口测试的都知道,接口的参数化是接口测试中非常普遍的测试模式,那么在HttpRuner3.x中,怎么实现参数化呢?因为HttpRunner3是在pytest的单元测试框架的基础上做的封装,所以基本能套用pytest的参数化模式,目前HttpRunner3.x支持3中参数化规则,从:自己定义的变量数组,debugtalk.py函数返回值中,以及外部文件中。
因为HttpRunner3.x支持.py格式的用例,所以这三类还是可以有更多的拓展,留给读者自己去思考吧~
代码示例
先来看一份官网的示例代码
# NOTE: Generated By HttpRunner v3.1.4
# FROM: request_methods/request_with_parameters.yml
import pytest
from httprunner import Parameters
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCaseRequestWithParameters(HttpRunner):
@pytest.mark.parametrize(
"param",
Parameters(
{
"user_agent": ["iOS/10.1", "iOS/10.2"],
"username-password": "${parameterize(request_methods/account.csv)}",
"app_version": "${get_app_version()}",
}
),
)
def test_start(self, param):
super().test_start(param)
config = (
Config("request methods testcase: validate with parameters")
.variables(**{"app_version": "f1"})
.base_url("https://postman-echo.com")
.verify(False)
)
teststeps = [
Step(
RunRequest("get with params")
.with_variables(
**{
"foo1": "$username",
"foo2": "$password",
"sum_v": "${sum_two(1, $app_version)}",
}
)
.get("/get")
.with_params(**{"foo1": "$foo1", "foo2": "$foo2", "sum_v": "$sum_v"})
.with_headers(**{"User-Agent": "$user_agent,$app_version"})
.extract()
.with_jmespath("body.args.foo2", "session_foo2")
.validate()
.assert_equal("status_code", 200)
.assert_string_equals("body.args.sum_v", "${sum_two(1, $app_version)}")
),
]
if __name__ == "__main__":
TestCaseRequestWithParameters().test_start()
- 文件中,先在需要参数化测试类名下定义参数化字段
@pytest.mark.parametrize(
"param",
Parameters(
{
"user_agent": ["iOS/10.1", "iOS/10.2"],
"username-password": "${parameterize(request_methods/account.csv)}",
"app_version": "${get_app_version()}",
}
),
)
- 重写父类的方法test_start,将参数化变量传入
def test_start(self, param):
super().test_start(param)
自定义数组变量
"user_agent": ["iOS/10.1", "iOS/10.2"],
将数组内的两个值分别付给了变量user_agent,此时用例引用变量时$user_agent
,就会循环带入两个值执行两个测试用例
debugtalk.py函数的返回值
"app_version": "${get_app_version()}",
和自定义变量类似,把函数get_app_version()
的返回值赋值给了变量app_version,用例执行时,就会带入函数返回值,返回值一般是列表或者元组类型的。容器内有几个值,就会执行几次用例,用函数返回值作用参数化变量的好处是,可以动态计算参数,留给使用者更多的可能性
外部文件
"username-password": "${parameterize(request_methods/account.csv)}"
外部文件中定义的参数通过${parameterize(file/path)}
固定写法读取。以上的例子中每一次要参数化的值实际上是多个,将每一行读取出来的变量分别赋值给了username和password,文件有多烧焊行,就会执行几遍用例
独立参数和组合参数
在上面的例子中user_agent和app_version都是独立参数,每个遍历出来值只有一个,而username-password则是组合参数,每次遍历出来是一组值,分别赋值给对应变量。
如果参数在用例中是单独定义的,没有出现组合的情况,那么遍历出来几个值,用例就会执行几次。
而如果不同的参数需要组合使用,但是又各自定义了参数化,那么此时用例执行的次数呈现笛卡尔积的,假设上面的例子中user_agent有2个值,app_version 有3个值,username-password也3组值,组合在一起,用例就会累计执行** 2x3x3 **次,也许这并不是我们想要的。所以设计好我们的参数化组合在HttpRunner接口参数化实践中是非常重要的。