接口测试 利用 YAPI 和持续集成 CI 工具进行接口自动化测试

dive · 2019年09月05日 · 最后由 dive 回复于 2021年01月23日 · 553 次阅读

新版已经修改为并发的模式,可以同时测试多个测试集合,极大提高了速度

YAPI 是什么

YAPI 是一个高效、易用、功能强大的 api 管理平台,可以在上面进行接口的集中管理,并且支持直接导入和自动更新 swagger 的接口数据。

YAPI 导入 swagger 的接口数据

目前大多数的开发写接口文档都会使用 swagger。YAPI 很好的兼容了这点,可以直接从 swagger 导入数据。
首先在 YAPI 中创建一个项目,然后选择数据管理,如下图所示,导入 swagger。

如何获取 swagger 的 json 连接呢。swagger 有 2 个版本,获取方式分别如下图所示。


编写测试用例

导入完成之后,有些接口可能需要配置一些请求头之类的,这个就需要单独调整了。目前 swagger 导入的时候,不会导入认证用的请求头信息。这就需要你自己调整了。这里就不过多的描述了,可以去看 yapi 的文档。

配置完接口之后,切换到测试集合标签。在这里添加测试集合。把之前的接口添加进来。通常先添加登录接口,获取认证,然后再添加其他的接口。

YAPI 可以传递请求参数的,并且是由上至下的请求顺序。所以顺序很重要。这里有官方文档可以参考。这里我附上地址供参考:YAPI 测试集合教程

添加测试环境

有时候我们会有多个环境,比如测试环境、开发环境、预发布环境、生产环境等。在项目的设置中,我们可以添加多个环境,并且配置一些这个环境的全局参数,比如如果有 AB 测试,是通过 Header 区分的,就可以在这里配置。界面如下图所示:

接入 CI 实现自动化

编写好之后,需要先运行一次,测试一下看看自己编写的测试用例是否通过,通过了,就可以接入到 ci 中运行了。在测试集合界面选择服务端测试,可以得到一个链接,如下图所示。

这里可以用脚本或者其他的程序通过 get 请求来请求这个 URL,实现自动化。这里我写了一个插件,并且做好了 docker 镜像,可以直接使用,附上 github 地址:drone_yapi_test

初学 go 语言,代码写的有点烂,欢迎大佬 pr

插件的使用方法很简单。直接 docker 运行的话,就是下面这样:

docker run --rm \
  -e PLUGIN_HOST=http://yapi.com.cn \
  -e PLUGIN_TOKEN=ab1058076e0945cf14 \
  -e PLUGIN_ID="11,31,15" \
  -e PLUGIN_ENV="env_11=网关地址" \
  registry.cn-hangzhou.aliyuncs.com/lm93129/drone_yapi_test:latest

这里有 4 个参数。我来解释下:

  • PLUGIN_HOST 这个就是 yapi 的地址,记得地址不能是https://yapi.com.cn/ 这种以/结尾的
  • PLUGIN_TOKEN 这个就是你 yapi 账户的 token
  • PLUGIN_ID 这个是你测试集合的 ID
  • PLUGIN_ENV 这个就是你的测试集合要运行的环境

怎么获取上面的四个参数呢?其实很简单,首先 host 就不用说了。其它的参数都可以通过上面我们获取到的那个 URL 提取出来。我这里的示例上,ID 是有多个的,这里解释下,因为我们可能需要运行多个测试集合,所以当你输入多个 ID 的时候,插件就会按顺序运行每个测试集合。

接入到 drone-ci

由于我用的是 drone 这个 ci 工具,所以这里演示下这个插件在 drone 里面是怎么运行的。drone 中的 pipeline 写法如下:

- name: yapi-test
  image: registry.cn-hangzhou.aliyuncs.com/lm93129/drone_yapi_test:latest
  settings:
    host: http://yapi.com.cn/
    id: [11,19]
    token: ab105800479fdb69cd8f485f86b7776e0945cf14
    env: env_11=网关地址

然后运行的结果呢,就是下面这样:

如果过程中有不通过的接口,ci 就不通过,然后就会触发 ci 的钉钉通知。

接入其它的 ci 程序

对于其它的 ci 程序接入,可以参考上面的 docker 运行方式进行接入。不过要求就是需要支持 docker。

后话

这个插件还是有一些不完善的地方的。以后可能还会更新一些版本,如果有更好的建议欢迎提 issue 和 pr。

之后会写一些 drone 这个持续集成工具的使用。我挺喜欢这个工具的,感觉很方便。
我的个人博客地址:https://fs.tn

共收到 11 条回复 时间 点赞
仅楼主可见
dive #2 · 2019年10月14日 Author
苏眉 回复

https://hellosean1025.github.io/yapi/documents/project.html#%e8%af%b7%e6%b1%82%e9%85%8d%e7%bd%ae
可以参考下这里给的请求配置,写个自定义脚本,支持 Base64 加密的

首先顶一下,我最近也在搞 YAPI 的持续集成,每天手动跑用例太麻烦了,先想用 Jenkins 搞,参考多个博客。配置了构建命令,curl -o Report.html "http://本地 IP 地址/api/open/run_auto_test?id=11&token=6c69778aeaeb4cfb54560854bb87653a0c578994d0c2d7e543e47a10410c1f29&env_17=黑名单预发环境&mode=html&email=false&download=false"
exit 0
,运行成功,但并没有自动生成测试报告,一点反应都没有。
请问大佬,YAPI 的这个https://yapi.com.cn/地址已经无法访问了。需要自己申请域名搞了??

dive #4 · 2020年08月21日 Author
wuwei 回复

https://yapi.com.cn/ 这个地址是一个示范,并不真实存在。这里实际需要修改为你的 yapi 地址,可以是 ip 也可以是域名。比如,你访问 yapi 是http://192.168.1.1:8000 那么这个PLUGIN_HOST=http://yapi.com.cn参数就应该改为PLUGIN_HOST=http://192.168.1.1:8000

dive 回复

嗯嗯好的。我试试,还没接触过 Docker,一直在用 Jenkins。可以学习一波 docker,结合上面的 CI 来搞一波。。我看你开头说的 “新版已经修改为并发的模式” 是什么意思?没太听懂。YAPI 好像不支持多集合并发执行吧。

6楼 已删除
dive #7 · 2020年12月28日 Author

这个不需要安装,可以直接运行的。按照说明,直接启动 docker 就是一次用例运行

dive 回复

好的 昨天弄明白了。 但是发现并发执行测试用例集有些问题
单个运行这个测试用例集是 OK 的,但是同时多个运行就会断言不成功
出现在用例集有比较多相同接口用例,但是参数值不同的情况下

dive #9 · 2021年01月14日 Author
kayie 回复

这个是因为,接口用例在使用用例集的时候,会出现有的用例集跑的速度快,导致调用参数还没生成就开始跑下一个用例集了,然后参数就会错误,这个问题暂时还没优化。这个用例集的并发模式用的是 go 的多线程技术,是同时并发执行的,并不是按顺序的,主要是为了让速度更快一点。之后我再加个选项,可以选择是按序执行或者同时并发执行吧。

后面再看了一下,发现原来是如果测试集包含 delay 接口,用 Yapi 的服务端运行测试集也会这样,它会直接跳过 delay 接口。跟插件没什么关系。 这个问题估计要优化 yapi 本身源码

老铁再问下,如果一个测试集合有多个运行的环境怎么指定?

dive #12 · 2021年01月23日 Author
kayie 回复

这个你运行多个 CI 任务就行了,每个 CI 任务一个环境。这里的多个 CI 任务应该不能并行运行,我没测试过这个情况

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册