接口测试 python 接口自动化测试框架

tianfuzhiguo · 2020年08月11日 · 最后由 49875183 回复于 2022年01月19日 · 4787 次阅读

源码地址:https://github.com/tianfuzhiguo/shimo
由于 github 不支持大文件上传,打包好的客户端放在百度网盘上
链接: https://pan.baidu.com/s/1Adi3zzwfpojzUZecTkIFOQ 提取码: ffij

一、前言
这是一个基于 python 的接口自动化测试项目,使用 excel 管理测试用例,客户端操作,使用过程中基本不需要关注代码。设计中遵循以下原则:简单、直观、覆盖常用场景。
二、基本结构和代码目录
项目包含 4 个部分,配置文件、用例文件、时默.exe、jenkins.exe,使用时配置文件和用例文件需在同一目录下。

代码目录

三、功能说明
项目可以在 IDE 中运行也可以使用项目中提供的打包工具打包成客户端文件。以客户端为例,双击 “时默 exe” 运行客户端,然后选择用例文件。从加载用例文件开始将会对文件和接口进行 3 重校验,只有当上一层校验通过才会进入下一层校验,否则客户端会给出相应提示,本次测试或本条用例结束:
1)模板校验
校验配置文件:主要是校验一些数据库和邮件相关的变量是否存在;

校验用例文件:如下图所示,第 2 行是关键字,

后台会自动校验这些关键字是否存在、顺序是否正确、数量是否对应(其中的某些部分的数量要求相等,下面有详细说明)。模板校验通过则进入合法性校验。

2)合法性校验
校验请求参数、表达式、SQL 语句、数据库连接等信息是否合法,如:sele * from user 会被标注为合法性校验失败,置结果为 skip,该条用例不再运行(对下一条用例进行合法性校验,如果有的话)。合法性校验通过则进入下一步的结果校验。

3)结果校验
结果校验就是平常所说的接口测试了,校验预期结果与接口响应是否一致,提供多种校验方式,下面有详细说明。校验通过置结果为 True,否则置结果为 False。

四、用例文件说明
用例文件采用 excel,支持.xlsx 和.xls 两种格式,但不建议使用.xlsx 格式,因为程序中处理.xlsx 格式用的是 openpyxl 库,性能比较差。文件包含接口信息,需要校验的数据,校验数据,响应内容,响应头,状态码,数据初始化,数据恢复,接口变量,迭代次数等等。

name~header 是接口信息,支持 4 种请求方式:get、post、put、delete。

part101~part301 是需要校验的数据
section101~section301 是对应的预期结果
这部分分为 3 种不同的校验方式:

Part101~section101:固定值校验
Part101 填写 JSONPATH 如 ['sites'][0]['name']
Section101 填写一个固定的预期结果如:helloworld

Part201~section201:数据库校验
Part201 也是 JSONPATH,如 ['sites'][0]['name']
Section201 这时候填写的不再是一个固定的值,而是从数据库中查询出的数据,可以这么写:select 'helloworld'
需要注意的时候,如果用例中需要写 sql 语句(不仅此处),那么首先需要选择数据库

Part301~section301:校验数据是否入库
有时候在接口请求之后要校验数据是不是真的入库了就可以使用这部分校验
Part301 填写 sql 语句
Section301 填写预期结果

以上 part101~section301 部分为精确校验

模糊校验:
如果不想进行精确校验,只想看某些值是不是包含在接口响应中或响应头中,则可以使用响应断言 resText 或 resHeader。

表达式:
以上校验通常可以满足大多数场景,但有些场景不能很好的满足,如,我可能想校验响应中的某个列表的长度,或者某个字段是不是手机号,这时候需要使用表达式进行校验,这里的表达式其实就是一句 python 代码,如我想校验接口响应中的列表长度则可以这么写:len(r.json()['sites'])==3,此处需注意:程序中的接口响应对象是 “r”。

数据库初始化、数据恢复、动态参数:
这三部分都是 sql 语句
顾名思义,数据初始化是在接口请求之前对数据库进行的初始化操作,数据恢复是在接口请求之后对数据库进行的恢复操作。
动态参数最初则是基于这样的考虑,有些接口的请求参数不是固定的,那么我们就需要从数据库中实时获取,假如参数 ID 是自增的,我们实时从数据库中查询出最新的 ID 赋给参数列表,可以这么写:select ID from XX where XX,参数列表中使用这个查询出的 ID 需要这么写:{“ID”:”${ dyparam001 }”},当然动态参数不仅仅用于自增参数,任何从数据库中取出的数据都可以用作动态参数,如使用 sql 随机一个手机号或者调用 md5 函数对某个值进行加密。

