原文标题:Mimic, simple web service stubs for testing

原文: https://github.com/lukeredpath/mimic/blob/develop/README.md

译者注:

fake, stub, mock 三个测试概念老是被混用,它们中文意思分别是

很多技术文章中出现的 存根 的英文原文就是"stub",本文把 stub 翻译成 测试桩

Mimic, 轻量级 Web Service 测试桩

Mimic 是什么?

Mimc 是一个测试工具,当你在对访问 web service 的应用或库做集成测试时,可用来模拟那些 web service 实现。

为什么不用 stub?

目前已经有些比较好的工具,比如 FakeWeb,允许你在做单元测试或功能测试时,在低层次模拟请求响应。但是我们在对代码做集成测试时,希望能做到面面俱到的测试。

Mimic 启动一个能响应 http 请求的真实 Web 服务器,替换你的网络应用程序实际运行所需的 web service。这让你能在接近真实环境的情况下,对各种服务响应作出测试。

当然,因为 Mimic 会对真实 http 请求作出响应,它也能测试 Ruby 语言之外开发的网络应用。

例子

定义一个请求测试桩:

Mimic.mimic.get("/some/path").returning("hello world")

使用 RestClient 访问上述请求:

$ RestClient.get("http://www.example.com:11988/some/path") # => 200 | hello world

定义多个请求测试桩; 注意你可以用不同的方法为同一个 url 定义多个请求。

Mimic.mimic do
  get("/some/path").returning("Hello World", 200)
  get("/some/other/path").returning("Redirecting...", 301, {"Location" => "somewhere else"})
  post("/some/path").returning("Created!", 201)
end

你甚至可以使用中间件 Rack,比如应付身份验证之类的公共测试场景:

Mimic.mimic do
  use Rack::Auth::Basic do |user, pass|
    user == 'theuser' and pass == 'thepass'
  end

  get("/some/path")
end

最后,因为 Mimic 是用 Sinatra 处理请求的,你可以像 Sinatra 应用代码那样定义请求测试桩:

Mimic.mimic do
  get "/some/path" do
    [200, {}, "hello world"]
  end
end

非 Ruby 环境下使用 Mimic

Mimic 支持通过 HTTP REST API 配置生成请求测试桩。所以,只要能发出 http 请求,就能使用 Mimic。

首先,你需要后台启动 Mimic。你只需要一个简单的 Ruby 脚本和 Ruby gem 库 daemons :

#!/usr/bin/env ruby
require 'mimic'
require 'daemons'

Daemons.run_proc("mimic") do
  Mimic.mimic(:port => 11988, :fork => false, :remote_configuration_path => '/api') do
    # configure your stubs here
  end
end

设置 Ruby 脚本的可执行权限,并启动:

$ your_mimic_script.rb start (or run)

启动后,远程配置 api(/api/get 或/api/post)就将生效——这也是可以配置的,因为你要模拟的请求 url 都不能与远程配置 api 的 url 相同,也不能作为远程配置 api 的下级 url。

远程配置 api 支持 JSON 和 PList 请求头格式, 默认为 JSON。你需要为 Plist 格式请求设置 Content-Type 为 application/plist。

下面 Mimic 请求桩定义配置 (使用 Ruby DSL):

Mimic.mimic.get("/some/path").returning("hello world")

对应的 REST API 配置方式为:

$ curl -d'{"path":"/some/path", "body":"hello world"}' http://localhost:11988/api/get

类似的,一个 POST 请求要如下配置:

$ curl -d'{"path":"/some/path", "body":"hello world"}' http://localhost:11988/api/post

远程配置 api 的最后面的动词就是你模拟的 http 请求的方法,http 请求的路径,响应主体,响应状态码,响应头在 POST 数据(使用 JSON 或 PList 格式)中定义。更多例子请看 github 代码中附带的 Cucumber 测试文件。

对上述 REST API 的 Objective-C 封装 也已提供, 你可以用来测试 OSX and iOS 应用。

贡献者

License

作为惯例, github 仓库中的代码使用 MIT license 发布。


↙↙↙阅读原文可查看相关链接,并与作者交流