Apakah mungkin menjalankan tes tunggal di MiniTest?

168

Saya dapat menjalankan semua tes dalam satu file dengan:

rake test TEST=path/to/test_file.rb

Namun, jika saya ingin menjalankan hanya satu tes di file itu, bagaimana saya melakukannya?

Saya mencari fungsionalitas yang mirip dengan:

rspec path/to/test_file.rb -l 25
Josiah Kiehl
sumber
3
8 tahun kemudian dan untuk kereta 5+ pengguna rails test path/to/test_file.rb:25melihat @Derek_Hill ans - diambil dari guides.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Jawaban:

44

Saya mencari fungsionalitas yang mirip dengan jalur rspec / ke / file.rb -l 25

Ya! Gunakan permata "m" Nick Quaranto . Dengan itu Anda bisa mengatakan:

m spec/my_spec.rb:25
Elliot Winkler
sumber
4
Sementara jawabannya bekerja dan persis apa yang ditanyakan :-) Cara uji mini menjalankan tes tunggal adalah dengan pencocokan nama (lihat jawaban Mr Grimm). Jika Anda sudah mencoba dan menolaknya, inilah saatnya untuk mencoba alternatif yang tidak standar - seperti Nick's Gem.
notapatch
3
Benar, saya setuju. Saya benar-benar berharap saya membiarkan Anda juga memasukkan -n sebagai opsi ... atau bahwa MiniTest hanya didukung menggunakan nomor baris serta nama metode.
Elliot Winkler
15
Kepala! m saat ini tidak bekerja Minitest 5.0 ini .
davetapley
sementara permata ini membuat hal-hal yang mirip dengan cara rspec menjalankan tes tunggal, Minitest memiliki cara bawaan untuk menjalankan tes tunggal yang justru menjadi pertanyaan. Ketergantungan tidak perlu. Adalah baik untuk mengetahui bahwa bisa lebih mudah dengan permata aksesori (seperti mungkin ada banyak di sekitar) tetapi saya berpikir bahwa untuk pertanyaan ini, jawaban paling murni seperti dari jduan atau randomor akan lebih cocok
cefigueiredo
209

Perintahnya harus:

% rake test TEST=test/test_foobar.rb TESTOPTS="--name=test_foobar1 -v"
jduan
sumber
6
+1 - inilah yang ingin Anda lakukan. Jika Anda ingin menguji semua tes dalam file tertentu, tinggalkan TESTOPTS=...saja
awenkhh
Jawabannya sangat berguna. Saya membuat MinitestReporter untuk menampilkan ulang perintah gagal tes pada akhir laporan pengujian. Lihat: gist.github.com/foton/141b9f73caccf13ccfcc
Foton
1
Apa yang -vdilakukan?
Jon Schneider
149

Sudahkah Anda mencoba:

ruby path/to/test_file.rb --name test_method_name
Andrew Grimm
sumber
10
Bagaimana dengan tes menggunakan Minispec, didefinisikan seperti apa specify {}? Itu hanya muncul sebagai test_0001_anonymous... dan mungkin ada beberapa test_0001_anonymouss jika sintaks yang sama digunakan dalam beberapa blok uraian ... ada saran untuk menjalankan tes tunggal di lingkungan seperti ini?
neezer
1
"tc" adalah singkatan dari "test case".
Andrew Grimm
4
Dikatakan cannot load such file -- test_helper.
x-yuri
11
gunakan ruby -Itest path/to/tc_file.rb --name test_method_namelike stackoverflow.com/a/15714985/327786
TlmaK0
bundle exec ruby -I lib path/to --name test_fit
puchu
49

Ini adalah salah satu hal yang mengganggu saya tentang string name definition tes dalam.

Ketika Anda memiliki:

def test_my_test
end

Anda selalu tahu bagaimana nama tes Anda sehingga Anda dapat menjalankannya seperti ini:

ruby my_test -n test_my_test

Tetapi ketika Anda memiliki sesuatu seperti:

it "my test" do
end

Anda tidak pernah yakin bagaimana tes ini benar - benar dinamai secara internal sehingga Anda tidak dapat menggunakan -n opsi hanya secara langsung.

Untuk mengetahui bagaimana tes ini dinamai secara internal, Anda hanya memiliki opsi: jalankan seluruh file untuk mencoba mencari tahu dalam log.

Solusi saya adalah (sementara) menambahkan sesuatu ke nama tes yang sangat unik seperti:

it "my test xxx" do
end

dan kemudian gunakan versi RegEx dari parameter '-n' seperti:

ruby my_test.rb -n /xxx/
fguillen
sumber
6
Versi regex parameter -n adalah kopling info, terima kasih!
Woahdae
Perhatikan bahwa Anda dapat memeriksa ini dengan memanggil __method__dalam konteks metode yang sedang dijalankan (pengujian Anda, dalam hal ini). Implementasi saat ini menghasilkan sesuatu seperti "does not break my stuff".gsub(" ", "_").prepend("test_"). Kemudian jalankan, misalnya ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff,.
TK-421
33

Jika Anda menggunakan MiniTest dengan Rails 5+, cara terbaik untuk menjalankan semua tes dalam satu file adalah:

bin/rails test path/to/test_file.rb

Dan untuk satu pengujian (mis. Pada baris 25):

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

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

Bukit Derek
sumber
23

Anda dapat menggunakan ini untuk menjalankan satu file:

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

Saya juga menggunakan

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

untuk tampilan yang lebih baik.

tuhaj
sumber
12

Ada 2 cara untuk melakukannya:

  1. Jalankan tes 'secara manual' (lihat jawaban Andrew Grimm).
  2. Rake::TestTaskTarget hack untuk menggunakan loader tes yang berbeda.

Rake::TestTask(mulai rake 0.8.7) secara teoritis dapat meneruskan opsi tambahan ke MiniTest::Unitdengan a"TESTOPTS=blah-blah" opsi baris perintah, misalnya:

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

Dalam praktiknya, opsi --name(filter untuk nama uji) tidak akan berfungsi, karena menyapu internal. Untuk memperbaikinya Anda harus menulis tambalan monyet kecil di Rakefile Anda:

# 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 
}

Tambalan ini mengharuskan Anda membuat file test/my-minitest-loader.rb:

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

Untuk mencetak semua opsi yang memungkinkan untuk Minitest, ketik

% ruby ​​-r minitest / autorun -e '' - --help
Alexander Gromnitsky
sumber
3
Perhatikan bahwa contoh awal tidak bekerja dengan benar dengan yang lebih baru rake(0.9.2) dan tidak ada tambalan monyet yang diperlukan.
Kebingungan
1
Ketika saya mencoba dengan menyapu versi 10.5.0 TESTOPTS="--name test_foobar"tidak berhasil, tetapi TESTOPTS="--name=test_foobar"berfungsi.
kangkyu
11

Anda dapat lulus --nameuntuk menjalankan tes dengan namanya atau angka di dalam namanya:

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

misalnya:

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

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

Bendera ini didokumentasikan dalam README Minitest .

Rimian
sumber
1

Jika Anda menggunakan Turn gem dengan minitest, pastikan untuk menggunakan Turn.config.patternopsi karena Turn Minitest runner tidak menghargai opsi --name di ARGs.

Laknath
sumber
Ini adalah petunjuk yang saya butuhkan untuk menyadari bahwa Turn adalah apa yang menelan nameopsi. Terima kasih! Karena Giliran itu tidak lagi dipertahankan, saya berencana untuk bermigrasi ke reporter
minitest
1

Saya mencari fungsionalitas yang mirip dengan:

jalur rspec / ke / test_file.rb -l 25

Ada permata yang tidak tepat: minitest-line.

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

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

knugie
sumber
Hai @ ChrisHough, bisakah Anda menjelaskan apa yang sebenarnya tidak berfungsi (mis. Pesan kesalahan)? Tujuan permata minitest adalah hanya untuk menjalankan tes tunggal di MiniTest. Jika tidak berfungsi, Anda mungkin menemukan bug di minitest-line.
knugie
1

saya menggunakan ruby /path/to/test -n /distinguishable word/

Sunting: -nadalah singkatan untuk --name. distinguishable wordbisa berupa string apa pun yang Anda masukkan dalam deskripsi tes, saya biasanya menggunakan kata acak yang saya tahu tidak akan ada dalam deskripsi tes lain.

sloneorzeszki
sumber
Bisakah Anda jelaskan lebih lanjut? Apa arti -nparameter itu?
Nico Haase
Ini singkatan untuk --name. Hanya hal yang mudah. Terutama berguna dengan / regex /, saya biasanya hanya memasukkan beberapa kata acak ke dalam nama tes (yang saya tahu tidak akan ada dalam deskripsi tes lain).
sloneorzeszki
1
Silakan tambahkan beberapa penjelasan tentang itu pada jawaban itu sendiri, bukan ke bagian komentar
Nico Haase
0

Mengikuti akan berhasil

def test_abc
end

test "hello world"
end

Ini bisa dijalankan oleh

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

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

sumber
-1

rails test path/to/test_file.rb:25 akan melakukannya

sekmo
sumber