${变量名},这是本项目中变量的引用格式,项目中存在 3 种变量,用户变量,动态参数和接口变量,都使用相同的引用格式。

用户变量:
用户变量在配置文件中设置,作为全局变量使用。

接口变量:
很多情况下接口之间会存在依赖关系,如其他接口依赖于登录接口,这时候就要设置接口变量。如 B 接口依赖 A 接口中的某个 [‘token’] 字段,则可以在 A 接口的 key001 填写 [‘token’] 在 value001 中填写 token,key001 是依赖的字段,value001 是给这个字段设置的变量名,在 B 接口中就可以用 ${token}的形式来调用这个变量。

信息头管理器:
信息头管理器可供后续接口隐式调用,还是以 AB 两个接口为例,如果 B 接口请求时需要带请求头,当然可以在 B 的 header 中直接填写,但如果 B 之后的接口 CDEF……都需要使用相同的请求头,那么这时候就可以用到信息头管理器了,可以在 A 的信息头管理器中填写{“token”:”${token}”},如果 B 中没有填写 header,那么 B 就会引用 A 的信息头管理器,如果 B 中填写了请求头,那么信息头管理器在 B 接口中就不起作用了。

重新加载文件或者点击刷新按钮可以清除/初始化以上 3 种变量。

数据库:
数据库信息是在配置文件中配置的,支持 3 种数据库,oracle,sqlserver.mysql
项目中预置了 3 个数据库:DB1,DB2,DB3,也可以在配置文件中自定义数据库,使用 ${}形式调用即可。

迭代次数:
需要注意的是迭代次数为 0 即该条用例不执行。

模板中的很多列都可以根据实际需要增加或删除,如,我想校验 5 个字段,那么在 part101 后面加几列就可以了,同时在对应的 section101 后面也加相同的列数;如果用到两个动态参数,就在 dyparam001 就在后面加一列,使用 ${dyparam002}引用。

五、客户端
项目打包了两个客户端:"jenkins.exe"和"时默.exe"
jenkins.exe:
用于集成到 jenkins,使用批处理文件的方式执行即可。
时默.exe:
这是平时测试使用的客户端,可以单个、批量、全量执行接口用例;可以定时执行接口用例(全量);统计接口执行情况;发送测试报告;提供普通和简洁模式(只在窗口打印异常信息)。使用过程中如果配置文件或用例文件的信息有改变,保存之后客户端即可识别不用重新运行客户端或重新加载文件。

解析 JSON 按钮实现接口响应解析成 jsonpath+value 的形式,便于用例文件中数据校验的填写。

接口用例执行完成后,点击 excel 报告和 html 报告,可查看此次接口执行的报告,便于后期接口测试的分析。
在这里插入图片描述

在这里插入图片描述

执行接口报错后,我们可以点击查看日志按钮,查看执行的接口的请求,响应的信息进而分析接口出错原因。
在这里插入图片描述

共收到 13 条回复 时间 点赞

请问一下用例里面的表达式是什么意思?

我把使用说明补充到贴子里了,里面有对表达式的解释。

虽然样式丑了点,但我还是看完了,先点个赞先!

在公司的项目用了一下,总体感觉挺简单直观的,功能方面到目前为止也都能满足,只是源码有些看不懂啊,可以加下微信或 QQ 吗。

shituantuanya 回复

627982310

宠儿i [92年 大龄阿姨的求助帖] 接口用例维护 中提及了此贴 09月01日 10:40

小哥哥厉害了

from common.utils.Util import * 在 untils 中没有 Util 这个包

sm.py 是程序入口,这个入口没有在源码中找到!

匿名 #11 · 2021年03月04日

在公司的项目用了一下,总体感觉挺简单直观的,功能方面到目前为止也都能满足,只是源码有些看不懂啊,可以加下微信或 QQ 吗。

想跟大佬学下,这个帖子啥都没看到,可以再更下开源地址吗?

13楼 已删除
仅楼主可见
仅楼主可见
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册