【云+社区年度征文】最简单没有之一的挡板程序FLASK实现

所谓挡板程序,就是在被测程序和其依赖的测试环境之间建立一个挡板,模拟依赖环境的返回,降低其对环境的依赖性。挡板程序一般用来解决以下问题:

  1. 测试环境不具备,比如说有些数据要用真实的发票,实际又找不来那么多种真实的发票,怎么测试呢?可以用挡板。
  2. 产品之间解耦。产品A与产品B深度耦合,A有问题了B就用不了,A不稳定的情况下,如何测试B呢?可以用挡板。

开发一个挡板程序可以很简单,有多简单呢?简单几行代码就可以搞定静态地址、get请求、post请求的返回。

代码语言:javascript
复制
from flask import Flask, request
#创建Flask实例
app = Flask(__name__)

#通过路由模拟静态返回
@app.route('/hi')
def index():
   return 'hi, 服务起来啦'

#模拟get请求,参数不区分大小写
@app.route('/geta', methods=['GET'])
def get():
  return request.args.get('a')
    
#模拟post请求
@app.route('/postb', methods=['post'])
def post():
  return request.form.get('b')

#启动服务
if __name__ == '__main__':
    app.run('127.0.0.1', 9000)

上面是一个基于Flask的Python程序,在命令行中输入以下命令,就可以启动挡板服务。

代码语言:javascript
复制
python run.py

要运行这个程序,首先要安装python (Flask支持 Python 3.4 及更高版本的 Python 3 、 Python 2.7 和 PyPy,我用的是python 3.7),然后安装Flask包,就可以使用了。

代码语言:javascript
复制
pip install Flask

服务启动成功后,我们可以用浏览器访问服务地址(http://127.0.0.1:9000/hi)验证:

浏览器中访问静态地址验证服务启动成功
浏览器中通过地址传参数验证get方法返回

我们还可以使用工具postman、curl等验证通过form提交的post请求能够被正确返回:

Mac上使用curl验证post方法返回值

上面是最简单的场景下挡板服务的实现。在实际项目中,我们往往需要处理更加复杂的情况,比如说数据的加密,各种参数和数据传递的处理,等等。因此,在项目中的挡板测试服务,一般需要以下步骤:

  1. 了解要实现的挡板场景,对业务有个基本的了解;
  2. 和相关研发人员沟通,获取接口文档,这样才能正确的模拟各接口的输入和输出;
  3. 设计挡板测试用例,根据需要实现底层的支持,如数据加解密的实现,是否需要打印日志供问题定位使用,等等;
  4. 实现挡板服务;
  5. 设计挡板测试数据;
  6. 与研发人员沟通,将被测系统的地址切换为挡板服务地址,进行联调,保证业务畅通;
  7. 进行挡板测试。

各个项目的具体挡板实现需求不同,此处就不展开叙述各个部分的实现。本文旨在说明挡板服务的入门并不难,投入成本不高,却可以解决项目中的某些痛点,性价比挺高。但是,挡板测试并不能代替功能测试,只是一个辅助手段。模拟一个全量的依赖系统响应返回的成本是很高的,代价在于穷举各种场景和返回值。在一般的项目中,模拟一个完全的挡板服务的代价,高于其产出,因此挡板测试不能完全取代功能测试。特殊情况下除外哈!即使完全模拟了被依赖系统的返回,去掉挡板后的真实业务测试还是建议要走一遭的,以保证业务的完整性和正确性。