Có thể chạy thử nghiệm duy nhất trong MiniTest không?


168

Tôi có thể chạy tất cả các bài kiểm tra trong một tệp với:

rake test TEST=path/to/test_file.rb

Tuy nhiên, nếu tôi muốn chạy chỉ một thử nghiệm trong tệp đó, tôi sẽ làm thế nào?

Tôi đang tìm kiếm chức năng tương tự như:

rspec path/to/test_file.rb -l 25

3
8 năm sau và đối với đường ray, hơn 5 người dùng rails test path/to/test_file.rb:25sẽ thấy @Derek_Hill ans - được lấy từ guide.rubyonrails.org/testing.html#the-rails-test-runner
notapatch

Câu trả lời:


44

Tôi đang tìm chức năng tương tự như đường dẫn rspec / đến / file.rb -l 25

Vâng Sử dụng đá quý "m" của Nick Quaranto . Với nó, bạn có thể nói:

m spec/my_spec.rb:25

4
Trong khi câu trả lời hoạt động và chính xác là những gì đã được hỏi :-) Cách chạy thử nghiệm nhỏ trong một thử nghiệm duy nhất là bằng cách khớp tên (xem câu trả lời của Mr Grimm). Nếu bạn đã thử điều này và từ chối nó thì đã đến lúc thử các lựa chọn thay thế không chuẩn - chẳng hạn như Nick's Gem.
bố

3
Đúng, tôi đồng ý. Tôi thực sự muốn m cho phép bạn cũng truyền vào -n như một tùy chọn ... hoặc MiniTest chỉ được hỗ trợ bằng cách sử dụng số dòng cũng như tên phương thức.
Elliot Winkler


Trong khi viên ngọc này tạo ra những thứ tương tự như cách rspec chạy một thử nghiệm duy nhất, Minitest có một cách tích hợp để chạy thử nghiệm duy nhất chính xác là câu hỏi. Sự phụ thuộc là không cần thiết. Thật tốt khi biết rằng có thể dễ dàng hơn với một viên đá quý phụ kiện (như có thể có nhiều xung quanh) nhưng tôi nghĩ rằng đối với câu hỏi này, các câu trả lời nhỏ nhất thuần túy như từ jduan hoặc ngẫu nhiên sẽ phù hợp hơn
cefigueiredo

209

Lệnh nên là:

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

6
+1 - đây là những gì bạn muốn làm. Nếu bạn muốn kiểm tra tất cả các bài kiểm tra trong một tệp cụ thể, hãy bỏ TESTOPTS=...đi
awenkhh

Câu trả lời rất hữu ích. Tôi tạo MinitestReporter để hiển thị các lệnh chạy lại các bài kiểm tra thất bại ở cuối báo cáo kiểm tra. Xem: gist.github.com/foton/141b9f73caccf13ccfcc
Foton

1
Làm gì -v?
Jon Schneider

149

Bạn đã thử chưa:

ruby path/to/test_file.rb --name test_method_name

10
Còn đối với các bài kiểm tra sử dụng Minispec, được định nghĩa như thế specify {}nào? Những cái đó chỉ hiển thị dưới dạng test_0001_anonymous... và có thể có nhiều test_0001_anonymouss nếu cùng một cú pháp được sử dụng trong nhiều khối mô tả ... có đề xuất nào để chạy thử nghiệm đơn trong loại môi trường này không?
neezer

1
"tc" là viết tắt của "trường hợp thử nghiệm".
Andrew Grimm

4
Nó nói cannot load such file -- test_helper.
x-yuri

11
sử dụng ruby -Itest path/to/tc_file.rb --name test_method_namenhư stackoverflow.com/a/15714985/327786
TlmaK0

bundle exec ruby -I lib path/to --name test_fit
puchu


49

Đây là một trong những điều khiến tôi bận tâm về string name definition bài kiểm tra.

Khi bạn có:

def test_my_test
end

bạn luôn biết cách kiểm tra của bạn được đặt tên để bạn có thể thực hiện nó như thế này:

ruby my_test -n test_my_test

Nhưng khi bạn có một cái gì đó như:

it "my test" do
end

bạn không bao giờ chắc chắn làm thế nào bài kiểm tra này thực sự được đặt tên nội bộ để bạn không thể sử dụng -n tùy chọn chỉ trực tiếp.

Để biết cách kiểm tra này được đặt tên nội bộ, bạn chỉ có một tùy chọn: thực thi toàn bộ tệp để cố gắng tìm ra trong nhật ký.

Cách giải quyết của tôi là (tạm thời) thêm một cái gì đó vào tên thử nghiệm rất độc đáo như:

it "my test xxx" do
end

và sau đó sử dụng phiên bản RegEx của tham số '-n' như:

ruby my_test.rb -n /xxx/

