Czy w MiniTest można przeprowadzić pojedynczy test?

168

Mogę uruchomić wszystkie testy w jednym pliku za pomocą:

rake test TEST=path/to/test_file.rb

Jeśli jednak chcę uruchomić tylko jeden test w tym pliku, jak mam to zrobić?

Szukam podobnej funkcjonalności do:

rspec path/to/test_file.rb -l 25
Josiah Kiehl
źródło
3
8 lat później i dla użytkowników szyn 5+ rails test path/to/test_file.rb:25zobacz @Derek_Hill ans - pobrane z guide.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Odpowiedzi:

44

Szukam podobnej funkcjonalności do rspec ścieżka / do / plik.rb -l 25

Tak! Użyj perełki „m” Nicka Quaranto . Dzięki niemu możesz powiedzieć:

m spec/my_spec.rb:25
Elliot Winkler
źródło
4
Chociaż odpowiedź działa i była dokładnie taka, o którą pytano :-) Mini-test polega na dopasowywaniu nazw (patrz odpowiedź pana Grimma). Jeśli próbowałeś tego i odrzuciłeś, czas wypróbować niestandardowe alternatywy - takie jak Nick's Gem.
notapatch
3
Prawda, zgadzam się. Właściwie chciałbym, żebyś pozwolił ci również podać opcję -n ... lub żeby MiniTest obsługiwał tylko numery linii, a także nazwy metod.
Elliot Winkler,
podczas gdy ten klejnot przypomina sposób wykonywania pojedynczego testu rspec, program Minitest ma wbudowany sposób uruchamiania pojedynczego testu, o co właśnie chodziło. Zależność nie jest konieczna. Dobrze wiedzieć, że mogłoby być łatwiej z dodatkowym klejnotem (jak może mieć wiele w pobliżu), ale myślę, że na to pytanie bardziej pasowałyby najmniejsze odpowiedzi, takie jak jduan lub randomor
cefigueiredo
209

Polecenie powinno być:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"
jduan
źródło
6
+1 - to jest to, co chcesz zrobić. Jeśli chcesz przetestować cały test w pliku konkretnego, po prostu zostawić TESTOPTS=...z dala
awenkhh
Bardzo przydatna odpowiedź. Robię MinitestReporter tak, aby na końcu raportu z testu pokazywał polecenia ponownego uruchomienia testów zakończonych niepowodzeniem. Zobacz: gist.github.com/foton/141b9f73caccf13ccfcc
Foton
1
Co to -vrobi?
Jon Schneider
149

Czy próbowałeś:

ruby path/to/test_file.rb --name test_method_name
Andrew Grimm
źródło
10
A co z testami używającymi Minispec, zdefiniowanymi jak specify {} ? Pojawiają się po prostu jako test_0001_anonymous... i może być ich wiele, test_0001_anonymousjeśli ta sama składnia jest używana w wielu blokach opisu ... jakieś sugestie dotyczące uruchamiania pojedynczych testów w tego rodzaju środowisku?
neezer
1
„tc” oznacza „przypadek testowy”.
Andrew Grimm
4
Mówi cannot load such file -- test_helper.
x-yuri
11
użyj ruby -Itest path/to/tc_file.rb --name test_method_namejak stackoverflow.com/a/15714985/327786
TlmaK0
bundle exec ruby -I lib path/to --name test_fit
puchu,
49

To jedna z rzeczy, które przeszkadzają mi w kwestii string name definition w testach.

Kiedy masz:

def test_my_test
end

zawsze wiesz, jak nazywa się Twój test, więc możesz go wykonać w ten sposób:

ruby my_test -n test_my_test

Ale kiedy masz coś takiego:

it "my test" do
end

nigdy nie jesteś pewien, jak ten test jest naprawdę nazwany wewnętrznie, więc nie możesz użyć rozszerzenia -n opcji tylko bezpośrednio.

Aby dowiedzieć się, jak ten test jest nazywany wewnętrznie, masz tylko jedną opcję: wykonaj cały plik, aby spróbować znaleźć informacje w dziennikach.

Moje obejście polega (tymczasowo) na dodaniu czegoś do nazwy testu, na przykład:

it "my test xxx" do
end

a następnie użyj wersji RegEx parametru „-n”, na przykład:

