该框架的特性
1、能够管理系统公共的数据,系统发生变化后方便切换
2、能够实现接口层级的复用,提高接口自动化脚本的可维护性
3、能够实现接口之间的关联,也就是需要结果提取器
4、能够操作数据库处理数据(预制数据、清理垃圾数据)
5、能够实现测试用例集的前置后置步骤(类似 unittest 的 setupclass 和 teardownclass)
6、能够实现测试用例的前置后置步骤(类似 unittest 的 setup 和 teardown)
7、各种灵活的预期结果比较器
8、测试脚本和框架代码完全分离,懂接口测试但是不懂代码的人一天即可完全掌握,超低的学习使用成本
9、支撑 http/https 协议的接口测试
10、灵活的扩展能力(自定义函数和自定义比较器)

准备工作
第一步: 安装 python 3 版本 ,
百度安装教程较好
第二步:安装依赖库

在 cmd 窗口中切换到依赖库文件所在的目录, 输入如下命令即可:pip install -r requirements.txt

第三步:安装 pycharm(社区版就可以)

第四步:下载框架代码, 下载地址:https://github.com/duodongduode/interface_auto_test

第五步:使用 pycharm 打开框架代码, 恭喜你,你已经完成所有的准备工作啦。

执行 demo

core 下面有一个 testcase_run.py 文件


testcase_run.py 文件最后一行代码是设置执行的用例数据,可以是文件夹, 也可以是某个指定的文件, 是一个相对路径,打开这个文件右键执行就好。

执行完成后会生成测试报告

测试报告所在的路径:

使用浏览器打开测试报告

基础使用篇
打开框架代码之后,目前你只需要了解 test_data 目录,test_data 目录下面有三个子目录, common、 api_template、 testcase

common: 定义全局变量的目录,里面有一个 common.yaml 文件, 里面定义全局变量

demo 中定义了系统的基础路径、登陆系统的用户名和密码, 系统对应的数据库配置(数据库配置中的用户名、密码、ip、端口、库名字的变量名称不可变,否则会连接数据库失败),这个文件中可以定义任何你想要的全局变量,名字可以取任意英文名,

api_template:存在被测试系统的 api 定义,定义 api 的请求的 url、方法、请求头、cookie、数据、验证方法、参数提取,这样做的目的是我们在写测试用例时,关注测试用例的数据,而非接口的调用,让接口维护更加容易, 使用的时候不一定非要定义 api 接口模板的,只是说用了会更好维护一点,用例更加简洁一些。

demo 中的接口模板文档说明:
创建收藏夹的接口和删除收藏夹的接口定义

说明:
1、一个文档中可以定义多个接口
2、接口的 name 字段对应的值必须是英文
3、cookie 和 header 字段类似,里面可以定义多组值
4、data:根据接口传递数据接口进行定义
5、verify: 参考比较器章节
6、extractor:参考参数提取章节

testcase:测试用例目录,下面可以建子目录,让用例不同功能块的用例归档到不同的目录中, 一般一个接口建一个用例文件, 一个文件就是一个用例集
一个用例集类似于 unittest 框架特点,有用例集前置步骤 (setupclass) 用例前置步骤 (setup) 用例 (testcase) 用例后置步骤 (teardown) 用例集后置步骤 (teardownclass)

setupclass setup teardown teardownclass 在一个用例集中只能最多有一个 (可以没有), testcase 可以有多个

用例集的执行顺序 setupclass setup testcase1 teardown setup testcase2 teardown ........ setup testcaseN teardown teardownclass
从给定的顺序可以看出,和 unittest 框架的 testcase 类执行顺序完全一致。

框架中的 demo, 可以看出有 4 个测试用例

单个测试用例结构

name:测试用例的名字
variable:定义变量,可以定义多个 如果变量定义在 setupclass teardownclass 结构中,那么变量的作用域就是整个测试用例集, 定义在 setup testcase1 teardown 中的变量都是本用例有效
step: 用例步骤, 一个用例可以有很多个步骤, 一个步骤就是一次接口调用或者数据库操作
type: api 或者 sql

接口的 step:

