漫谈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自动化测试方面的应用案例实战。

武汉加油,中国加油!