是否可以在MiniTest中运行一个测试?


168

我可以使用以下命令在一个文件中运行所有测试:

rake test TEST=path/to/test_file.rb

但是,如果我只想在该文件中运行一个测试,该怎么办?

我正在寻找与以下类似的功能:

rspec path/to/test_file.rb -l 25

3
8年后,对于5岁以上的Rails用户,rails test path/to/test_file.rb:25请参阅@Derek_Hill ans-摘自guides.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Answers:


44

我正在寻找与rspec path / to / file.rb -l 25类似的功能

对!使用Nick Quaranto的“ m”宝石。有了它,您可以说:

m spec/my_spec.rb:25

4
虽然答案是正确的,但恰恰是要问的问题:-)运行单个测试的迷你测试方法是通过名称匹配(请参阅格林先生的答案)。如果您尝试过并拒绝了它,那么该是尝试非标准替代品的时候了,例如尼克的宝石。
notapatch 2013年

3
是的,我同意。我实际上希望m也允许您将-n作为选项传递...或者MiniTest仅支持使用行号以及方法名。
艾略特·温克勒


尽管此gem使事情类似于运行rspec的运行单个测试的方式,但是Minitest具有内置的运行单个测试的方式,这正是问题所在。依赖关系不是必需的。很高兴知道,使用辅助宝石可能会更容易(例如周围可能有很多),但我认为,对于这个问题,像jduan或randomor这样的纯粹最小的答案会更合适
cefigueiredo


149

你有没有尝试过:

ruby path/to/test_file.rb --name test_method_name

10
使用Minispec定义的测试怎么样specify {}?那些只是显示为test_0001_anonymous...,test_0001_anonymous如果在多个describe块中使用相同的语法,则可能会有多个s。在这种环境下运行单个测试的任何建议吗?
neezer 2011年

1
“ tc”代表“测试用例”。
安德鲁·格林

4
它说cannot load such file -- test_helper
x-yuri

11
使用 ruby -Itest path/to/tc_file.rb --name test_method_name类似stackoverflow.com/a/15714985/327786
TlmaK0

bundle exec ruby -I lib path/to --name test_fit
puchu


49

这是困扰string name definition测试的一件事。

当你有:

def test_my_test
end

您总是知道测试的名称,因此您可以像这样执行它:

ruby my_test -n test_my_test

但是当你有类似的东西:

it "my test" do
end

您永远不确定该测试在内部如何真正命名,因此您不能-n直接使用该选项。

要知道该测试的内部命名方式,您只有一个选择:执行整个文件以尝试找出日志。

我的解决方法是(暂时)在测试名称中添加一些非常独特的内容,例如:

it "my test xxx" do
end

然后使用RegEx版本的'-n'参数,例如:

ruby my_test.rb -n /xxx/

6
-n参数的正则表达式版本是最重要的信息,谢谢!
Woahdae

请注意,您可以通过__method__在当前正在执行的方法(在本例中为测试)的上下文中进行调用来进行检查。当前的实现结果类似于"does not break my stuff".gsub(" ", "_").prepend("test_")。然后运行,例如ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff
TK-421


23

您可以使用它来运行单个文件:

rake test TEST=test/path/to/file.rb

我也用过

ruby -I"lib:test" test/path/to/file.rb

以获得更好的显示效果。


12

有两种方法可以做到这一点:

  1. “手动”运行测试(请参阅Andrew Grimm的答案)。
  2. 破解Rake::TestTask目标以使用其他测试加载器。

Rake::TestTask(从rake 0.8.7起)从理论上讲可以将其他选项传递MiniTest::Unit"TESTOPTS=blah-blah"命令行选项,例如:

%抽水测试TEST = test / test_foobar.rb TESTOPTS =“-name test_foobar1 -v”

实际上,--name由于rake内部原因,该选项(测试名称的过滤器)不起作用。要解决此问题,您需要在Rakefile中编写一个小猴子补丁:

# overriding the default rake tests loader
class Rake::TestTask
  def rake_loader
    'test/my-minitest-loader.rb'
  end
end

# our usual test terget 
Rake::TestTask.new {|i|
  i.test_files = FileList['test/test_*.rb']
  i.verbose = true 
}

此补丁要求您创建一个文件test/my-minitest-loader.rb

ARGV.each { |f|
  break if f =~ /^-/
  load f
}

要打印Minitest的所有可能选项,请键入

%ruby -r minitest / autorun -e''--帮助

3
请注意,最初的示例在更新的版本rake(0.9.2)上可以正常工作,并且不需要猴子补丁。
混乱

1
当我尝试使用rake版本10.5.0时TESTOPTS="--name test_foobar"不起作用,但TESTOPTS="--name=test_foobar"可以。
kangkyu

11

您可以通过--name其名称或名称中的数字来运行测试:

-n, --name PATTERN               Filter run on /regexp/ or string.

例如:

$ ruby spec/stories/foo_spec.rb --name 3

FAIL (0:00:00.022) test_0003_has foo
Expected: "foo"
Actual: nil

该标志记录在Minitest的README文件


1

如果您将Turn gem与minitest一起使用,请确保使用Turn.config.pattern选项,因为Turn Minitest运行器不尊重ARG中的--name选项。


这是我需要意识到Turn吞噬了该name选项的暗示。谢谢!由于不再保留Turn,我计划迁移到minitest-reporters
pdobb

1

我正在寻找与以下类似的功能:

rspec路径/到/test_file.rb -l 25

有一个宝石可以做到这一点:minitest-line

gem install minitest-line
ruby test/my_file -l 5

来自https://github.com/judofyr/minitest-line#minitest-line


@ChrisHough,您好,您能描述到底是什么不起作用(例如错误消息)吗?minitest-line gem的目的仅仅是在MiniTest中运行单个测试。如果不起作用,您可能在minitest-line中发现了一个错误。
knugie

1

我用 ruby /path/to/test -n /distinguishable word/

编辑: -n是的简写--namedistinguishable word可以是您放入测试说明中的任何字符串,我通常使用一些我知道不会出现在其他测试说明中的随机词。


您能进一步解释吗?该-n参数是什么意思?
Nico Haase

这是的简写--name。只是方便的事情。对于/ regex /尤其有用,我通常只是在测试名称中放入一些随机单词(我知道其他测试的描述中不会出现该单词)。
sloneorzeszki

1
请有关添加一些解释答案本身,而不是注释部分
尼科·哈泽

0

以下将起作用

def test_abc
end

test "hello world"
end

这可以由

bundle exec ruby -I test path/to/test -n test_abc

bundle exec ruby -I test path/to/test -n test_hello_word

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.