在测试中,经常遇到下面这种情况:被测对象有时会依赖一些其他对象,比如依赖外部系统,或是所需场景难以模拟。这种情况下,常常会影响测试的速度和稳定性。有时,由于依赖对象无法工作,还会阻塞测试,影响上线时间。为了规避这个风险,常常会使用假对象,来代替真实的对象,很多人习惯统称这种方法为Mock。在测试理论中,其实有一个更精准的概念,叫Test Double。翻译成中文,是测试替身。
Test Double可以进一步细化为:
1.Dummy Object
2.Test Stub
3.Test Spy
4.Mock Object
5.Fake Object
经过几篇文档的阅读和总结,作者分析了一下这些概念的意义和区别。
Dummy Object
中文是 傀儡对象。接口测试中,参数中必须传入某对象,而该对象并不会影响测试。
Fake Object
中文是 假对象。是将function重写,不管原有的内部实现方式,目的更着重在让原来不容易被执行或缓慢执行的对象通过这种方式更便捷执行。
Test Stub
中文是 测试桩。Test Stub常用于响应待测系统的请求,然后返回特定的值。接下来,这个值会对待测系统产生影响,然后我们就在测试用例里面去验证这个影响。和Fake Object很类似,区别是,Test Stub需要具有真实依赖对象的很多特性。
Mock Object
与Stub相比,区别是,Stub更偏向于返回期望的数据,而Mock偏向于行为。
Spy Object
与Mock很类似,区别是,Spy不需要对数据进行验证,Mock需要。
参考文章:
https://martinfowler.com/bliki/TestDouble.html
https://stackoverflow.com/questions/3459287/whats-the-difference-between-a-mock-stub
接着,作者想介绍几种实际工作中,用得到的Test Double方法。
方法一:采用python+flask,制作假接口,通过调用假接口获得返回值或进行模拟真操作的行为。
demo代码:
# !flask/bin/python
# -*- coding:utf-8 -*-
from flask import Flask, jsonify
from flask import request
mockResponse = Flask(__name__)
@mockResponse.route('/mockTest/mockTestGet.json', methods=['GET'])
def mockTestGet():
data = 'mock GET mothod successfully !!!'
return jsonify({"code": 200, "data": data})
@mockResponse.route('/mockTest/mockTestPost.json', methods=['POST'])
def mockTestPost():
request_param = request.json
print('request_param: ', request_param)
data = 'mock POST mothed successfully !!!'
return jsonify({"code": 200, "data": data})
if __name__ == '__main__':
mockResponse.run(host=‘127.0.0.1',port=5000)
执行:
运行python xxx.py,就会起一个服务,可以将mock服务放在测试机上,通过ip+port+接口来调用。
控制台中,能看到调用的情况
测试:
可以通过curl进行测试,也可以根据实际测试需要,选取合适的方式调用。
curl 127.0.0.1:5000/mockTest/mockTestGet
curl -X POST -H 'Content-Type: application/json' -d '[{"skuId":11061036}]' http://127.0.0.1:5000/mockTest/mockTestPost.json
方法二:利用Charles debug,修改请求的request或response
举例,通过该方法,修改一个获取服务端时间的接口的返回值,模拟当前时间再2022年1月1日的场景。
方法三:编写接口,来模拟真实的复杂业务场景
有些业务场景,会包含非常长的业务流;
有些业务场景,会依赖外部系统,外部系统的使用遇到阻塞;
有些业务场景,会使用线上数据,与测试服数据不对应,导致流程卡主,可能需要在流程中对数据进行。
。。。
这些情况,都可以通过绕开原流程的方式,达到相同的效果。这种方法就不细讲了。
总结
本文对Test Double以及平常经常提到的Mock进行了概念性的整理和分析,然后对日常使用过的几种方法进行了演示和介绍。