一、框架功能介绍
''' 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、钉钉配置
复制钉钉文件的路径 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、执行入口
自行控制是否启动报告服务