2011-01-24 29 views
59

Tôi đã tải xuống mã nguồn cho một dự án, tìm thấy một lỗi và sửa nó.Làm thế nào để chạy tất cả các thử nghiệm với minitest?

Bây giờ tôi muốn chạy thử nghiệm để tìm hiểu xem tôi có hỏng bất cứ thứ gì không.

Các thử nghiệm nằm trong DSL tối thiểu.

Làm cách nào để chạy tất cả cùng một lúc?

Tôi đã tìm kiếm các tác vụ cào có thể áp dụng, v.v. nhưng tôi không tìm thấy bất kỳ tác vụ nào.

+1

Bạn có chạy bất kỳ thử nghiệm riêng lẻ nào không? Nếu vậy, làm thế nào? –

Trả lời

84

Đây là liên kết đến Rake::TestTask.

Có một ví dụ trong trang để giúp bạn bắt đầu.
tôi sẽ đăng một số khác mà tôi đang sử dụng ngay bây giờ cho một viên ngọc:

require 'rake/testtask' 

Rake::TestTask.new do |t| 
    t.pattern = "spec/*_spec.rb" 
end 

Như bạn thấy, tôi cho rằng tác phẩm của tôi là tất cả trong /lib và thông số kỹ thuật của tôi là trong /spec và được đặt tên whatever_spec.rb

Hy vọng điều đó sẽ hữu ích.

+0

Cảm ơn, khóa. Đó là những gì tôi đang tìm kiếm. – guai

+3

Đặt những gì bạn @locks đề cập trong một Rakefile sẽ cho phép bạn chỉ chạy 'rake test' – Nick

22

câu trả lời của khóa là tốt hơn, nhưng tôi cũng muốn chỉ ra rằng bạn cũng có thể chạy minitest trực tiếp từ lệnh giống như lệnh ruby. Để chạy các bài kiểm tra trong spec/file calculator_spec.rb chạy:

$ ruby spec/calculator_spec.rb 

Hãy nhớ bao gồm đoạn mã sau vào file calculator_spec.rb:

require 'minitest/spec' 
require 'minitest/autorun' 

để chạy tất cả các xét nghiệm trong spec/thư mục , sử dụng lệnh sau đây (xem bài này để biết thêm chi tiết Globbing doesn't work with Minitest - Only one file is run)

$ for file in spec/*.rb; do ruby $file; done 
16

Đây là những gì Rake::TestTask không dưới mui xe, nhiều hơn hoặc ít hơn:

ruby -Ilib -e 'ARGV.each { |f| require f }' ./test/test*.rb 

Lưu ý: lib & test/test*.rb (ở trên) là giá trị mặc định nhưng test & test/*_test.rb, tương ứng, là điển hình hơn.

Nguồn: rake/testtask.rb at c34d9e0 line 169

Nếu bạn đang sử dụng JRuby và muốn tránh phải trả các chi phí khởi động hai lần (một lần cho Rake và sau đó một lần cho tiến trình con mà Rake bắt đầu), chỉ cần sử dụng lệnh đó.

+0

Liên kết tài liệu bị hỏng ở đây. –

13

Dưới đây là toàn bộ rakefile của tôi, mà tôi đặt trong thư mục hàng đầu của tôi:

task :default => :test 
task :test do 
    Dir.glob('./test/*_test.rb').each { |file| require file} 
end 

Để chạy tất cả các file thử nghiệm của tôi cùng một lúc, tôi chỉ cần gõ rake. Đó là nó!

Đảm bảo có require 'minitest/autorun' ở đầu mỗi tệp Minitest của bạn. Dir.glob chắc chắn DOES làm việc với Minitest.

Để có được đầu ra Minitest đẹp, màu, với tên của tất cả các phương pháp thử nghiệm của tôi, tôi có tệp minitest_helper.rb trong thư mục thử nghiệm/của tôi. (Đã phải cài đặt các phóng viên khai thác đá quý):

require 'minitest/reporters' 
Minitest::Reporters.use!(Minitest::Reporters::SpecReporter.new) 
require 'minitest/autorun' 

Tôi chỉ phải require_relative './minitest_helper' ở đầu mỗi tệp thử nghiệm của mình.

+0

Điều này là tốt đẹp, ngoại trừ một thực tế nếu bạn sử dụng bundler ... trong trường hợp đó, mọi yêu cầu tuyên bố sẽ điền bởi vì đá quý sẽ không được trên '$ LOAD_PATH'. –

-1

Nếu bạn không có cào, hãy thử này:

http://blog.gingergriffis.com/post/85871430778/ruby-how-to-run-all-tests-in-a-directory

# run_all_tests.rb 

require 'find' 
require 'optparse' 

options = { 
    :exclude => [], 
} 

OptionParser.new do |opts| 
    opts.on('--exclude Comma Separated String', 
      'Test scripts to exclude') do |css| 
    options[:exclude] = css.split(',') 
    end 
end.parse! 

commands = [] 

Find.find(File.dirname(__FILE__)) do |path| 
    Find.prune if path =~ /#{__FILE__}$/ 
    if !File.directory?(path) && (path =~ /(.*)\.rb$/) 
     if options[:exclude].none? {|e| path.include?(e)} 
     commands << "ruby #{path}" 
     end 
    end 
end 
command_string = commands.join(" && ") 
exec(command_string) 
+0

Điều đó rất tốn kém vì nó đòi hỏi một thông dịch viên ruby ​​cho mỗi bài kiểm tra bạn muốn chạy. Ngoài ra nó là rất nhiều mã để làm một điều rất đơn giản. Hãy xem giải pháp của Theo. Nó làm điều tương tự, hiệu quả hơn, và bạn cũng không cần 'rake'. – Overbryd

4

này cũng có thể được thực hiện thông qua một Makefile.

default: 
    echo "Dir.glob('./test/*_test.rb').each { |file| require file}" | ruby 

chạy make sẽ chạy tất cả các thử nghiệm của bạn.

1

Cách khác để thực hiện việc này chỉ sử dụng thư viện chuẩn của Ruby là Dir.glob. Từ bên trong một file ruby, điều này sẽ trông như thế này:

require "minitest/autorun" 

Dir.glob("**/*Test.rb") { |f| require_relative(f) } 

Hoặc từ dòng lệnh, bạn có thể sử dụng lệnh này:

ruby -I . -e "require 'minitest/autorun'; Dir.glob('**/*Test.rb') { |f| require(f) }" 

Dir.glob('**/*Test.rb') đệ quy tìm kiếm thư mục hiện hành đối với bất kỳ tập tin mà phù hợp *Test.rb, vì vậy, chúng tôi chỉ cần lấy tất cả các tệp đó và require hoặc require_relative chúng. Từ dòng lệnh, require_relative thất bại, vì vậy chúng tôi sử dụng require nhưng trước hết phải thêm thư mục hiện hành đến $LOAD_PATH qua -I .

1

$ rake test chạy ra khỏi đường ray 5.0 hộp.

+0

Điều này không chạy thử nghiệm hệ thống của tôi, chỉ là các thử nghiệm thành phần. –

Các vấn đề liên quan