Minitest иногда завершается преждевременно с завершением или сообщением об ошибке - PullRequest
0 голосов
/ 23 декабря 2018

У меня есть тестовый файл, 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всего дерева )

Иногда тест считается успешным, но гораздо чаще тест никогда не достигает значения «Завершено».В этих случаях есть ноль или более точек, представляющих (я предполагаю) успешные утверждения.Я предполагаю, что выполнение тестов останавливается из-за некоторого времени ожидания где-то в моем комплекте, и что это время от времени прерывается, потому что входные данные для теста имеют различный размер.Но если это проблема тайм-аута, почему нет сообщения об этом?Вот серия тестовых прогонов:

josie @ josie-Inspiron-580: / var / www / html / ruby ​​/ ipca $ ruby ​​-Itest test / ipca_test.rb Параметры запуска: --seed44059

# Запуск:

.. josie @ josie-Inspiron-580: / var / www / html / ruby ​​/ ipca $ ruby ​​-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 $ ruby ​​-Itest test / ipca_test.rb Параметры запуска: --seed 7474

# Выполнено:

.. josie @ josie-Inspiron-580: / var / www / html / ruby ​​/ ipca $ ruby ​​-Itest test / ipca_test.rb Параметры запуска:--seed 1938

# Запуск:

.. josie @ josie-Inspiron-580: / var / www / html / ruby ​​/ ipca $ ruby ​​-Itest test / ipca_test.rb Параметры запуска: --seed 61325

# Работает:

.. Собственное значение: 2027.687580111128, r: Vector [0.03288542301229099, -0.09533529249551115, 0.3033273986606458, 0,07951734565050736, 0,3575555246291426, 0,41614419068773545, 0,4928822662304588, 0,28785088479078025, 0,5144766379975693].

Закончено за 0,0371733, 0,70 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * не так уж и много., 0 ошибок, 0 пропускает josie @ josie-Inspiron-580: / var / www / html / ruby ​​/ ipca $

1 Ответ

0 голосов
/ 23 декабря 2018

Используйте break вместо exit:

break if error < tolerance

break выходит только из цикла do.

exit выходит из самой программы, не давая шанса на мини-тестированиепровалить тест

...