python - 如何在 Mountebank 中使用代理记录请求和响应?

标签 python mocking imposter-pattern mountebank

我正在使用 Mountebank 创建一个冒名顶替者进程并希望记录请求和响应。为了创建一个 http 冒名顶替者,我使用了以下 CURL 命令,如他们的文档中所述。

curl -i -X POST -H 'Content-Type: application/json' http://127.0.0.1:2525/imposters --data '{
  "port": 6568,
  "protocol": "http",
  "name": "proxyAlways",
  "stubs": [
    {
      "responses": [
        {
          "proxy": {
            "to": "http://localhost:8000",
            "mode": "proxyAlways",
            "predicateGenerators": [
              {
                "matches": {
                  "method": true,
                  "path": true,
                  "query": true
                }
              }
            ]
          }
        }
      ]
    }
  ]
}'
 

我有另一台运行在 http://localhost:8000 的服务器,它正在监听所有到达端口 6568 的请求。

现在我的服务器输出:

mb
info: [mb:2525] mountebank v1.6.0-beta.1102 now taking orders - point your browser to http://localhost:2525 for help
info: [mb:2525] POST /imposters
info: [http:6568 proxyAlways] Open for business...
info: [http:6568 proxyAlways] ::ffff:127.0.0.1:55488 => GET /

我想记录所有的请求和响应,但现在无法完成。当我输入 curl -i -X GET -H 'Content-Type: application/json' http://127.0.0.1:6568/ 它给了我一个响应,但我如何存储它?

谁能给我解释一下

save off the response in a new stub in front of the proxy response:

(from this Mountebank documentation)

最佳答案

如何存储代理结果

简短的回答是江湖骗子已经存储了它。您可以通过查看 curl http://localhost:2525/imposters/6568 的输出来验证这一点。真正的问题是如何重放存储的响应?

江湖代理的常见使用场景是您在 mb 的一个运行实例上记录代理响应,保存结果,然后启动下一个 mb 实例> 使用那些已保存的回复。你这样做的方法是让被测系统在你需要的任何条件下通过江湖代理与你试图 stub 的服务对话,然后通过发送一个保存响应(及其请求谓词) HTTP GETDELETEhttp://localhost:2525/imposters/6568?removeProxies=true&replayable=true。您将该响应的 JSON 正文提供给下一个 mb 实例,要么通过 REST API,要么通过将其保存在磁盘上并使用类似 mb --configfile savedProxyResults 的命令启动 mountebank .json。那时,mountebank 正在对请求提供完全相同的响应,而无需连接到下游服务。

代理创建新 stub

你的最后一个问题围绕着理解 proxyAlways 模式是如何工作的。默认的 proxyOnce 模式意味着江湖代理第一次看到唯一满足谓词的请求时,它会查询下游服务并保存响应。下一次看起来满足完全相同谓词的请求时,它会避免下游调用并简单地返回保存的结果。对于相同 请求,它只代理下游一次。另一方面,proxyAlways 模式始终向下游发送请求,并保存同一请求的响应列表。

为了清楚起见,在您复制的示例中,我们关心请求中的methodpathquery 字段,所以如果我们看到两个请求的这三个字段的组合完全相同,我们需要知道是否应该将保存的响应发回或继续代理。想象一下我们首先发送:

GET /test?q=elephants

方法GET路径/test查询 code> 是 q=elephants。由于这是第一个请求,我们将它发送到下游服务器,它返回一个主体:

No results

无论您将 mountebank 设置为哪种代理模式,这都是正确的,因为它必须至少向下游查询一次。现在假设,在我们考虑的时候,下游服务添加了一头大象,然后我们的测试系统发出了同样的调用:

GET /test?q=elephants

如果我们处于 proxyOnce 模式,大象被添加到真实服务中的事实根本不重要,我们将继续返回我们保存的响应:

No results

如果您如上所述关闭 mountebank 进程并重新启动它,您会看到相同的行为。在您保存的配置文件中,您会看到类似这样的内容(稍微简化一下):

"stubs": [
  {
    "predicates": [{
      "deepEquals': {
        "method": "GET",
        "path": "/test",
        "query": { "q": "elephants" }
      }
    }],
    "responses": [
      {
        "is": {
          "body": "No results"
        }
      }
    ]
  }
]

只有一个 stub 。另一方面,如果我们使用 proxyAlways,那么第二次调用 GET/test?q=elephants 将产生新的大象:

1. Jumbo reporting for duty!

这很重要,因为如果我们关闭 mountebank 进程并重新启动它,现在我们的测试可以依赖于我们将循环通过两个响应这一事实:

"stubs": [
  {
    "predicates": [{
      "deepEquals': {
        "method": "GET",
        "path": "/test",
        "query": { "q": "elephants" }
      }
    }],
    "responses": [
      {
        "is": {
          "body": "No results"
        }
      },
      {
        "is": {
          "body": "1. Jumbo reporting for duty!"
        }
      }
    ]
  }
]

关于python - 如何在 Mountebank 中使用代理记录请求和响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36705088/

相关文章:

junit - 使用 Spring Boot 和 JUnit 从 Controller 类模拟存储库

c++ - 什么是冒名顶替者设计模式?

python - 为什么我的脚本不产生输出,而交互式 session 中的相同代码却产生输出?

python - 如何在 Elasticsearch 中创建之前检查索引

javascript - 为什么此请求不遵循我的 Tornado 重定向?

python - 使用 python 从文件中删除字符串

typescript - 如何使用 Jest 在 TypeScript 中模拟导入的函数?

C++ googlemocks : Getting a stack trace of an uninitialized call