我在项目中使用standalone autotest以及minitest。在我的一个项目中,我有一个文件(validation.rb
),可以将文档验证为不同的内部格式级别。 (Level 2文档比1级文档具有更多功能。)
测试特定级别的验证需要重复加载已知有效文档,以破坏方式巧妙地改变它,然后确保它被破坏。简而言之:
class TestValidation < MiniTest::Unit::TestCase
def setup
@l1 = Document.load( L1DOC )
end
def test_valid
assert @l1.valid_level_1?
end
def test_unbalanced_data
@l1.instance_eval{ @tracks[0].data.pop }
refute @l1.valid_level_1?, "Validation must ensure that all tracks have the same amount of data"
end
# many more tests for level 1 here
end
问题是autotest(据我所知)根据测试类的名称知道要运行哪些测试。 <{1}}将在TestValidation
更改后自动运行。
如果没有自动测试,我会将上面的类命名为validation.rb
,并创建一个新的类TestL1Validation
来加载不同的文档。但是,这样做会打破自动测试,除非我将验证分为TestL2Validation
和l1validation.rb
。
如何命名我的文件或测试,或设置我的测试,以便当单个源文件发生更改时,自动测试将运行多个测试类?
答案 0 :(得分:1)
您可以为自动测试添加自定义映射。这是一种方法: 在与lib和测试目录相同的级别创建自动测试目录。
添加autotest / discover.rb:
$LOAD_PATH.unshift File.expand_path('../', File.dirname(__FILE__))
Autotest.add_discovery { "my_rules" }
添加autotest / my_rules.rb:
require 'autotest'
class Autotest::My_rules < Autotest
def initialize
super
add_mapping(%r%^lib/valid.rb$%, true) { |filename, _|
files_matching %r%^test/test_.*\.rb$%
}
end
end
这将添加自定义映射:每当lib / valid.rb文件发生更改时,请重新运行测试目录中的所有test _ * .rb文件。