Можно ли запустить один тест в MiniTest?

168

Я могу запустить все тесты в одном файле с:

rake test TEST=path/to/test_file.rb

Однако, если я хочу выполнить только один тест в этом файле, как бы я это сделал?

Я ищу похожую функциональность для:

rspec path/to/test_file.rb -l 25
Иосия Киль
источник
3
8 лет спустя и для пользователей рельсов 5+ rails test path/to/test_file.rb:25смотрите @Derek_Hill ans - взято с guides.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Ответы:

43

Я ищу аналогичную функциональность для rspec path / to / file.rb -l 25

Ага! Используйте драгоценный камень Ника Кваранто "m" . С его помощью вы можете сказать:

m spec/my_spec.rb:25
Эллиот Винклер
источник
4
Хотя ответ работает и был именно тем, о чем спрашивали :-) Мини-тестовый способ проведения одиночного теста - это сопоставление имен (см. Ответ г-на Гримма). Если вы попробовали это и отвергли, пришло время попробовать нестандартные альтернативы, такие как самоцвет Ника.
notapatch
3
Правда, я согласен. На самом деле, я бы хотел, чтобы m позволял вам также указывать -n как опцию ... или чтобы MiniTest просто поддерживал использование номеров строк и имен методов.
Эллиот Винклер
в то время как этот драгоценный камень делает вещи похожими на способ запуска одного теста rspec, в Minitest есть встроенный способ запуска одного теста, который был именно таким вопросом. Зависимость не нужна. Хорошо знать, что это может быть проще с дополнительным драгоценным камнем (например, может иметь много вокруг), но я думаю, что для этого вопроса лучше
подойдут
209

Команда должна быть:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"
jduan
источник
6
+1 - это то, что ты хочешь сделать. Если вы хотите , чтобы проверить все испытания в конкретном файле, просто оставить TESTOPTS=...далеко
awenkhh
Очень полезный ответ. Я делаю MinitestReporter, чтобы показать команды повторного запуска неудачных тестов в конце отчета о тестировании. См. Gist.github.com/foton/141b9f73caccf13ccfcc
Foton
1
Что делает -v?
Джон Шнайдер
150

Ты пробовала:

ruby path/to/test_file.rb --name test_method_name
Эндрю Гримм
источник
10
Как насчет тестов с использованием Minispec, определенных как specify {}? Они просто отображаются как test_0001_anonymous... и может быть несколько test_0001_anonymouss, если один и тот же синтаксис используется в нескольких блоках описания ... какие-либо предложения по запуску отдельных тестов в такой среде?
neezer
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
Пучу
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/
fguillen
источник
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
33

Если вы используете MiniTest с Rails 5+, лучший способ запустить все тесты в одном файле:

bin/rails test path/to/test_file.rb

И для одного теста (например, в строке 25):

bin/rails test path/to/test_file.rb:25

Смотрите http://guides.rubyonrails.org/testing.html#the-rails-test-runner

Дерек Хилл
источник
23

Вы можете использовать это для запуска одного файла:

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

Я также использовал

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

для лучшего отображения.

tuhaj
источник
12

Есть 2 способа сделать это:

  1. Выполните тесты «вручную» (см. Ответ Эндрю Гримма).
  2. Взломать Rake::TestTaskцель, чтобы использовать другой загрузчик тестов.

Rake::TestTask(из грабли 0.8.7) теоретически может передавать дополнительные параметры MiniTest::Unitс помощью параметра "TESTOPTS=blah-blah"командной строки, например:

% rake test TEST = test / test_foobar.rb TESTOPTS = "- имя test_foobar1 -v"

На практике опция --name(фильтр для имен тестов) не будет работать из-за внутренних граблей. Чтобы это исправить, вам нужно написать небольшой патч для обезьян в вашем 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 '' - --help
Александр Громницкий
источник
3
Обратите внимание, что первоначальный пример работает правильно с более свежим rake(0.9.2) и патч обезьян не требуется.
Беспорядок
1
При попытке с граблями версия 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

Этот флаг задокументирован в README Минитеста .

Rimian
источник
1

Если вы используете Turn gem с minitest, просто используйте Turn.config.patternопцию, поскольку бегун Turn Minitest не учитывает опцию --name в ARG.

Laknath
источник
Это был намек, который мне был нужен, чтобы понять, что Turn - это то, что поглощает nameвозможность. Спасибо! Поскольку этот поворот больше не поддерживается, я планирую мигрировать на minitest-репортеров
pdobb
1

Я ищу похожую функциональность для:

rspec path / to / 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

knugie
источник
Привет @ChrisHough, не могли бы вы описать, что именно не работает (например, сообщение об ошибке)? Цель самоцвета Minitest-Line состоит в том, чтобы выполнить только один тест в MiniTest. Если это не работает, возможно, вы нашли ошибку в строке minitest.
Кнуги
1

я использую ruby /path/to/test -n /distinguishable word/

Изменить: -nэто сокращение для --name. distinguishable wordэто может быть любая строка, которую вы указали в описании теста, я обычно использую какое-то случайное слово, которое, как я знаю, не будет присутствовать в описании других тестов.

sloneorzeszki
источник
Можете ли вы объяснить это дальше? Что означает этот -nпараметр?
Нико Хаазе
Это сокращение для --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

источник
-1

rails test path/to/test_file.rb:25 сделаю это

sekmo
источник