ruby my_test.rb -n /xxx/
fguillen
źródło
6
wersja regex parametru -n była informacją o sprzęgle, dzięki!
Woahdae
Zauważ, że możesz to sprawdzić, wywołując __method__w kontekście aktualnie wykonywanej metody (w tym przypadku twojego testu). Obecne wdrożenie skutkuje czymś w rodzaju "does not break my stuff".gsub(" ", "_").prepend("test_"). Następnie uruchom na przykład ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff.
TK-421
33

Jeśli używasz MiniTest z Railsami 5+, najlepszym sposobem na uruchomienie wszystkich testów w jednym pliku jest:

bin/rails test path/to/test_file.rb

A dla pojedynczego testu (np. W linii 25):

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

Zobacz http://guides.rubyonrails.org/testing.html#the-rails-test-runner

Derek Hill
źródło
23

Możesz użyć tego do uruchomienia pojedynczego pliku:

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

Użyłem też

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

dla lepszego wyświetlania.

tuhaj
źródło
12

Można to zrobić na dwa sposoby:

  1. Uruchom testy „ręcznie” (zobacz odpowiedź Andrew Grimma).
  2. Zhakuj Rake::TestTaskcel, aby użyć innego programu ładującego testy.

Rake::TestTask(od rake 0.8.7) teoretycznie jest w stanie przekazać dodatkowe opcje MiniTest::Unitza pomocą"TESTOPTS=blah-blah" możliwością linii polecenia, na przykład:

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

W praktyce opcja --name(filtr dla nazw testów) nie zadziała z powodu rake'u. Aby to naprawić, musisz napisać małą małpkę w swoim 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 
}

Ta poprawka wymaga utworzenia pliku test/my-minitest-loader.rb:

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

Aby wydrukować wszystkie możliwe opcje programu Minitest, wpisz

% ruby ​​-r minitest / autorun -e '' - --help
Alexander Gromnitsky
źródło
3
Zauważ, że początkowy przykład działa poprawnie z rakenowszą wersją (0.9.2) i nie jest wymagana żadna łatka małpa.
Zamieszanie
1
Kiedy próbowałem z rake w wersji 10.5.0 TESTOPTS="--name test_foobar"nie działa, ale TESTOPTS="--name=test_foobar"działa.
kangkyu
11

Możesz przejść, --nameaby uruchomić test, używając jego nazwy lub numeru w nazwie:

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

na przykład:

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

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

Ta flaga jest udokumentowana w pliku README programu Minitest .

Rimian
źródło
1

Jeśli używasz Turn gem z minitestem, po prostu upewnij się, że używasz Turn.config.patternopcji, ponieważ runner Turn Minitest nie obsługuje opcji --name w ARG.

Laknath
źródło
To była wskazówka, której potrzebowałem, aby zdać sobie sprawę, że Turn jest tym, co połyka nameopcję. Dzięki! Ponieważ Turn nie jest już utrzymywany, planuję migrację do minitest-reporters
pdobb
1

Szukam podobnej funkcjonalności do:

rspec ścieżka / do / plik_testowy.rb -l 25

Jest to klejnot, który robi dokładnie to: minitest-line.

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

z https://github.com/judofyr/minitest-line#minitest-line

knugie
źródło
Cześć @ChrisHough, czy możesz opisać, co dokładnie nie działa (np. Komunikat o błędzie)? Klejnot minitest-line służy wyłącznie do uruchomienia jednego testu w MiniTest. Jeśli to nie działa, być może znalazłeś błąd w minitest-line.
knugie
1

używam ruby /path/to/test -n /distinguishable word/

Edycja: -nto skrót dla --name. distinguishable wordmoże to być dowolny ciąg, który umieścisz w opisie testu, zwykle używam jakiegoś przypadkowego słowa, o którym wiem, że nie będzie obecne w opisach innych testów.

sloneorzeszki
źródło
Czy możesz to dalej wyjaśnić? Co oznacza ten -nparametr?
Nico Haase
To skrót od --name. Po prostu wygoda. Szczególnie przydatne w przypadku / regex /, zwykle po prostu umieszczam jakieś przypadkowe słowo w nazwie testu (wiem, że nie będzie ono obecne w opisach innych testów).
sloneorzeszki
1
Proszę dodać wyjaśnienie do samej odpowiedzi, a nie do sekcji komentarzy
Nico Haase
0

Następujące będzie działać

def test_abc
end

test "hello world"
end

To może przebiegać

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

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

źródło
-1

rails test path/to/test_file.rb:25 zrobię to

sekmo
źródło