Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 第三方API的持续监控;轨道测试_Ruby On Rails_Ruby_Rspec_Tdd_Bdd_Vcr - Fatal编程技术网

Ruby on rails 第三方API的持续监控;轨道测试

Ruby on rails 第三方API的持续监控;轨道测试,ruby-on-rails,ruby,rspec,tdd,bdd,vcr,Ruby On Rails,Ruby,Rspec,Tdd,Bdd,Vcr,我们希望设置自动作业(通过Jenkins)以在第三方API关闭或他们部署了不兼容的API时发出警报 我说的是针对真正的httpapi进行测试,而不是一个mock,但是由于我们已经使用rspec编写了mock,我不确定我们是否应该通过编写两个独立的测试来重复这项工作 有人有过这种经历吗? (如果其他工具可以提供帮助,我不限于Ruby/Rspec)mock用于测试您自己的代码,而不使用真实的API。您需要测试真正的API 因此,我认为您必须在RSpec中编写一组测试,例如第三方API的不引人注目的测

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

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

有人有过这种经历吗?
(如果其他工具可以提供帮助,我不限于
Ruby/Rspec

mock用于测试您自己的代码,而不使用真实的API。您需要测试真正的API

因此,我认为您必须在RSpec中编写一组测试,例如第三方API的不引人注目的测试。
我所说的“不引人注目”是指不发出意外的“删除”API请求,或者通过单个测试套件运行来使用所有每日请求API限制

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

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


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

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

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

  • 我这样做是因为我不可能猜测/知道live API将提供什么内容。

    我要对现有的测试套件做两件事,以便它可以在live中使用,第一件事是使用
    description
    it
    块获取元数据()。第二种方法使用
    共享_上下文
    的功能获取块

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

    describe "Hitting the API with a call", :can_be_real do
      # …
    end
    
    然后可以从命令行运行这些规范

    第二件事,是用真实的东西代替模拟。这取决于您如何定义模拟,是否使用了
    之前的
    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
    

    因此,您可以通过多种方式更改规范的上下文,从而允许您从命令行(以及Jenkins)获得所需的控制级别。您可能希望使用其他元数据来标记规范,例如是否可以安全运行,是否需要很长时间等。

    这是我们过去所做的。您可以安排Jenkins作业,检查您是否仍然可以每晚或每周与第三方API交互,它将通知您相关API的更改。还有一件事。。。作为其他人依赖的服务,我们甚至鼓励这样做,并设置了一个电子邮件帐户,当客户机的构建因我们的API更改而失败时,他们可以通过自动测试通知我们。通过这种方式,我们可以知道什么时候我们对客户产生了负面影响。我最近发现了令人厌倦的gem,它似乎是“包装”您对任何API的访问并编写相当简单的测试的好方法(参见Gilt)@bcarlso关于客户测试的电子邮件的很好的提示。我同意,VCR非常适合这样做。本质上是记录某种“合同”。然后可以重新记录并检查差异。
    a
      should be real when it's real
      should escape things when it's real
    
    Finished in 0.00301 seconds
    2 examples, 0 failures