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

时间:2016-04-18 22:04:10

标签: 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/时,它会给我一个回复,但我如何存储它?

也可以任何人解释一下

的含义
  

在代理响应前面的新存根中保存响应:

     

(来自此Mountebank documentation

1 个答案:

答案 0 :(得分:9)

如何存储代理结果

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

mountebank代理的常见使用场景是,您在一个正在运行的mb实例上记录代理响应,保存结果,然后使用这些已保存的响应启动mb的下一个实例。你这样做的方法是让被测系统与你进行通信,并在你需要的任何条件下通过mountebank代理进行存根,然后通过以下方式保存响应(以及它们的请求谓词)。向GET发送HTTP DELETEhttp://localhost:2525/imposters/6568?removeProxies=true&replayable=true。您可以通过REST API将该响应的JSON主体提供给下一个mb实例,或者将其保存在磁盘上并使用类似mb --configfile savedProxyResults.json的命令启动mountebank。此时,mountebank正在为请求提供完全相同的响应,而无需连接到下游服务。

代理创建新的存根

您的上一个问题围绕了解proxyAlways模式的工作原理。默认的proxyOnce模式意味着当mountebank代理第一次看到唯一满足谓词的请求时,它会查询下游服务并保存响应。下次看起来满足完全相同的谓词的请求时,它会避免下游调用并简单地返回保存的结果。它仅为相同的请求代理下游一次。另一方面,proxyAlways模式始终向下游发送请求,并保存同一请求的响应列表。

为清楚起见,在您复制的示例中,我们关注请求中的methodpathquery字段,因此如果我们看到两个完全相同的请求结合这三个字段,我们需要知道是否应该发送已保存的响应或继续代理。想象一下,我们第一次发送:

GET /test?q=elephants

methodGETpath/testqueryq=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"
        }
      }
    ]
  }
]

只有一个存根。另一方面,如果我们使用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!"
        }
      }
    ]
  }
]