6
phiên bản regex của tham số -n là phần thông tin, cảm ơn!
Woahdae

Lưu ý rằng bạn có thể kiểm tra điều này bằng cách gọi __method__trong ngữ cảnh của phương thức hiện đang thực thi (thử nghiệm của bạn, trong trường hợp này). Việc thực hiện hiện tại kết quả trong một cái gì đó như "does not break my stuff".gsub(" ", "_").prepend("test_"). Sau đó chạy, ví dụ , ruby -Itest test/integration/stuff_flow_test.rb --name test_does_not_break_my_stuff.
TK-421


23

Bạn có thể sử dụng điều này để chạy một tệp duy nhất:

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

Tôi cũng đã sử dụng

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

để hiển thị tốt hơn.


12

Có 2 cách để làm điều đó:

  1. Chạy thử nghiệm 'thủ công' (xem câu trả lời của Andrew Grimm).
  2. Hack Rake::TestTaskmục tiêu để sử dụng một trình tải thử nghiệm khác nhau.

Rake::TestTask(từ rake 0.8.7) về mặt lý thuyết có thể vượt qua các tùy chọn bổ sung để MiniTest::Unitvới một"TESTOPTS=blah-blah" tùy chọn dòng lệnh, ví dụ:

% rake kiểm tra TEST = test / test_foobar.rb TESTOPTS = "- tên test_foobar1 -v"

Trong thực tế, tùy chọn --name(bộ lọc cho tên thử nghiệm) sẽ không hoạt động, do nội bộ cào. Để khắc phục rằng bạn sẽ cần phải viết một bản vá khỉ nhỏ trong Rakefile của mình:

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

Bản vá này yêu cầu bạn tạo một tệp test/my-minitest-loader.rb:

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

Để in tất cả các tùy chọn có thể cho Minitest, hãy nhập

% ruby ​​-r minitest / autorun -e '' - - trợ giúp

3
Lưu ý rằng ví dụ ban đầu hoạt động chính xác với một rakebản vá gần đây hơn (0.9.2) và không yêu cầu bản vá khỉ.
Nhầm lẫn

1
Khi tôi thử với phiên bản rake 10.5.0 TESTOPTS="--name test_foobar"không hoạt động, nhưng TESTOPTS="--name=test_foobar"hoạt động.
kangkyu

11

Bạn có thể vượt qua --nameđể chạy thử nghiệm theo tên của nó hoặc một số trong tên của nó:

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

ví dụ:

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

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

Cờ này được ghi lại trong README của Minitest .


1

Nếu bạn đang sử dụng Turn gem với minitest, chỉ cần đảm bảo sử dụng Turn.config.patterntùy chọn vì người chạy Turn Minitest không tôn trọng tùy chọn - name trong ARGs.


Đây là gợi ý tôi cần để nhận ra rằng Turn là thứ đang nuốt nametùy chọn. Cảm ơn! Trở thành Turn đó không còn được duy trì, tôi dự định chuyển sang các phóng viên nhỏ nhất
pdobb

1

Tôi đang tìm kiếm chức năng tương tự như:

đường dẫn rspec / đến / test_file.rb -l 25

Có một viên ngọc làm chính xác điều đó : minitest-line.

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

từ https://github.com/judofyr/minitest-line#minitest-line


Xin chào @ChrisHough, bạn có thể mô tả chính xác những gì không hoạt động (ví dụ: thông báo lỗi) không? Mục đích của viên ngọc nhỏ nhất chỉ để chạy thử nghiệm trong MiniTest. Nếu nó không hoạt động, bạn có thể đã tìm thấy một lỗi trong dòng nhỏ nhất.
knugie

1

tôi sử dụng ruby /path/to/test -n /distinguishable word/

Chỉnh sửa: -nlà một tốc ký cho --name. distinguishable wordcó thể là bất kỳ chuỗi nào bạn đặt trong mô tả thử nghiệm, tôi thường sử dụng một số từ ngẫu nhiên mà tôi biết sẽ không có mặt trong các mô tả thử nghiệm khác.


Bạn có thể giải thích thêm? -nThông số đó có nghĩa là gì?
Nico Haase

Đó là một tốc ký cho --name. Chỉ là một điều thuận tiện. Đặc biệt hữu ích với / regex /, tôi thường chỉ đặt một số từ ngẫu nhiên vào tên kiểm tra (mà tôi biết sẽ không có mặt trong các mô tả của các bài kiểm tra khác).
sloneorzezki 18/03/19

1
Vui lòng thêm một số lời giải thích về điều đó cho chính câu trả lời, chứ không phải vào phần bình luận
Nico Haase

0

Sau đây sẽ làm việc

def test_abc
end

test "hello world"
end

Điều này có thể chạy bởi

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 sẽ làm điều đó

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.