14

我们希望设置自动化作业(通过Jenkins)以在第三方 API 已关闭或他们部署了不兼容的 API 时发出警报。

我说的是针对真实HTTP APIs而不是模拟进行测试,但是由于我们已经使用 编写了模拟rspec,我不确定我们是否应该通过编写两个独立的测试来重复这项工作。

以前有人有过这种经验吗?(我不限于Ruby/Rspec其他工具是否可以提供帮助)

4

4 回答 4

5

你看过录像机吗?使用它,您可以“记录测试套件的 HTTP 交互并在未来的测试运行期间重放它们,以实现快速、确定、准确的测试”。在测试来自外部 API 的预期响应时,我已经将它与 RSpec 一起使用,并且认为它很棒。如果您认为这对您有用,我鼓励您查看带有

不确定它的 Jenkins 集成,但是当我使用 VCR 时,我自动化了一些常规任务,在这些任务中我需要使用 When 来访问 API “Ruby 中的 Cron 作业”)。不是真正连续的,但有点自动化。

于 2013-01-17T12:15:42.877 回答
4

几个月前,当我遇到这种情况时,我做了以下事情:

  1. 模拟 API 并针对模拟的数据编写测试(你已经有了)
  2. 再编写一个测试,从真实 API 获取数据并断言它(仍然)采用相同的形式并包含我们期望的相同类型的数据

我这样做是因为我无法猜测/知道实时 API 将提供哪些内容。

于 2013-01-17T13:30:41.153 回答
3

模拟用于测试您自己的代码,而无需接触真实的 API。你想测试真正的 API。

所以我认为你必须在 RSpec 中编写一组测试,例如对3rd 方 API 进行不显眼的测试。
我所说的“不引人注目”是指跟踪您不会发出意外的“DELETE”API 请求,或者通过单个测试套件运行使用所有每日请求 API 限制。

不知道有没有指定的API测试工具。
至于我,我使用 RSpec 成功地测试了我自己的远程 API/服务器。

于 2013-01-17T09:54:39.907 回答
2

我会对现有的测试套件做两件事,以便它可以实时使用,第一件事是使用 fordescribeitblocks 获取元数据的能力(这里有一篇很好的博客文章)。第二个使用shared_contexts阻止的能力。

首先,使用元数据标记您希望针对真实 API 运行的规范。例如,您想知道这些可以真正运行,例如

describe "Hitting the API with a call", :can_be_real do
  # …
end

然后可以使用 tag 选项从命令行运行这些规范。

第二件事是用真实的东西代替模拟物。这取决于您如何定义模拟,使用的是 abefore还是 a 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)获得所需的控制级别。您可能希望使用其他元数据来标记规范,例如真实运行是否安全,是否可能需要很长时间等。

于 2013-01-23T07:09:15.683 回答