原文标题:Mimic, simple web service stubs for testing
原文: https://github.com/lukeredpath/mimic/blob/develop/README.md
译者注:
fake, stub, mock 三个测试概念老是被混用,它们中文意思分别是
很多技术文章中出现的 存根 的英文原文就是"stub",本文把 stub 翻译成 测试桩 。
Mimc 是一个测试工具,当你在对访问 web service 的应用或库做集成测试时,可用来模拟那些 web service 实现。
目前已经有些比较好的工具,比如 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
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 应用。
作为惯例, github 仓库中的代码使用 MIT license 发布。