pytest+yaml框架使用教程
一、框架功能介绍
'''
1、每条用例前置sql,请求参数sql,断言sql
2、requests二次封装,自动获取ip和header信息
3、allure动态方法封装(标题、描述、步骤)
4、钉钉机器人发生allure报告公司局域网内可以访问
5、log日志记录每个重要参数
6、多接口参数依赖(接口返回提取,请求使用)
7、token信息全局前置写入配置文件
8、用例文件支持多目录多文件运行,支持排除目录或者文件
9、定位运行的用例属于哪个文件
10、支持随机几位数字或者字符串
11、提供mock接口
12、多环境测试(需要配置要测试的环境名和不同环境token)
13、用例标题重复停止测试
14、支持多个断言条件
15、接口请求参数替换支持list: [$.waybillid] ,一层json: {'c':$.c} ,多层json: {'a':'a','c':[{'c1':^$.c1^},{'time':^random_time()^}]
'''
二、框架启动
1、源码下载,项目打开
1.1、框架源码
1.2、pytest+yaml设计接口自动化框架过程记录(一步一步记录如何设计,完结撒花),源码提供,视频教程
顺便点个小星星呗
下载解压
pycharm打开项目
1.2、我把环境换成了一个啥用没有的初始环境
2、环境配置(python3.7)
pip install -r requirements.txt
安装完成
3、启动mock接口服务
这个就是当前你服务器的域名信息
4、配置环境信息
使用上一步服务启动时的域名信息
5、配置项目信息后运行(有数据库环境)(数据库MYSQL_CONFIG)
5.1数据库(2个表,库名是test,修改的话记得修改项目配置的MYSQL_CONFIG)
MYSQL_CONFIG=(“10xxx”,3306, ‘root’, ‘123456’, ‘test’)
数据库域名,端口,账号,密码,库名
5.1.1、case_test表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for case_test
-- ----------------------------
DROP TABLE IF EXISTS `case_test`;
CREATE TABLE `case_test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`ex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of case_test
-- ----------------------------
INSERT INTO `case_test` VALUES (2, '标题2', '44');
INSERT INTO `case_test` VALUES (3, '标题3', '55');
INSERT INTO `case_test` VALUES (4, '1', '1');
INSERT INTO `case_test` VALUES (5, '1', '1');
INSERT INTO `case_test` VALUES (6, '1', '1');
INSERT INTO `case_test` VALUES (7, '1', '1');
INSERT INTO `case_test` VALUES (8, '1', '1');
INSERT INTO `case_test` VALUES (9, '1', '1');
INSERT INTO `case_test` VALUES (10, '1', '1');
INSERT INTO `case_test` VALUES (11, '1', '1');
INSERT INTO `case_test` VALUES (12, '1', '1');
INSERT INTO `case_test` VALUES (13, '1', '1');
INSERT INTO `case_test` VALUES (14, '1', '1');
INSERT INTO `case_test` VALUES (15, '1', '1');
SET FOREIGN_KEY_CHECKS = 1;
5.1.2、case_data 表
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for case_data
-- ----------------------------
DROP TABLE IF EXISTS `case_data`;
CREATE TABLE `case_data` (
`case_id` int(11) NOT NULL,
`id` int(11) NULL DEFAULT NULL,
`test_data` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`case_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of case_data
-- ----------------------------
INSERT INTO `case_data` VALUES (2, 1, '{\'path\':\'/ufo\'}');
SET FOREIGN_KEY_CHECKS = 1;
5.2、表配完这个就可以直接运行了
这个文件
5.3、未配置报错(必须要配置可以链接的数据库,用例可以不写sql,但必须得配置)
6、日志储存文件路径配置(产生新日志)
复制日志文件夹的绝对路径
配置到项目配置文件里面
再次运行就会产生日志文件
7、钉钉配置
python操作钉钉机器人推送消息
复制钉钉文件的路径 D:\python2022\pytest_api_yaml-master\tool\dd_push.py
修改项目配置钉钉路径
修改自己钉钉机器人的token
报告推送
三、使用教程
1、环境信息配置
环境名字随便取,其他格式暂时不运行自定义
项目信息配置自定义的环境名字
2、token信息写入环境配置里面
token的获取大家是不一样的,只要写再token=后面就行
3、执行用例目录文件配置
目录层级排除(只支持二级),排除test,fastapi_test目录下所有的用例文件(这里是直接写目录名就行)
exclude_dir=['test','fastapi_test']
文件层级排除(这里的写法要case/+路径,不然找不到目录)
exclude_file=['case/fastapi_test/bill.yaml']
被排除的目录和文件(包含之前的目录排除)
4、用例编写(重点)
#用例(名称)标题
用例标题:
#接口地址
path: /test
#请求方法
method: get
# 备注信息
remark: 这个是使用模板
# 是否运行
is_run: True
# 前置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":$.tq_data.id,
"projectNo": "320SF000206004",
"name":$.tq_data.name,
"time": random_time(),
"str": random_str(6),
"int": random_number(5),
# 请求参数sql为有返回值查询
"sql": sql-SELECT title FROM case_test where id=2
}
#从接口返回结果提取哪些字段和提取表达式,比如从返回数据提取用户id和name
extract_key:
id: $.id
name: $.name
#断言表达式
# 除了数字类型比较,其他的字符或者表达式全部带上引号,表达式必须要写在后面(必须按照格式来)
assert_expression:
# 断言sql为有返回值查询
["'12' in '123'", '"ig" == "$.ig"', '1=="sql-SELECT title FROM case_test where id=2"']
参数list:
path: /list
method: post
remark: 参数list的参数替换模板
is_run: True
precondition_sql:
data:
#list请求参数使用和json的无区别
[$.waybillid,random_number(5)]
extract_key:
assert_expression:
['"成功"=="$.msg"']
参数嵌套替换:
path: /ccsstthh
method: post
remark: ctms发车
is_run: True
precondition_sql:
data:
{
#参数嵌套的不影响之前的参数替换使用
"a":$.a,
"b":"bba",
"shiftIdList":[
{
#参数嵌套这种格式暂时只支持[{},{},{}],在参数嵌套里面使用需要加上^^
"id":^$.shiftid^,
"sendTime":^random_time()^
},
{
"waybillId":^$.waybillid^
}
]
}
extract_key:
assert_expression:
['"成功"=="$.msg"']
5、执行入口
自行控制是否启动报告服务