40 likes | 73 Views
为什么需要 Mock. FTest 、 S ervice A 、 Service B 在三台不同机器上 在 FTest 上面测试接口 A ,发起调用 A 机器 A 服务向 CMLB 请求 B 的 ip ,定位到 B 的机器 A 服务调用 B 服务 这时候, B 服务若未完成开发,要测试 A 服务,则需要 Mock 假数据。 Mock 后, A 服务调用 B 服务,并不会真实调用,而是直接返回我们配置的假数据。. Service A. Service B. FTest. cmlb. Mock 数据的需求. 不能修改业务代码。
E N D
为什么需要 Mock • FTest、Service A、Service B在三台不同机器上 • 在FTest上面测试接口A,发起调用A机器 • A服务向CMLB请求B的ip,定位到B的机器 • A服务调用B服务 • 这时候,B服务若未完成开发,要测试A服务,则需要Mock假数据。 • Mock后,A服务调用B服务,并不会真实调用,而是直接返回我们配置的假数据。 Service A Service B FTest cmlb
Mock数据的需求 • 不能修改业务代码。 • 自定义返回数据,粒度为某Service、Method。 • 在执行用例时开启Mock,执行完成后关闭Mock。 • 需要同时支持多协议,如 sRPC、HTTP。 • 同一个Service,只mock某个method,其它的method,还需要调用真实的服务来获取数据。 Service A Service B FTest cmlb
方案 • 若用例有配置对应服务的Mock数据,那么找出该服务所在ip、port • 在所有调用机器上,设置iptable规则,将B服务的ip、port重定向到Mock Server。 • Mock Server收到请求后,解包,再从测试平台查询Mock数据,返回。 • iptable写入有两种方法: • 安装Mock Agent,通过调用Agent来写入 • FTest直接调用salt接口来设置 Service A Service B FTest cmlb iptables Mock Server
举例 • 编写了一个用例,依次调用A、B、C、D,其中服务内分别又调用了S1、S2、H1。 • 假设在用例中已经配置好了右边三个服务的mock假数据,S1、S2为RPC,H1为HTTP。 • 运行用例时,先收集ABCD环境对应的ip,暂且叫 ips1。 • 再收集有mock数据服务,对应环境的ip、port,叫ips2、port2。 • 对所有ips1的主机设置iptable规则,将ips2、port2转发给MockServer的ip、port,其中协议不一样,转发给MockServer的port不一样。例如srpc转给9091端口,http转给9092端口。 • MockServer启动rpc服务(9091端口),和http服务(9092端口),对请求数据解包,获取rpc的service、method,获取http的url、body等。 • MockServer根据解析的请求数据,去测试平台DB中查询,有没有设置对应的mock数据,有就取出来返回,没有就自己请求原服务,获取数据后再返回。(这时候mock server怎么知道原服务的ip、port?)SO_ORIGINAL_DST • 用例运行完成后,再对所有ips1,取消掉之前设置的iptable规则,恢复现场。 FTest A Service1.Method1 Service1.Method2 Service1.Method3 S1 B C S2 Service2.Method1 H1 D Get /user/info/ • 这里只希望mock • Service1.Method1 • Service2.Method1 • H1 • 其它接口还是需要正常调用。