我们希望设置自动作业(通过Jenkins
),以警告第三方API是否已关闭或是否部署了不兼容的API。
我正在谈论测试真正的HTTP APIs
而不是模拟,但是因为我们已经使用rspec
进行了模拟,我不确定是否应该通过写两个独立来重复这些努力睾丸。
以前有人有这方面的经验吗?
(如果其他工具可以提供帮助,我不限于Ruby/Rspec
)
答案 0 :(得分:5)
你看过VCR了吗?使用它,您可以“记录测试套件的HTTP交互并在将来的测试运行中重放它们,以进行快速,确定,准确的测试”。在测试外部API的预期响应时,我已经将它与RSpec一起使用,并认为它很棒。我建议您查看标有vcr的StackOverflow问题,如果您认为它可能对您有用。
不确定它的Jenkins集成,但是当我使用VCR时,我自动执行了一些常规任务,我需要使用Whenever(“Ruby中的Cron作业”)来访问API。不是真的连续,但有点自动化。
答案 1 :(得分:4)
几个月前,当我遇到这种情况时,我做了以下事情:
我是这样做的,因为我无法猜测/知道实时API将提供哪些内容。
答案 2 :(得分:3)
模拟用于测试您自己的代码,无需接触真正的API。你想测试真正的API。
所以我认为你必须在RSpec中编写一组测试,例如第三方API的不引人注目的测试。
“不显眼”是指跟踪,而不是例如发出意外的“DELETE”API请求,或者通过单个测试套件运行来使用所有每日请求API限制。
不知道是否存在指定的API测试工具 至于我,我使用RSpec成功测试了我自己的远程API /服务器。
答案 3 :(得分:2)
我要对现有的测试套件做两件事,因此可以实时使用,第一件使用describe
和it
块的功能来获取元数据(There's a good blog post on it here) 。第二种方法使用shared_contexts
阻止的能力。
首先,使用元数据标记您要针对真实API运行的规范。例如,您想知道这些可以是真实的,例如
describe "Hitting the API with a call", :can_be_real do
# …
end
然后可以从命令行using the tag option运行这些规范。
第二件事是用真实的东西取代嘲笑。这取决于你如何定义模拟,是否使用了before
或let
,以及你嘲笑了多少。作为一个愚蠢的例子,见下文:
require 'rspec'
RSpec.configure do |c|
c.treat_symbols_as_metadata_keys_with_true_values = true
end
shared_context "all my mocks and stubs" do
let(:this) { false }
end
describe "a", :real do
include_context "all my mocks and stubs" do
let(:this) { true } if ENV["REAL_API_CALL"] == 'true'
before do
stub_const( "URI", Class.new ) unless ENV["REAL_API_CALL"] == 'true'
end
end
it "should be real when it's real" do
this.should == true
end
it "should escape things when it's real" do
URI.should respond_to :escape
end
end
当文件通过bin/rspec example.rb
运行时,输出为:
a
should be real when it's real (FAILED - 1)
should escape things when it's real (FAILED - 2)
Failures:
1) a should be real when it's real
Failure/Error: this.should == true
expected: true
got: false (using ==)
# ./example.rb:19:in `block (2 levels) in <top (required)>'
2) a should escape things when it's real
Failure/Error: URI.should respond_to :escape
expected URI to respond to :escape
# ./example.rb:22:in `block (2 levels) in <top (required)>'
Finished in 0.00349 seconds
2 examples, 2 failures
通过env REAL_API_CALL=true bin/rspec example.rb
:
a
should be real when it's real
should escape things when it's real
Finished in 0.00301 seconds
2 examples, 0 failures
因此,您可以通过多种方式更改规范的上下文,从而可以从命令行(因此,Jenkins)获得所需的控制级别。您可能希望使用其他元数据标记规范,例如是否可以安全地运行,是否可能需要很长时间等。