name: 步骤描述, 可以没有
type: api 或者 sql
api:引用的 api 路径 格式:文件名_接口名 (非必须, 有的话可以减少一些)
url: 接口请求的路径, 会覆盖引用 api 中的 url,如果用例中没有写 url,以引用 api 中的 url 为准
method:接口请求的方法, 会覆盖引用 api 中的 method,如果用例中没有写 method,以引用 api 中的 method 为准
header:接口请求的请求头, 会把引用 api 中定义的请求头合并
cookie:接口请求的 cookie, 会把引用 api 中定义的 cookie 合并
data:发送的数据, 如果是发送 json 数据接口,会替换 api 模板中定义的数据, 其他类型的接口,都会合并 api 模板中定义的数据
verify: 参考比较器
extractor:参考参数提取

sql 的 step:
demo 中的 sql 步骤

name: 步骤描述, 可以没有
type: api 或者 sql
sql: 执行的 sql 语句
verify: 参考比较器
extractor:参考参数提取

验证结果比较器
每个步骤都可以添加参数比较器,但是这个不是必须的, 而且一个参数比较器中可以添加多个验证点

接口的验证结果比较器
接口比较器 demo

上图中有两个验证点
module: 取值模块 response_code(取响应码),header(从响应头取值),cookie(从 cookie 中取值),response_content(从响应数据中取值)
value_path: 取值方式,是 jsonpath 表达式,是响应码这个字段可以不填
operator:值比较方式

操作符 说明
= 比较两个数据相等,可以数字,也可以是字符串, 相等返回 true ,不相等返回 false
!= 比较两个数据不相等,可以数字,也可以是字符串, 不相等返回 true ,相等返回 false

判断两个数 实际值大于预期值, 大于返回 true 否则返回 false
= 判断两个数 实际值大于等于预期值, 大于等于返回 true 否则返回 false
< 判断两个数 实际值小于预期值, 小于返回 true 否则返回 false
<= 判断两个数 实际值小于等于预期值, 小于等于返回 true 否则返回 false
contains 判断 两个字符串, 实际值包含预期值, 包含返回 true , 不包含返回 false
not contains 判断 两个字符串, 实际值不包含预期值, 不包含返回 true , 不包含返回 false
none 判断实际值是 none , none 返回 true , 非 none 返回 false
not none 判断实际值是 not none , not none 返回 true , none 返回 false
expect_value: 期望的值

sql 比较器 demo:

相比接口比较器,没有取值模块一说, 差一点在取值方式
value_path: $.X.Y 表示取 sql 查询结果中的 X 行,第 N 列数据
$ 表示是取 sql 查询结果的整个内容
$.X 表示取 sql 查询结果中的第 X 行数据

参数提取器
每一个步骤中可以有参数提取器,参数提取器非必须,根据需要使用,用于做接口关联,提取的参数作用域可以是全局,测试用例集 、测试用例

接口参数提取器 demo:


图中框起来的是接口参数提取器, 可以看到提取了两组数据
name:提取参数后赋值的变量名
module:取值模块 response_code(取响应码),header(从响应头取值),cookie(从 cookie 中取值),response_content(从响应数据中取值)
value_path: 取值方式,是 jsonpath 表达式,是响应码这个字段可以不填
parameter_level: 提取参数的级别 # testcase(用例级)、 testsuite(测试用例级)、 global(全局)

sql 提取器 demo:

name:参数提取器的名字
value_path: $.X.Y 表示取 sql 查询结果中的 X 行,第 N 列数据
$ 表示是取 sql 查询结果的整个内容
$.X 表示取 sql 查询结果中的第 X 行数据
parameter_level: 提取参数的级别 # testcase(用例级)、 testsuite(测试用例级)、 global(全局)

变量引用
变量引用参考了 jmeter 的变量引用格式,即 ${变量名} , 如果用例级变量, 测试用例集级变量,全局变量中都有对应的名字的变量, 优先级
用例级变量>测试用例集级变量>全局变量
可以在测试数据的任何地方引用变量
demo:

函数引用
函数引用格式 ${{函数名 (参数 1,参数 2.....)}}

目前支撑的函数
函数名 作用 引用方法
random_choice 从给定的值中随机选择一个 ${{ random_choice( 3,4,5,6,10) }} 从 2,3,5,6,10 中随机选择一个值
random_int 生成一个随机整数 ${{ random_int(10,100)}} 生成一个 10-100 之间的随机整数
random_str 生一个指定长度的随机字符串 ${{ random_str(10)}} 生成一个长度为 10 的随机字符串
使用 demo


↙↙↙阅读原文可查看相关链接,并与作者交流