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