使用教程
- 一、配置
-
- 1、环境配置
- 2、框架配置
- 3、启动入口
- 二、用例编写
-
- 1、用例模板
- 2、参数依赖写法
- 2、函数(方法插件)写法
- 3、接口上传文件和表单参数
- 4、接口上传json参数
- 5、接口无数据填写
- 6、code断言
- 7、body断言
- 7、json断言
- 8、sql断言
- 9、完整断言写法:
- 三、邮件发送
- 四、全局前后置
- 五、测试
一、配置
1、环境配置
环境名称:自定义名称
headers:键值对字典格式,注意写法格式
http:协议http://或这https://
2、框架配置
Environment:框架测试环境配置,使用之前自定义的环境的名称
log_path:日志这里用自己电脑的文件路径
exclude_dir:执行用例要排除的case下的二级目录,例:‘bd’
exclude_file:执行用例要排除的case下的文件 例:‘case/mb.yaml’
raw_case_path:当前用例原始文件总目录
MYSQL_CONFIG:MYSQL_CONFIG_1,MYSQL_CONFIG_2数据库配置,使用数据库操作时使用,需要几个就写几个
submodule_list:子模块,用于数据统计,就是case目录下的所有二级目录(暂时无用)
case_amount_sum,case_amount_execute:数据统计需要无需修改
3、启动入口
二、用例编写
1、用例模板
使用请严格按照格式编写用例
#用例(名称)标题,需要参数依赖的全部设置字符格式,后期解析成字典列表等格式
用例标题0:
#接口地址,也支持参数依赖,没写
path: /test/${id}
#请求方法
method: post
#有值就用这个,没用就使用默认配置的,有header里面使用参数依赖的场景
headers: '{"token":"${token}"}'
# 是否运行
is_run: False
# 前置sql:sql有2大类,一个是查询有返回值,一个是增删改无返回值,前置sql为无返回值类型
# precondition_sql:
# - UPDATE case_test SET title = '标题2', ex = '44' WHERE id = 2
# - UPDATE case_test SET title = '标题3', ex = '55' WHERE id = 3
#请求参数较多,这里就使用原始字典格式,除了提取表达式,其他的都带上引号,预防出错,random_time()随机函数使用
data:
'{
"id":${id},
"projectNo": "320SF000206004",
"name": ${name},
"time": ${random_int()},
}'
#上传文件,文件名路径必须是英文
file:
'[
("file", ("bug.xlsx", open("C:/Users/Cassie/Desktop/bug.xlsx", "rb"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
]'
#参数类型 json 或者 form表单
data_type: json
#从接口返回结果提取哪些字段和提取表达式,比如从返回数据提取用户id和name
extract_key:
id: $.id
name: $.name
#断言表达式
# 除了数字类型比较,其他的字符或者表达式全部带上引号,表达式必须要写在后面(必须按照格式来)
# 断言sql为有返回值查询
assert_expression:
#判断响应码是否和预期一致
code: 200
#判断预期值是否在返回值里面(用值是否在接口返回的内容里面判断)
body: 内容包含
#判断json提取值是否和预期一致(用键和值比较等于,大于小于或者in判断)
json:
id: $.id
name: $.name
1: $.int
#判断sql查询值是否和预期一致(用键和值作判断,规则和上面一致)
sql:
#外层一个大列表,里面没个小列表就是一个sql断言
#小列表断言元素1是数据库名,第二个是比较值,第三个是逻辑运算符,第四个是sql
[["db_test2","$.book_jg",","SELECT book_name FROM book where book_name=${book_name}"],
["db_test","$.title","==","SELECT title FROM case where id=${id}"]]
2、参数依赖写法
参数依赖可以写在path,headers,data里面
参数池{‘id’:1,‘name’:‘kk’,‘info’:{‘wo’:2}}
${id}
: 相当于在参数池子里面取id的值也就是1
${info.wo}
: 相当于在参数池子里面取wo的值也就是2
2、函数(方法插件)写法
${random_int()}
:使用函数里面的这个方法
3、接口上传文件和表单参数
data:使用引号包起来的字典,作为接口表单格式参数发送(复制data里面的数据在外面加上引号)
file:使用引号包起来的python文件对象,作为接口文件格式参数发送(复制file里面的数据在外面加上引号)
调试代码
data_type: 设置为form
import requests
url = "https://xx/file"
data= {'uid': '78axx90011',
'file_name': 'bug.xlsx',
'file_type': 'proof_of_address'}
files = [
('raw_body', ('bug.xlsx', open('C:/Users/Cassie/Desktop/bug.xlsx', 'rb'), 'text/plain'))
]
headers = {
'Authorization': 'Bearer eyJ0xxxe',
'Accept': 'application/json'}
response = requests.request("POST", url, headers=headers, data=data, files=files)
print(response.text)
用例写法
data:
"
{'uid': '78asdf99890011',
'file_name': 'bug.xlsx',
'file_type': 'proof_of_address'}
"
file:
"
[
('raw_body', ('bug.xlsx', open('C:/Users/Cassie/Desktop/bug.xlsx', 'rb'), 'text/plain'))
]
"
data_type: form
4、接口上传json参数
data:使用引号包起来的字典,作为接口json格式参数发送(复制data里面的数据在外面加上引号)
file:不填
data_type: 设置为 json
data:
'
{
"waybill_no":"${waybill_no}",
"lu_dan_ren":"${cc1}",
"aa":[{"a":"${random_str(22)}"},{"b":"${random_int(2)}"},{"c":"${cc1}"},{"d":{"d1":"${random_int(2)}"}}]
}
'
file:
data_type: json
5、接口无数据填写
都填空,不写
data:
file:
data_type:
6、code断言
需要填写预期接口返回码,完全相等就是断言成功
code: 200
7、body断言
填写预期接口返回的内容,该内容在接口返回数据里面就是断言成功
body: 520
7、json断言
运单创建成功,301是预期结果,$.msg
,$.book_jg
是预期结果表达式(可以写多个),当预期结果和预期结果表达式从接口返回提取的值相等时就是断言成功
运单创建成功: $.msg
301: $.book_jg
8、sql断言
格式是一个大列表嵌套一个或者多个小列表,几条sql断言就几个小列表
sql断言第一个值: db_test2,数据库对象,需要先在config.py配置里面写上数据库连接数据,然后去mysql_.py里面生成数据库对象,然后把对象名写在db_list=[‘db_test’,‘db_test2’]上。只有在db_list里面的数据库才可以进行断言使用
sql断言第二个值:预期结果,可以写明确的值,也可以去写$.book_jg
去接口返回值里面拿数据作为预期结果
sql断言第三个值:逻辑运算符 ==
sql断言第四个值:sql语句,可以在sql语句里面使用${case_id}
去接口返回里面拿值来用,和参数依赖一样都是使用jsonpath去提取的写法。
[['db_test2', '$.book_jg', ', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
9、完整断言写法:
assert_expression:
code: 201
body: 520
json:
运单创建成功: $.msg
301: $.book_jg
sql:
[['db_test2', '$.book_jg', ', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
三、邮件发送
配置邮箱的发送邮箱,和授权码(指定163邮箱和该邮箱的授权码)
收件人支持其他邮箱,填写格式如下
# 邮箱的地址
addresser = "xxn@163.com"
# 授权码
authorization_code = "xxxxxTN"
# 收件人
recipients=['xxxxx@gmail.com', 'lxxx@163.com']
四、全局前后置
可以自定义前置干什么后置干什么,我这边只写了后置数据统计和邮件发送
五、测试
1、启动mock接口
2、配置环境,配置mock接口的协议和域名
3、配置环境名称和用例执行目录配置,最多支持2级目录,一般一个目录一个模块
4、用例编写
获取运单号:
path: /get_waybill_no
method: get
headers: '{"token": "${token}"}'
is_run: True
data:
file:
data_type:
extract_key:
waybill_no: $.waybill_no
assert_expression:
code: 200
body: 520
json:
lj520: $.waybill_no
sql:
[
['db_test2', '$.book_jg', ', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}'],
['db_test', '$.title', '==', 'SELECT title FROM case_t where case_id=${case_id}'],
['db_test', '唤醒不了', '==', 'SELECT title FROM case_t where case_id=2']
]
录单:
path: /lu_dan?aa=${cc1}
method: post
headers: '{"token": "em123dca666333"}'
is_run: True
data:
'
{
"waybill_no":"${waybill_no}",
"lu_dan_ren":"${random_int(21)}",
"aa":[{"a":"${random_str(22)}"},{"b":"${random_int(2)}"},{"c":"${cc1}"},{"d":{"d1":"${random_int(21)}"}}]
}
'
file:
data_type: json
extract_key:
assert_expression:
code: 201
body: 520
json:
运单创建成功: $.msg
301: $.book_jg
sql:
[['db_test2', '$.book_jg', ', 'SELECT book_jg FROM book where book_name=${book_name} and book_id=${book_id}']]
5、执行测试
6.邮箱配置和报告查看
记得先配置邮箱哦
邮箱报告,这里面的一个报告连接就是allure报告的地址
allure报告