MOCK服务小结

前言:

说到mock,大家会想到单测中的mock,测试同学会想到httpmock服务等。

mock的作用:程序运行过程中,设定过滤规则及返回值,来满足固定的数据解析,解决不容易构造或者获取的数据对象。

mock有哪些工具:

前端js端拦截mock.js

web端的mock工具apiary、swagger、alibaba-rap等

Java阵营中主要的Mock测试工具有JMock,MockCreator,Mockrunner,EasyMock,MockMaker等,在微软的.Net阵营中主要是Nmock,.NetMock

WEB应用MOCK:

web端的mock相对成熟,以http请求拦截为主,进行请求的数据的返回,从上面可以看到有2种方式本地拦截和proxy拦截

单一方式缺点:

1、本地拦截,无法模拟请求时延等特殊场景,本地数据维护复杂

2、proxy拦截,所有测试case环境需要做host处理,域名切换问题

组合方式优势:

1、使用者不需要host指定

2、可以模拟复杂场景(数据返回,时延,超时等)

3、模拟数据入口统一复用性高

组合的方式缺点:

1、controll层返回页面时,mock页面,业务改动即需变更,无法验证到真正生成页面逻辑,这种mock对测试没有价值

2、返回数据格式多样时,mock多种数据格式,服务接口复杂,使用成本较高,不利于业务快速迭代

web端的mock能解决80%的业务场景,但是真正的数据交互过程不能得到验证。

所以在web之外能不能做深度的mock服务,来满足自动化测试过程中业务逻辑的验证,减少web端mock服务的复杂性。

RPC服务的mock

RPC服务自动mock,如何帮助测试或开发同学快速mock一个scf服务?

首先,通过mock我们可以解决两大类问题:

一、第3方服务依赖:

1、一些服务写场景的覆盖(测试回归阶段,如被测服务调用写操作会产生脏数据的问题,mock掉依赖的imc写接口,返回已有信息,同时完成被测服务的整个逻辑验证)

2、服务深度依赖的问题(被测试服务A,A依赖B,B依赖CD,mock掉B解决了深度依赖的问题)

二、外部服务复杂,MOCK自身部分接口:

3、数据流转状态的模拟 (如担保支付调用微信返回状态)

stp帮你一键生成mock服务

stp工具提供:

1、界面操作创建mock服务

2、接口操作批量创建mock服务

3、服务接口数据在线维护,实时生效

4、mock服务提供下载,根据环境情况进行部署

具体流程如下:

接口使用方式:

接口定义:

createScfMock

updateScfMock

参数内容:

{"implClass":"","intfCalss":"","methods":[{"methodName":"","returnRes":"","stat":0}],"pom":"","realServerIp":"","realServerPort":"","serviceName":""}

参数描述:

类型

参数

描述

String

 pom

pom.xml字符串

String

 serviceName

部署服务名

String

 implClass

接口实现类

String

 intfCalss;

接口类例如:com.ITest

String 

realServerIp

真实服务ip

String 

realServerPort

真实服务端口

String 

methodName

方法名称

String 

returnRes

返回值

int

stat

mock状态 0关闭,1打开

创建接口返回结果:

{"errorCode":"0","ip":"","port":"","serviceName":""}

类型

参数

描述

String

errorCode

0成功,1失败,2服务被占用

String

serviceName

服务名称

String

ip

服务ip

String

port

服务端口

更新接口返回

[{"stat":true,"info":""}] 

类型

参数

描述

String

stat

true/false

String

info

失败方法信息

例子:

创建

请求如下:

http://stp.corp.com/createMock?jsonData=[{"serviceName":"test","realServerName":"phone","creater":"hhh","implClass":"PhoneRecordService","intfCalss":"com.phone.IPhoneRecord","methods":[{"methodName":"getRec","returnRes":"11","stat":0}],"pom":"<dependency><groupId>com.spat</groupId><artifactId>com.phone</artifactId><version>1.2.23-SNAPSHOT</version></dependency>","realServerIp":"0.0.0.0","realServerPort":"21010"}]

