原文标题:Mimic, simple web service stubs for testing
原文: https://github.com/lukeredpath/mimic/blob/develop/README.md
译者注:
fake, stub, mock三个测试概念老是被混用,它们中文意思分别是
- fake——假的,伪,(形容词),例句:a fake web service
- stub——桩,(名词),例句:a web service stub,稻草人,充气娃娃等都是stub。
- mock——模拟,(动词),例句:mock a web service
很多技术文章中出现的存根的英文原文就是"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发布。