Minitest有时会由于网络完成或错误消息而提前终止

时间:2018-12-23 05:10:56

标签: ruby bundler minitest

我有一个测试文件ipca_test.rb

require "test_helper"
require "matrix" # Does needing to include this here mean I'm doing something wrong?

class IpcaTest < Minitest::Test
  def test_that_it_has_a_version_number
    refute_nil ::Ipca::VERSION
  end

  def test_it_does_something_useful
    refute false
  end

  def test_on_a_random_matrix
    p = rand(3..10)
    n = rand(20..50)
    m = Matrix.build(n, p) {|_, _| rand(-10.0..10.0)}
    pca = Ipca::Pca.new(m)
    eigenvalue, r = pca.first_principal_component
    puts "eigenvalue: #{eigenvalue}, r: #{r}"
    assert eigenvalue.kind_of? Numeric
    assert_equal Vector, r.class
  end
end

我要测试的程序是ipca.rb

require "ipca/version"

module Ipca
  class Error < StandardError; end

  class Pca
    def initialize data
      @data = data.class == Matrix ? data : Matrix.rows(data)
    end

    # see https://en.wikipedia.org/wiki/Principal_component_analysis#Iterative_computation
    def first_principal_component(c = 100, tolerance = 0.001) # not sure whether defaults are apropos
      p = @data.column_vectors.count
      r = Vector.elements(Array.new(p) {|_| rand}).normalize
      eigenvalue = nil
      c.times do
        s = Vector.zero(p)
        @data.row_vectors.each do |x|
          s += x.dot(r)*x
        end
        eigenvalue = r.dot(s) # ?
        error = (eigenvalue*r-s).norm
        r = s.normalize
        exit if error < tolerance
      end
      return [eigenvalue, r]
    end
  end
end

Git repo of entire tree

有时测试会成功,但更多情况下测试永远不会“完成”。在这些情况下,有零个或多个点代表(我假设)成功的断言。我猜测测试运行由于捆绑中某处的某种超时而中止,并且由于测试的输入数据大小不同,因此会间歇性地超时。但是,如果是超时问题,为什么没有这样的消息?这是一系列测试运行:

  

josie @ josie-Inspiron-580:/ var / www / html / ruby​​ / ipca $红宝石-测试   test / ipca_test.rb运行选项:--seed 44059

     

#正在运行:

     

.. josie @ josie-Inspiron-580:/ var / www / html / ruby​​ / ipca $红宝石-Itest   test / ipca_test.rb运行选项:--seed 57681

     

#正在运行:

     

.josie @ josie-Inspiron-580:/ var / www / html / ruby​​ / ipca $ ruby​​ -Itest   test / ipca_test.rb运行选项:--seed 57222

     

#正在运行:

     

.. josie @ josie-Inspiron-580:/ var / www / html / ruby​​ / ipca $红宝石-Itest   test / ipca_test.rb运行选项:--seed 7474

     

#正在运行:

     

.. josie @ josie-Inspiron-580:/ var / www / html / ruby​​ / ipca $红宝石-Itest   test / ipca_test.rb运行选项:--seed 1938

     

#正在运行:

     

.. josie @ josie-Inspiron-580:/ var / www / html / ruby​​ / ipca $红宝石-Itest   test / ipca_test.rb运行选项:--seed 61325

     

#正在运行:

     

.. eigenvalue:2027.687580111128,r:Vector [0.03288542301229099,   -0.09533529249551115、0.3033273986606458、0.07951734565050736、0.3575555246291426、0.41614419068773545、0.4928822662304588、0.28785088479078025、0.5144766379975693]。

     

完成时间为0.037173秒,每秒80.7047次运行,每秒107.6063个断言。

     

3个运行,4个断言,0个故障,0个错误,0个跳过   josie @ josie-Inspiron-580:/ var / www / html / ruby​​ / ipca $

1 个答案:

答案 0 :(得分:1)

使用break代替exit

break if error < tolerance

break仅退出do循环。

exit退出程序本身,没有让minitest失败的机会