httprunner是采用yaml/json文件编写测试用例,然后运行,但是3.x后引入了pytest框架,我们即便使用yaml和json文件,最后的执行也是转成.py文件执行。
所以3.x版本推荐直接编写代码,相对来说,代码编写比文件编写要好太多,因为httprunner3.x的语法关联性特别强;以下就是针对代码编写用的一些常用操作。
附上示例代码:
from httprunner import (HttpRunner, Config, Step, RunRequest, RunTestCase)
class TestCaseLogin(HttpRunner):
config = (
Config("login")
.variables(
**{
"user_name": "${ENV(USERNAME)}",
"password": "${ENV(PASSWORD)}"
}
)
.base_url("${ENV(HOSTURL)}")
.verify(False)
# .export(*["foo3"])
)
teststeps = [
Step(
RunRequest('login')
.with_variables(**{
'length': 32, 'status_code': 201, 'status': 1})
.post('/client/user/auth')
.with_headers(**{
"Content-Type": "application/json"})
.with_json({
"scenario": "client", "company_id": 5940, "user_name": "$user_name", "password": "$password",
"device_type": "2", "device": ""})
.extract()
.with_jmespath("body.data.token", "token")
.validate()
.assert_equal('status_code', '$status_code', '断言失败')
.assert_equal('body.status', '$status', '断言失败')
.assert_length_equal('body.data.token', '$length', '断言失败')
)
]
if __name__ == '__main__':
TestCaseLogin().test_start()
config部分:
config = (
Config("login")
.variables(
**{
"user_name": "${ENV(USERNAME)}",
"password": "${ENV(PASSWORD)}"
}
)
.base_url("${ENV(HOSTURL)}")
.verify(False)
# .export(*["foo3"])
)
Config(): 设置名称,也就是name,它是必填的
- .verify(): 针对https接口,忽略证书的操作,放布尔值,全局变量
- .base_url():是放请求地址的,也就是域名, 全局变量
- .variables():设置变量,可在此处设置全局变量,用于下面的用例引用它
- .export(): 提取关联参数,全局变量
注意:Config()中设置的均为全局变量,整个.py文件中都可以引用的
teststeps部分:
teststeps = [
Step(
RunRequest('login').
.with_variables(**{
'length': 32, 'status_code': 201, 'status': 1})
.post('/client/user/auth')
.with_headers(**{
"Content-Type": "application/json"})
.with_json({
"scenario": "client", "company_id": 5940, "user_name": "$user_name", "password": "$password",
"device_type": "2", "device": ""})
.extract()
.with_jmespath("body.data.token", "token")
.validate()
.assert_equal('status_code', '$status_code', '断言失败')
.assert_equal('body.status', '$status', '断言失败')
.assert_length_equal('body.data.token', '$length', '断言失败')
)
]
RunRequest():设置名称,也就是name,它是必填的,设置完它后,才能引下面的一些方法
- .with_variables():设置局部变量,个人建议你可以把接口一些预期结果放在这里
- .post()/put/get/options/delete/head/patch:接口的请求方式;设置好请求方式后,再就可以设置接口的一系列信息
请求方式中的方法 | 注释信息 |
---|---|
.with_headers() | 设置头部信息 |
.with_json() | 放json请求数据 |
.with_params() | 针对跟在url后面的参数 |
.with_data() | 放data请求数据 |
.set_timeout() | 设置超时时间 |
.set_verify() | 针对https,忽略证书 |
.with_cookies() | 设置cokkies信息 |
.set_allow_redirects() | 重定向,传布尔型值 |
.extract():引入提取参数方法
- .with_jmespath(“body.data.token”, “token”)
栗子:.with_jmespath(“body.data.token”, “token”)
.validate():引入断言校验方法
- .assert_equal() # 断言相等
栗子: .assert_equal(‘status_code’, ‘$status_code’, ‘断言失败’)
- equal: 等于
- contained_by: 实际结果是否被包含在预期结果中
- contains: 预期结果是否被包含在实际结果中
- endswith: 以…结尾
- greater_or_equals: 大于等于
- greater_than: 大于
- length_equal: 长度等于
- length_greater_or_equals: 长度大于等于
- length_greater_than: 长度大于
- length_less_or_equals: 长度小于等于
- length_less_than: 长度小于
- less_or_equals: 小于等于
- less_than: 小于
- not_equal: 不等于
- regex_match: 字符串是否符合正则表达式匹配规则
- startswith: 以…开头
- string_equals: 字符串相等
- type_match: 类型是否匹配
teststeps列表中的Setp可以设置多个,针对业务的接口处理起来是比较方便的:
from httprunner import (HttpRunner, Config, Step, RunRequest, RunTestCase)
class TestCaseLogin(HttpRunner):
config &#