一、httprunner命名规范
- 类名开头必须是Test
- 定义的测试类,需要继承httprunner
- teststeps为测试步骤,每一个测试步骤叫做step
- step里的RunRequest,是待测的API名字,可按照接口名称填写\
- .py文件的尾缀,必须是_test
二、httprunner的模块引入
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
Httprunner:导入Httprunner类,后面的测试类,继承于Httprunner
Config:全局设置,可以设置全局变量,例-variables(**);可以忽略Request库的警告,例-verify(False)
Step:测试步骤,每一个的接口测试用例,对应着一个step
RunRequest:每一个测试步骤的接口名称命名,可以是中文
RunTestCase:每一个测试步骤的接口名称命名,可以是中文。不同于RunRequest的是,RunTestCase只可以用于调用其他hrun文件时使用
三、待测接口命名
RunRequest("/app/common/login")
命名接口,这里可以写对应的业务接口名称
比如,我这里命名为:登录
四、设置请求方式
.get,表明这是一个get请求方式的接口
.post,表明这是一个post请求方式的接口
后面需要跟上完整的API路径名
可通过ctrl+鼠标左击,进入方法内
httprunner支持:get、post、put、head、delete、options、patch等请求方式
五、.with_headers:headers入参传递
请求接口的headers入参放在这里,在with_headers方法内,需要加上**来读取。
例:
.with_headers(
**{
"Host": "erp2.hzb-it.com",
"Content-Length": "27",
"Accept": "application/json, text/plain, */*",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",
"Origin": "http://erp2.hzb-it.com",
"Referer": "http://erp2.hzb-it.com/",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
}
)
六、config:设置全局化参数
config = Config("testcase description").verify(False).variables(**{
"Host":"erp2.hzb-it.com",# todo:定义全局变量
})
此时定义了一个名为Host的全局变量,整体的httprunner都可以调用
想要定义多个全局变量,也可以在这里设置
1、.base_url():设置全局化项目地址
七、.with_variables(**{ }):定义局部变量,仅在当前step可用
设置局部变量语法:
1、在RunRequest()后
2、在RunTestCase()后
.with_variables(**{"Content-Length":"27"})
1、引用局部变量
"Content-Length": "${Content-Length}",
八、${变量}:引用设置的变量
在需要使用的地方,填入:${变量名},就可以引用参数
这里调用了Host、Accept全局参数
九、.with_cookies:设置cookie值
请求接口的cookies入参放在这里,在with_cookies方法内,需要加上**来读取。
.with_cookies(
**{
"access-token": "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2NDczNTk0NDEsInVzZXJEZXRhaWxzIjoie1wicm9sZXNcIjpbe1wiY29kZVwiOlwic3VwZXJhZG1pblwiLFwibmFtZVwiOlwi6LaF57qn566h55CG5ZGYXCIsXCJpZFwiOjF9LHtcImNvZGVcIjpcInhpbmd6aGVuZ1wiLFwibmFtZVwiOlwi6KGM5pS_XCIsXCJpZFwiOjExfV0sXCJwYXNzd29yZFwiOlwiJDJhJDEwJE5Fc3JOeUJJUEdFTHg5RHBJYm0veC5Wd0FNT3pobVg0Y09mTzRqendSSmY2WGl6WXJ4akkyXCIsXCJpZGVudGl0eVwiOjEsXCJuYW1lXCI6XCLnrqHnkIblkZhcIixcImlkXCI6MSxcInN0YXRlXCI6MSxcInVzZXJuYW1lXCI6XCJhZG1pblwifSJ9.xLw2cSbOIxQOWhXRgarGcI55U8B353_c0vDS7M-puJ8"
}
)
十、with_data:data参数传参
引言:指定HTTP请求正文。这对应于的data参数requests.request
.with_data({"username": "admin", "password": "123"})
十一、with_json:json参数传参
在json中指定HTTP请求正文。这对应于的json参数requests.request。
但要记得在headers声明json传参:{‘Content-Type’:‘application/json;charset=utf8’}
.with_data({"username": "admin", "password": "123"})
十二、extract().with_jmespath():拿到接口的response,用作后续接口使用
httprunner的响应集,整体被命名为:body
我是怎么知道的?可以通过运行hrun,来看下控制台呀
运行命令:pytest ERP_Project_test.py
它的最外面,就是body,所以,我们取值的时候,就要带上body
1、 response body怎么取关联接口的响应值?
举例:我想取图中的data参数
extract().with_jmespath("body.data","data")
这样就可以取到参数了。body是最外层,data处于body的下一级,所以用的是body.data
第二个参数是命名取到的变量为:data
2、 response headers怎么取值?
extract().with_jmespath('headers.Server', 'cookies')
3、 response cookies怎么取值?
extract().with_jmespath(cookies."key","edit-key")
4、 怎么确保取的值正确?
运行一遍httprunner:
pytest -s ERP_Project_test.py
在下图,就可以清晰的看到,data参数被取出来了
5、 如果response清单返回列表数据,该怎么取值?
可以通过数组下标的方式取值
比如下面,就是取的body下的data下的list下标为0的quantity数据
extract().with_jmespath("body.data.list[0].quantity","quantity")
十三、取出的参数,如何运用到其他step中
${变量名}就可以使用,举例
"access-token": "${data}"
十四、.validate():httprunner内置的断言功能
httprunner的断言信息会自动生成:断言响应状态码、断言响应body的文本信息等
.assert_equal():断言文本信息是否相等,也可以自定义断言
比如:取出响应状态码进行断言
.assert_equal("status_code", 200)
取出响应headers参数进行断言
.assert_equal('headers."Content-Type"', "application/json")
取出响应body参数,与预期的匹配的文本信息进行断言
.assert_equal("body.name", "管理员")
.assert_greater_than():断言获取到的值,是否大于预期设定的值
断言取出的值,是否大于20
.assert_greater_than("body.data.totalCount", 20)
.assert_endswith():断言获取到的值,在字符串末尾是否与预期设定的值一致
断言ss 是否在字符串末尾
.assert_endswith("body.message", "ss")
.assert_startswith():断言获取到的值,在字符串开始是否与预期设定的值一致
断言su 是否在字符串开始
.assert_startswith("body.message", "su")
查看更多的断言方式
按住ctrl+鼠标左键,查看
十五、RunTestCase、call():业务解耦和调用方法
A文件:ERP_Login_test.py,只有一个login的step
# NOTE: Generated By HttpRunner v3.1.6
# FROM: testcases\ERP_PROJECT.har
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
class TestCaseErpProject(HttpRunner):
config = Config("testcase description").base_url("http://erp2.hzb-it.com/").verify(False).variables(**{ # todo: .base_url()设置项目全局地址
"Host":"erp2.hzb-it.com",
"Accept":"application/json, text/plain, */*" # todo:定义全局变量
})
teststeps = [
Step(
RunRequest("登录")
.with_variables(**{"Content-Length":"27"}) #todo:定义局部变量
.post("app/common/login")
.with_headers(
**{
"Host": "${Host}", # todo: 引用Host变量
"Content-Length": "${Content-Length}", # todo:引用局部变量
"Accept": "${Accept}", # todo: 引用Accept变量
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",
"Content-Type": "application/x-www-form-urlencoded",
"Origin": "http://erp2.hzb-it.com",
"Referer": "http://erp2.hzb-it.com/",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "keep-alive",
}
)
.with_data({"username": "admin", "password": "123"})
.extract().with_jmespath("body.data","data")
.validate()
.assert_equal("status_code", 200)
.assert_equal('headers."Content-Type"', "application/json;charset=UTF-8")
.assert_equal("body.msg", "提交成功")
.assert_equal("body.errCode", 0)
),
]
if __name__ == "__main__":
TestCaseErpProject().test_start()
B文件: ERP_Project_test.py,是登录后的操作,依赖于A文件
RunTestCase()和call()使用语法:
1、RunTestCase()是只有在调用A文件的时候,才可以使用(业务解耦、login解耦等)
2、call():call,调用另一个.py文件的内容。在导入模块时,需要注意,使用别名,不然的话,hrun会识别成两条case
# NOTE: Generated By HttpRunner v3.1.6
# FROM: testcases\ERP_PROJECT.har
from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCase
from ERP_Project.testcases.ERP_Login_test import TestCaseErpProjects as Login
class TestCaseErpProject(HttpRunner):
config = Config("testcase description").base_url("http://erp2.hzb-it.com/").verify(False).variables(**{ # todo: .base_url()设置项目全局地址
"Host":"erp2.hzb-it.com",
"Accept":"application/json, text/plain, */*" # todo:定义全局变量
})
teststeps = [
Step(
RunTestCase("login")
.call(Login)
.export("data")
),
Step(
RunRequest("/app/common/base/enumList")
.get("http://erp2.hzb-it.com/app/common/base/enumList")
.with_headers(
**{
"Host": "erp2.hzb-it.com",
"Accept": "application/json, text/plain, */*",
"access-token": "${data}",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36",
"Referer": "http://erp2.hzb-it.com/",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Cookie": "access-token=${data}",
"Connection": "keep-alive",
}
)
.with_cookies(
**{
"access-token": "${data}"
}
)
.validate()
.assert_equal("status_code", 200)
.assert_equal('headers."Content-Type"', "application/json")
),
]
if __name__ == "__main__":
TestCaseErpProject().test_start()
1、如果用例运行报错,如下:
当使用pytest -s xx.py 运行文件时,报错提示
解决办法:
在运行文件的根目录下,新建一个conftest.py,内容为:文章来源:https://www.toymoban.com/news/detail-412203.html
import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__),'..')))
文章来源地址https://www.toymoban.com/news/detail-412203.html
到了这里,关于Httprunner系列(六):httprunner内置函数使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!