Чи можливо запустити єдиний тест у 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

Відповіді:


44

Я шукаю подібну функціональність до rspec path / to / file.rb -l 25

Так! Використовуйте дорогоцінний камінь Ніка Каранто "m" . З ним можна сказати:

m spec/my_spec.rb:25

4
У той час як відповідь працює і саме те, що було запропоновано :-) Міні-тестовий спосіб проведення єдиного тесту - це відповідно до імені (див. Відповідь містера Грімма). Якщо ви спробували це і відхилили його, тоді прийшов час спробувати нестандартні альтернативи - наприклад, Нік Джем.
notapatch

3
Правда, я згоден. Я насправді бажаю, щоб ви також передавали в -n як варіант ... або що MiniTest просто підтримується за допомогою номерів рядків, а також імен методів.
Елліот Вінклер


в той час як цей дорогоцінний камінь робить речі подібними до rspec способу проведення єдиного тесту, у Minitest є вбудований спосіб запустити єдиний тест, що було саме питанням. Залежність не потрібна. Добре знати, що з дорогоцінним каменем може бути простіше (як, можливо, їх багато), але я думаю, що на це питання краще підійдуть чисті мінімісткі відповіді, як від jduan або randomor
cefigueiredo

209

Команда повинна бути:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"

6
+1 - це те, що ти хочеш робити. Якщо ви хочете перевірити весь тест у конкретному файлі, просто залиште TESTOPTS=...подальше
awenkhh

Дуже корисна відповідь. Я змушую MinitestReporter показувати повторні команди провалених тестів наприкінці звіту про випробування. Дивіться: gist.github.com/foton/141b9f73caccf13ccfcc
Foton

1
Що робить -v?
Джон Шнайдер

149

Ти намагався:

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/

6
версія regex параметра -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. Виконайте тести "вручну" (див. Відповідь Ендрю Грімма).
  2. Зламати Rake::TestTaskціль, щоб використовувати інший тестовий завантажувач.

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

% тест граблі 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

Цей прапор задокументований у програмі REITME Minitest .


1

Якщо ви використовуєте Turn gem з minitest, просто переконайтеся, що ви користуєтесь Turn.config.patternопцією, оскільки бігун Turn Minitest не дотримується --name в ARG.


Це був натяк, який мені потрібен, щоб зрозуміти, що Терн - це те, що ковтає nameваріант. Дякую! Оскільки цього Повороту більше не підтримують, я планую перейти на міні-репортерів
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. Якщо це не працює, можливо, ви знайшли помилку в minitest-line.
knugie

1

я використовую ruby /path/to/test -n /distinguishable word/

Правка: -nце скорочення для --name. distinguishable wordможе бути будь-який рядок, який ви вводите в опис тесту, я зазвичай використовую якесь випадкове слово, яке, як я знаю, не буде присутнє в описах інших тестів.


Чи можете ви пояснити це далі? Що означає цей -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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.