2012-01-06 20 views
7

Tôi biết. Điều này không được khuyến khích. Vì những lý do tôi không tham gia, tôi cần chạy các bài kiểm tra theo thứ tự được viết. Theo tài liệu, nếu lớp kiểm tra của tôi (chúng tôi sẽ gọi nó là TestClass) mở rộng Minitest :: Unit :: TestCase, thì tôi có thể gọi phương thức công khai i_suck_and_my_tests_are_order_dependent! (Gee - bạn có nghĩ rằng người tạo ra Minitest có ý kiến ​​về điều đó?). Ngoài ra, còn có tùy chọn gọi một phương thức có tên là test_order và chỉ định :alpha để ghi đè hành vi mặc định của :random. Không ai trong số này đang làm việc cho tôi.Làm thế nào để tôi có hiệu quả buộc Minitest chạy thử nghiệm của tôi theo thứ tự?

Dưới đây là một ví dụ:

class TestClass < Minitest::Unit::TestCase 

    #override random test run ordering 
    i_suck_and_my_tests_are_order_dependent! 

    def setup 
    ...setup code 
    end 

    def teardown 
    ...teardown code 
    end 

    def test_1 
    test_1 code.... 
    assert(stuff to assert here, etc...) 
    puts 'test_1' 
    end 

    def test_2 
    test_2_code 
    assert(stuff to assert here, etc...) 
    puts 'test_2' 
    end 

end 

Khi tôi chạy này, tôi nhận được:

undefined method `i_suck_and_my_tests_are_order_dependent!' for TestClass:Class (NoMethodError) 

Nếu tôi thay lời gọi i_suck phương pháp với một phương pháp ở trên cùng a la:

def test_order 
    :alpha 
end 

Thử nghiệm của tôi chạy, nhưng tôi có thể nói từ puts cho mỗi phương pháp mà mọi thứ vẫn còn đoàn kết theo thứ tự ngẫu nhiên mỗi lần tôi chạy thử nghiệm.

Có ai biết tôi đang làm gì sai không? Cảm ơn.

Trả lời

3

i_suck_and_my_tests_are_order_dependent! có thể là bổ sung sau vào minitest & không có sẵn dưới dạng phương pháp lõi Ruby. Trong trường hợp đó, bạn muốn để buộc sử dụng các phiên bản đá quý của bạn:

require 'rubygems' 
gem 'minitest' 
+0

Đồng ý; không sử dụng minitest cài sẵn. Sử dụng đá quý. – naomik

+0

n.b. tên này đã được đổi tên thành https://github.com/seattlerb/minitest/pull/400 –

+0

Aww. Tôi yêu cái tên đó. –

2

Tôi nghĩ rằng phương pháp * test_order * phải là một phương pháp lớp học và không phải là một phương pháp dụ như vậy:

# tests are order dependent 
def self.test_order 
    :alpha 
end 
4

Nếu bạn chỉ cần thêm test_order: alpha để lớp thử nghiệm của bạn, các bài kiểm tra sẽ chạy theo thứ tự:

class TestHomePage 

def self.test_order 
:alpha 
end 

def test_a 
puts "a" 
end 

def test_b 
puts "b" 
end 

end 
1

Lưu ý rằng, tính đến minitest 5.10.1, các i_suck_and_my_tests_are_order_dependent! phương pháp/chỉ thị là hoàn toàn không hoạt động trong các bộ thử nghiệm sử dụng cú pháp MiniTest::Spec. Phương thức Minitest.test_order dường như không được gọi.

CHỈNH SỬA: Đây là vấn đề đã biết kể từ Minitest 5.3.4: xem seattlerb/minitest#514 đối với tiếng khóc thổi phồng và preening.

Bạn và tôi không phải là những người "hút". Những gì cần thiết là một công cụ đặc tả BDD cho Ruby mà không có sự nổi lên của RSpec mà không có thái độ frat-boy và khinh miệt cho thực hành cộng đồng rộng lớn hơn của MiniTest. Có ai có bất kỳ con trỏ?

0

Cách tốt nhất để can thiệp vào chuỗi này có thể ghi đè lên một phương pháp học runnable_methods:

def self.runnable_methods 
    ['run_first'] | super | ['run_last'] 
end 

#Minitest version: 
def self.runnable_methods 
    methods = methods_matching(/^test_/) 

    case self.test_order 
    when :random, :parallel then 
    max = methods.size 
    methods.sort.sort_by { rand max } 
    when :alpha, :sorted then 
    methods.sort 
    else 
    raise "Unknown test_order: #{self.test_order.inspect}" 
    end 
end 

Bạn có thể sắp xếp lại kiểm tra bất kỳ cách nào phù hợp xung quanh. Nếu bạn xác định các thử nghiệm đặt hàng đặc biệt của mình với

test 'some special ordered test' do 
end 

, đừng quên xóa chúng khỏi kết quả của cuộc gọi siêu.

Trong ví dụ của tôi, tôi cần phải chắc chắn chỉ trong một thử nghiệm cụ thể để chạy cuối cùng, vì vậy tôi giữ trật tự ngẫu nhiên trên toàn bộ bộ và đặt 'run_last' ở cuối của nó.

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