返回结果:

[{"errorCode":2,"info":"","ip":"192.168.183.14","port":"19999","serviceName":"hhtest"}]

更新

请求如下:

http://stp.corp.com/updateMock?jsonData=[{"serviceName":"hhbtest","realServerName":"wphone","creater":"name","implClass":"WPhoneRecord","intfCalss":"com.s.IPhoneRecord","methods":[{"methodName":"getRecordList","returnRes":"11","stat":0}],"pom":"<dependency><groupId>com.</groupId><artifactId>com.phone</artifactId><version>1.2.23-SNAPSHOT</version></dependency>","realServerIp":"0.0.0.0","realServerPort":"21010"}]

返回结果:

[{"stat":true,"info":""}]  通过无方法信息,失败会返回方法名称

后记:

    一点点实践,希望对大家有所启发!

### Mock依赖的定义 Mock依赖是一种在软件测试中使用的模拟技术,其核心在于创建虚拟的对象或服务来替代真实的外部组件。这种技术主要用于解决不同单元之间的耦合问题,使得开发者可以在不依赖真实环境的情况下进行独立测试[^1]。 具体来说,当一段代码对外部资源(如数据库、第三方API或其他模块)存在依赖关系时,可以通过Mock技术构建一个假的依赖对象。该对象会模仿真实依赖的行为,并提供预设的结果,从而允许测试过程专注于当前逻辑而不受外界影响[^3]。 --- ### Mock依赖的作用 #### 1. **减少测试复杂度** 通过Mock依赖,可以将复杂的外部交互简化为可控的输入输出行为。这有助于隔离待测代码的功能部分,使其更容易理解和调试[^2]。 #### 2. **提高测试效率** 在实际开发场景中,某些依赖可能尚未完成或者运行速度较慢(例如远程服务器请求)。此时利用Mock技术可以快速构造所需的响应数据,无需等待依赖方的工作进度,显著提升开发和测试效率[^4]。 #### 3. **增强测试稳定性** 真实的外部系统可能会因为网络波动、性能瓶颈等原因导致测试失败。而Mock则提供了稳定一致的反馈结果,使自动化测试更加可靠[^1]。 #### 4. **支持多种测试层次** 除了常见的单元测试外,在集成测试甚至端到端测试中也可以引入Mock机制。例如,在集成测试阶段可以用它代替未就绪的服务;而在更高级别的测试里,则可用来验证特定边界条件下的系统表现[^3]。 以下是基于Python的一个简单例子展示如何使用`unittest.mock`库来进行依赖项的模拟: ```python from unittest import TestCase, main from unittest.mock import MagicMock class PaymentProcessor: def process_payment(self, amount): """假设这是个需要调用外部支付网关的方法""" pass def calculate_and_pay(order_total): processor = PaymentProcessor() tax_rate = 0.1 total_with_tax = order_total * (1 + tax_rate) processor.process_payment(total_with_tax) class TestPayment(TestCase): def test_calculate_and_pay(self): payment_processor = PaymentProcessor() payment_processor.process_payment = MagicMock() # 使用MagicMock替换原始方法 calculate_and_pay(100) # 假设订单总额为100元 # 验证process_payment是否被正确调用了 payment_processor.process_payment.assert_called_once_with(110) if __name__ == "__main__": main() ``` 在这个案例中,我们并没有真正连接任何银行系统去处理付款操作,而是借助了`MagicMock`伪造了一个理想化的执行路径。 --- ### 总结 综上所述,Mock依赖不仅能够有效降低系统的整体耦合程度,还能极大地方便各个层面的测试活动开展。无论是为了加速迭代周期还是保障产品质量,这项技能都值得每一位工程师深入掌握[^4]。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hhb200766

菩提本无树

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值