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

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

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"

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

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/

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


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.


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

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 .


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.


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


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.


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.