Minitest 有时会过早终止,既没有完成也没有错误消息
Minitest sometimes terminating prematurely with netither completion nor error message
我有一个测试文件,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
有时测试会成功,但更多时候测试永远不会达到 "Finished"。在这些情况下,有零个或多个点代表(我假设)成功的断言。我猜测测试运行因我的包中某处的某种超时而停止,并且由于测试的输入数据大小不同而间歇性地超时。但如果是超时问题,为什么没有相应的消息?这是一系列测试运行:
josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest
test/ipca_test.rb Run options: --seed 44059
# Running:
..josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest
test/ipca_test.rb Run options: --seed 57681
# Running:
.josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest
test/ipca_test.rb Run options: --seed 57222
# Running:
..josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest
test/ipca_test.rb Run options: --seed 7474
# Running:
..josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest
test/ipca_test.rb Run options: --seed 1938
# Running:
..josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest
test/ipca_test.rb Run options: --seed 61325
# Running:
..eigenvalue: 2027.687580111128, r: Vector[0.03288542301229099,
-0.09533529249551115, 0.3033273986606458, 0.07951734565050736, 0.3575555246291426, 0.41614419068773545, 0.4928822662304588, 0.28785088479078025, 0.5144766379975693] .
Finished in 0.037173s, 80.7047 runs/s, 107.6063 assertions/s.
3 runs, 4 assertions, 0 failures, 0 errors, 0 skips
josie@josie-Inspiron-580:/var/www/html/ruby/ipca$
使用break
代替exit
:
break if error < tolerance
break
仅退出 do 循环。
exit
退出程序本身,不给 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
有时测试会成功,但更多时候测试永远不会达到 "Finished"。在这些情况下,有零个或多个点代表(我假设)成功的断言。我猜测测试运行因我的包中某处的某种超时而停止,并且由于测试的输入数据大小不同而间歇性地超时。但如果是超时问题,为什么没有相应的消息?这是一系列测试运行:
josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest test/ipca_test.rb Run options: --seed 44059
# Running:
..josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest test/ipca_test.rb Run options: --seed 57681
# Running:
.josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest test/ipca_test.rb Run options: --seed 57222
# Running:
..josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest test/ipca_test.rb Run options: --seed 7474
# Running:
..josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest test/ipca_test.rb Run options: --seed 1938
# Running:
..josie@josie-Inspiron-580:/var/www/html/ruby/ipca$ ruby -Itest test/ipca_test.rb Run options: --seed 61325
# Running:
..eigenvalue: 2027.687580111128, r: Vector[0.03288542301229099, -0.09533529249551115, 0.3033273986606458, 0.07951734565050736, 0.3575555246291426, 0.41614419068773545, 0.4928822662304588, 0.28785088479078025, 0.5144766379975693] .
Finished in 0.037173s, 80.7047 runs/s, 107.6063 assertions/s.
3 runs, 4 assertions, 0 failures, 0 errors, 0 skips josie@josie-Inspiron-580:/var/www/html/ruby/ipca$
使用break
代替exit
:
break if error < tolerance
break
仅退出 do 循环。
exit
退出程序本身,不给 minitest 失败测试的机会