如何创建接口自动化测试中对于第三方系统的接口mock

最近在公司搭建接口自动化框架,但是由于公司B端业务,对接了很多的第三方系统,业务流程:
下游-自己-上游
下游下单调用我们,我们下单在调用上游,上游下单成功返回结果给我们,我们再将结果返回给下游
在接口模拟这种场景时,对于第三方上下游就需要带入参的mock接口,制定好上下游入参规则,当我们传参正确时,整个流程正常返回,当传参错误,调用就失败,形成闭环的接口测试业务流程
我调研了网上mock的方法,但是还是不清晰制定带入参的mock如何做,课程中没有讲这块,尝试了pytest_mock方式:

import mock
import requests
from pytest_mock import mocker


def mock_re(contactsMobile,ordersn):
    data = {
        "method": "post",
        'url': "http://www.suiyi.com/api/order/order/ticket/resendMessage",
        "headers": {"Authorization": "1312"},
        "json": {
            "contactsMobile": contactsMobile,
            "orderSn": ordersn
        }
    }
    return requests.request(**data).status_code

def mock_dd(contactsMobile,ordersn):
    return mock_re(contactsMobile,ordersn)

def test_get_mock(mocker):
    mocker.patch('interface.interpack.testcase.test_mock.mock_re', return_value=200)
    assert mock_dd(1,2) == 200

但是这样好像没办法限制入参,还有找了一些开源的平台项目,像easymock,rap2


这种,借助平台定义好接口参数,再去调用该接口,但感觉用第三方平台生成接口是不不好
所以,想咨询下老师这种mock第三方接口的场景应该怎么做,有没有好的解决方案,用平台还是类似pytest_mock库等自己编写生成,并控制入参

可以模拟自己就是一个三方,写个脚本根据业务场景去模拟;

  • 比如支付:用户发起支付-请求你们的系统-系统调你的接口(正常业务是调三方的接口)-接口可以返回成功、失败、处理中等等
    • 可根据自己需要,模拟各种场景,不用强依赖三方,待自己公司的业务代码测试完成后,再介入三方联调测试。
    • 灵活配置,方便去跑自动化、以及业务测试

是的,就是按照这个思路流程,模拟写一个接口当作是第三方,然后去传参调这个接口,根据返回值判断,我现在问题是怎么样写带控制入参得mock接口,比如,正常这个接口就是要必传参数a,b,但当你传了参数c,跑这个接口返回就报错了,这样
能写一个demo让我看一下吗,思路我清楚了,现在主要不太会实现,上面尝试得两种方式也不知道对不,能给个具体得demo看一下吗,或者给提供一下库或工具

@Pegasus-Yang @911596230 @seveniruby 能也帮忙看看吗

思路上面有老师已经说了,我说一下实现吧,以测试环境为例:

  • 第一步,我做个开关,是否要开启mock模式(要或者不要都行)
  • 第二步,做实现了,大概思路是比如我访问第三方系统的http://ceshiren.com/order下单接口,那么当我开启了mock模式,我就访问你的写的订单接口:http://mysql.com/order
  • 第三步,自己的订单接口跟第三方接口的参数一样,里面的处理逻辑你可以设置为验证参数,可以异常返回,可以超时不返回,模拟各种异常,测试你系统的处理。自己写接口可以用python的flask/django/fastapi等等
  • 第四步,怎么设置转发,两种思路,一种在ngix处理,当我请求order接口就转发到请求你写的接口,最好是做成开关的形式,动态插拔;第二种思路,是开发根据mock模式的开关,然后判断请求哪个接口,理论上根据开关更改host就好了

明白了,但自己写接口用flask去写,这样有点复杂了,搭建东西太多,一下子也不太好上手啊 :sweat_smile:,有没有更好得方法,因为我只需要创建一个接口,这个接口能按照真实第三方接口得入参和返回值就行,我看了网上得一些开源平台,rap2,yapi等,但是好像试了没能校验入参,能有好的别的方法工具么,想快速先把这个东西实现了,后面再可以按照你说的方案搭建

你要校验入参,感觉除了自己弄,基本上没啥其他的办法。flask不用数据库,简单点很快实现,推荐用fastapi,感觉会更加简单

没有实际的接口请求示例,我也是看的云里雾里。我假设你需要的是一个按需mock的服务。

可以使用mitmproxy的代理功能,他可以把请求直接转发给上游接口,再把真实结果转发给下游。也可以根据下游调用时候的需要mock的接口,按需mock直接返回,而不再转发

fastapi我去看一下

思寒老师,这块用mitmproxy已经可以实现mapremote,在请求指定接口时转发到第三方的上游接口,但是研究了下,也看了下课程中讲的,在使用mitmproxy时实现代理需要使用mitmdump -p -s script.py 去启动代理,并且本地也要开启代理的端口
问题: 但是在写好接口自动化脚本后,跑脚本的时候,怎么去应用mitmproxy代理呢,跑用例的时候不能再去启动mitmdump -p -s script.py 启动代理,然后本地开启代理端口吧,所以就是在接口自动化中怎么去应用mitmproxy能够跑用例时候,需要转发的时候自动代理转发请求实现mock呢?

我最近也在用mitmproxy做mock服务,mitmdump只允许在主线程中启动,你可以先启动好mock,然后用例去调用mock服务即可。不用伴随着用例去启动。相当于是做个独立的服务存在。这是最简单的办法。次级的办法是用popen去创建新的进程去启动他。

我前段时间做过一次mock的测试,用的是moco-runner,自己只需要维护一份json格式的文档就行了,在json中定义好请求和返回的信息,可以直接在python启动服务,然后进行测试
image
不知道我的这种方法对不对,也欢迎大家指出来,大家一起探讨

嗯,用第一种方法实现了,感谢思寒老师,

这个我看了,现成的框架工具,不过好像是java的服务,很好能管理多个文件请求及响应,也能在单测中控制服务启停,不过得熟悉Java,应该挺好用得

我今天也研究了一下mitmproxy,还没搞太明白,我们的接口文档已经出来了,但是开发还没有完成,我需要用mock去模拟接口的返回信息,这种用mitmproxy应该怎么做呢;我自己理解是配置一份json文件,配好请求和相应的信息,后面该怎么做还没研究明白,可以解答一下吗

可以参考下官方文档,根据你得需求取过滤request参数或地址,你用json也可以,相当于实现maplocal,直接定义到代码中也可以,然后mitmdump启动代理,运行你的脚本。
类似

def request(flow: http.HTTPFlow) -> None:
    if flow.request.pretty_url == "http://xxx":
        flow.request.url = "http://xxx"
        ctx.log.info(repr("url: "+flow.request.url))
        ctx.log.info(repr("method: "+flow.request.method))