一、httprunner处理正向用例的接口测试
1、安装Httprunner
如果不加版本号的话,会默认下载3版本的,3版本的bug比较多
pip install httprunner==2.5.7
2、安装完成后,会自带hrun、httprunner命令,用于运行用例、管理操作
3、创建项目工程结构
hrun --startproject django_project1_httprunner
api目录:用于存放接口的最小单元(正向用例)
reports目录:用于存放测试报告
testcases目录:用于处理接口复杂的执行逻辑;处理接口依赖
testsuites目录:用户批量执行用例,可以实现数据驱动测试
.env文件:用于存放全局环境变量
debugtalk.py文件:用于定义python函数,处理动态参数
4、Yaml配置文件格式
1、yaml是数据格式,不是数据类型
2、yaml配置文件的后缀为yml、yaml
3、yaml中使用#作为注释,注释只能在某一行的前后,不能在同一行
4、yaml中有2种结构,一个是key:value,value与冒号之间必须有空格
另一个是 -key:value。“-”表示代码为列表结构
5、yaml文件中嵌套的同一级条目前的缩进必须一致,一般缩进2个空格
6、yaml中如果使用引号(单双引号),那么该value为字符串类型
7、如果value中只要包含有字母,哪怕没有添加引号,一般也会识别为字符串类型
(false、true、on、off除外),null为空
8、value为false、true、on、off、null是布尔类型
9、value中为纯数字或小数,会被识别为int或者float类型
name:指定当前用例名称
variables:设置变量
request:定义当前接口的配置信息
url:指定当前的接口的url地址
method:指定当前接口的请求方法,不区分大小写
headers:指定请求头参数
json:指定请求体为json格式的参数
validate:指定断言
1、传递json格式的参数用json作为key;
传递form表单参数用data作为key;
传递查询字符串参数用params作为key
2、eq为断言类型,断言是否实际值和期望值是否相等
完整形式为equals、也可以使用==、is
lt、le、gt、ge、ne等等
方括号中第一个参数为实际值,第二个参数为期望值
3、实际值:
status_code(响应状态码)、
cookies、
headers(响应头)、
content(响应体数据)、
text(响应体数据)、
json(响应体数据)
如果一个接口返回的是json格式的数据,那么content、text、json获取的是字典(嵌套字典的列表)
4、contains:判断实际值是否包含期望值
contained_by:判断实际值是否包含在期望值中
5、实际值提取方式:
a、使用content\text\json加上“.”运算加上key,就能获取到相应的值
b、使用content.key如果提取的结果为列表,可以使用列表中的数字索引来提取
6、例如:判断响应体返回的结果中是否包含username
- contains: ["json", "username"]
例如:判断响应体状态码是否为200
- eq: ["status_code", 200]
判断响应体返回的结果中user_id是否小于22
- lt: ["json.user_id",22]
7、variables设置变量
a、指定当前用例的局部变量
b、一旦指定就能在变量定义的下方任意地方调用
c、使用$变量进行调用
d、作用域为当前yaml文件,变量定义的下方,不能跨yaml文件进行调用
8、设置环境变量(全局变量)
a、可以在项目根路径下,.env文件中创建环境变量
b、定义:环境变量名=环境变量值
c、调用:可以在任意一个yaml或者json用例文件中,使用${ENV(变量名称)}
.env文件:用于存放全局环境变量
USERNAME=zhilong
PASSWORD=666666
BASE_URL=http://192.168.17.129:8001
api目录:用于存放接口的最小单元(正向用例)
name: "登录api接口"
base_url: "${ENV(BASE_URL)}"
variables:
username: "${ENV(USERNAME)}"
password: "${ENV(PASSWORD)}"
request:
url: "/user/login/"
method: POST
headers:
Content-Type: "application/x-www-form-urlencoded"
User-Agent: "Mozilla/5.0"
data:
username: "$username"
password: "$password"
verify: false
params:
p: 1
s: 3
validate:
- eq: ["status_code", 200]
第一种运行:控制台执行用例:
hrun ceshi_platform_httprunner/api/login_api_form_bk.yml
第二种运行:新建test.py文件,python程序运行,会将所有数据存放到字典里面
from httprunner.api import HttpRunner
httprunner=HttpRunner()
httprunner.run(r'/home/zhilong/Desktop/project/ceshi_platform/ceshi_platform_httprunner/api/login_api.yml')
print(httprunner._summary)
reports目录:用于存放测试报告
二、httprunner处理具有接口依赖的测试——获取项目的数据
获取项目数据前要进行token认证
先要向登录接口发请求,从响应体中获取token,但是在单个api接口中是没法实现的,如果想要实现接口依赖,需要去testcases中去创建
登录接口api
name: "登录api接口"
base_url: "${ENV(BASE_URL)}"
variables:
username: "${ENV(USERNAME)}"
password: "${ENV(PASSWORD)}"
request:
url: "/user/login/"
method: POST
headers:
Content-Type: "application/x-www-form-urlencoded"
User-Agent: "Mozilla/5.0"
data:
username: "$username"
password: "$password"
verify: false
params:
p: 1
s: 3
testcases目录下定义project_list.yaml文件:
config:
name: "获取项目列表数据接口测试"
teststeps:
-
name: "先登录"
#api:导入api文件夹下的接口的api最小执行单元
api: "ceshi_platform_httprunner/api/login_api_form.yml"
#extract:从相应结果中提取数据,并设置变量
#设置的变量,可以在当前yaml用例文件下方任意地方调用
extract:
- TOKEN: "content.token"
-
name: "获取项目列表数据接口 "
api: "ceshi_platform_httprunner/api/projects_list_api.yml"
获取项目列表数据api:
name: "获取项目列表数据"
base_url: "${ENV(BASE_URL)}"
request:
url: "/projects/"
method: GET
headers:
#Content-Type: "application/json"
Accept: "application/json"
Authorization: "JWT $TOKEN"
params:
size: 3
page: 2
validate:
- eq: ["status_code", 200]
执行用例:
hrun ceshi_platform_httprunner/testcases/project_list_testcase.yml --log-level debug
测试报告:
三、登录接口数据驱动测试
首先到testcases文件中定义执行逻辑,先进行登录接口
定义登录api:api/login_api_form.yml
name: "登录api接口"
base_url: "${ENV(BASE_URL)}"
variables:
username: "${ENV(USERNAME)}"
password: "${ENV(PASSWORD)}"
request:
url: "/user/login/"
method: POST
headers:
#让User-Agent动态变化,需要在项目根路径下的debugtalk.py文件中定义函数或者类,用于处理动态变化的参数
#使用${函数名(参数1,参数2,......)}
Content-Type: "application/x-www-form-urlencoded"
User-Agent: "${random_generate_uagent()}"
data:
username: "$username"
password: "$password"
verify: false
定义login_testcases.yaml:定义测试逻辑,先执行登录接口;validate中的断言在测试套件中的每一条用例执行完毕后,进行断言
config:
name: "登录接口"
teststeps:
-
name: "登录接口"
api: "api/login_api_form.yml"
validate:
- contains: ["content", $msg]
再到testsuites文件中定义执行的测试用例或者从debugtalk.py中加载用例,数据驱动测试
#指定测试套件中的全局配置信息
config:
name: "测试条件"
testcases:
-
name: "登录接口测试"
testcase: "testcases/login_testcase.yml"
# parameters:
# title-username-password-status_code-msg:
# - ["正常登录","zhilong","666666",200,"token"]
# - ["用户名为空","","666666",400,"username"]
# - ["密码为空","zhilong","",400,"password"]
# - ["密码不正确","zhilong","000000",400,"non_field_errors"]
# parameters:
# title-username-password-status_code-msg: ${P(data/data.csv)}
parameters:
title-username-password-status_code-msg: ${get_accounts()}
debugtalk.py文件:用于定义python函数,获取测试用例,将用例加载到测试套件中
import random
import time
def sleep(n_secs):
time.sleep(n_secs)
def random_generate_uagent():
user_agent_list=["Mozilla/5.0","Mozilla/5.0 kb","Mozilla/5.0 zil","Mozilla/5.0 zz","Mozilla/5.0 bi",]
return random.choice(user_agent_list)
def get_accounts():
accounts=[
{"title":"正常登录","username":"zhilong","password":"666666","status_code":200,"msg":"token"},
{"title": "正常登录", "username": "zhilong1", "password": "231231", "status_code": 200, "msg": "token"},
{"title": "正常登录", "username": "zhilong2", "password": "124", "status_code": 200, "msg": "token"}
]
return accounts
if __name__ == '__main__':
print(random_generate_uagent())
执行测试用例
hrun ceshi_platform_httprunner/testsuites/login_testsuite.yml
测试报告
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/74043.html