漫谈Tavern之API实战
- 2020 年 2 月 25 日
- 笔记
在API的测试用例编写文章和接口测试维度的文章中体系中,详细的介绍了API测试点编写和涉及到的知识体系。其实在更加细致的角度上,API的测试也是需要考虑它的分层,很多时候我们听过金字塔的模型,以及基于金字塔模型演变后的菱形,后微服务架构模式下新的金字塔的模型,其实就单纯的API的测试角度上,也是存在它的分层,关于分层,在后面的文章中会详细的介绍少。在平常的工作中,我们接触到的API的测试,主要是基于这么几个维度,分别是单个API的验证,外部依赖API的验证,和基于业务场景的API验证。
就单纯的先说单个API的测试,针对单个API的测试,可以从它的功能行,安全性和性能的维度展开测试,安全要考虑这个接口是否进行了参数的加密,和是否增加了反爬虫机制,以及请求限制次数,IP白名单的思想来展开设计测试点,性能主要需要考虑它的并发性,以及基于它是IO密集型还是CPU密集型来验证服务端的资源情况,功能方面的考虑,在服务端的测试技术文章里面有很多详细的介绍。
在本文章中,就以一个具体的案例来演示如何高效的来测试它,被测试的API的源码为:
#!/usr/bin/env python #!coding:utf-8 from flask import Flask,jsonify from flask_restful import Api,Resource,reqparse app=Flask(__name__) api=Api(app) class LoginView(Resource): def get(self): return {'status':0,'msg':'ok','data':'this is a login page'} def post(self): parser=reqparse.RequestParser() parser.add_argument('username', type=str, required=True, help='您的用户名验证错误') parser.add_argument('password',type=str,required=True,help='账户密码不能为空')
parser.add_argument('age',type=int,help='年龄必须为正正数') parser.add_argument('sex',type=str,help='性别只能是男或者女',choices=['女','男']) args=parser.parse_args() return jsonify(args) api.add_resource(LoginView,'/login',endpoint='login') if __name__ == '__main__': app.run(debug=True)
如果需要单纯的验证上面的接口,需要测试具体的点,比如username或者password为空的验证,以及age参数是否为整数,以及sex如果传的不是男或者女的处理,针对这样的单接口的测试场景,我们可以使用Tavern来很轻松的解决该问题,并且把它的测试场景覆盖到。
那什么是Tavern了?Tavern是用于HTTP,MQTT或其他协议的基于pytest的高级API测试框架。我们为什么需要选择它,因为它具备如下的优势:
1、轻量级,简单,高效,即使你没有任何的代码简单,只要按照我下面的步骤,也是可以很轻松高效的完成API的自动化测试
2、容易编写,阅读和理解,它是基于yaml文件来编写API的测试点的,所以看起来很直观
3、可以测试基于HTTP协议以及MQTT和其他的协议
4、它的生态在不断发展和完善中
要使用它,首先需要安装相关的信息,但是必须已经安装了Python环境,建议是Python3.7版本的,它支持Python 2.7 / 3.4-3.7。下来需要安装的库分别是:
pip install pytest==4.5.0
pip install tavern
安装如上的库之后,下来就需要在yaml文件里面编写具体的API了,如创建test_login.tavern.yaml,在里面编写的测试点内容为:
test_name: 测试登录接口 stages: - name: test login api request: url: http://127.0.0.1:5000/login method: POST data: username: 无涯 password: asd888 age: 18 sex: 男 response: status_code: 200 body: username: 无涯 --- test_name: 用户名为空验证 stages: - name: test login api request: url: http://127.0.0.1:5000/login method: POST data: password: asd888 age: 18 sex: 男 response: status_code: 400 body: message: username: 您的用户名验证错误 --- test_name: 密码为空验证 stages: - name: test login api request: url: http://127.0.0.1:5000/login method: POST data: username: wuya age: 18 sex: 男 response: status_code: 400 body: message: password: 账户密码不能为空 --- test_name: age参数不是整数 stages: - name: test login api request: url: http://127.0.0.1:5000/login method: POST data: username: wuya password: asd888 age: asd sex: 男 response: status_code: 400 body: message: age: 年龄必须为正正数 --- test_name: sex参数只能为男或者女 stages: - name: test login api request: url: http://127.0.0.1:5000/login method: POST data: username: wuya password: asd888 age: 18 sex: asd response: status_code: 400 body: message: sex: 性别只能是男或者女
在上面的文件内容中,可以很清晰的看到每个接口的请求信息,以及它的响应数据,和响应数据里面的业务数据。基于yaml文件的格式编写后,在该文件的目录下,执行命令:
pytest -v test_login.tavern.yaml 就会很清晰的执行验证每个测试点,如下图所示:
如果被测试的测试点失败,执行后也会显示出来,比如新增请求http://httpbin.org/get,实际会请求成功,但是status_code我们给500,如:
test_name: 请求httpbin.org stages: - name: test httpbin.org request: url: http://httpbin.org/get method: GET response: status_code: 500
执行后,断言失败的错误信息展示如下图所示:
可以说Tavern非常的简单而且很高效,来测试基于单个接口的验证,即使不会代码也是可以完成API的自动化测试。
感谢您的阅读,后续会逐步的介绍Tavern在API自动化测试方面的应用案例实战。
武汉加油,中国加油!