2013-09-28 202 views
8

Tôi mới sử dụng Python và cố gắng làm điều gì đó thường xuyên trong Ruby. Cụ thể là, lặp qua một tập các chỉ mục, sử dụng chúng làm đối số cho hàm và so sánh kết quả của nó với một mảng kết quả đầu ra lịch thi đấu.Làm cách nào để chạy nhiều trường hợp thử nghiệm Python trong một vòng lặp?

Vì vậy, tôi đã viết nó giống như tôi thường làm trong Ruby, nhưng điều này dẫn đến chỉ là một trường hợp thử nghiệm.

def test_output(self): 
    for i in range(1,11): 
     .... 
     self.assertEqual(fn(i),output[i]) 

Tôi đang cố gắng kiểm tra mọi mục trong phạm vi. Làm thế nào tôi có thể làm điều đó?

+1

bạn có muốn tạo ra 10 trường hợp thử nghiệm riêng biệt? Mã bạn đã hiển thị hoạt động, nó chỉ thực hiện tất cả mười xác nhận trong một trường hợp thử nghiệm. – delnan

Trả lời

8

Sử dụng unittest bạn có thể hiển thị sự khác biệt giữa hai chuỗi tất cả trong một trường hợp thử nghiệm.

seq1 = range(1, 11) 
seq2 = (fn(j) for j in seq1) 
assertSequenceEqual(seq1, seq2) 

Nếu điều đó không đủ linh hoạt, sử dụng không nhất thiết, có thể tạo nhiều thử nghiệm, nhưng hơi phức tạp một chút.

Nose làm cho trên dễ dàng hơn thông qua test generators.

import nose.tools 

def test_fn(): 
    for i in range(1, 11): 
     yield nose.tools.assert_equals, output[i], fn(i) 

câu hỏi tương tự:

+1

Điều đó có ý nghĩa, cảm ơn lời giải thích. Tôi sẽ cập nhật nó. –

+0

Có lẽ không nên đặt phương pháp tạo thử nghiệm trong mệnh đề if __name__ == '__main__' vì nó sửa đổi mô-đun. Mã trình tự kiểm tra không có ý nghĩa nếu không có mã thế hệ. –

+1

Điểm tốt @JappieKerk, tôi đã xóa khoản này. –

5

Trong python thế giới hai lựa chọn phổ biến nhất để viết bài kiểm tra bao gồm:

Trong pytest bạn parametrize kiểm tra rất easly: ​​

@pytest.mark.parametrize(('param1', 'param2'),[ 
         (1, 'go'), 
         (2, 'do not go')]) 
def test_me(param1, param2): 
    # write test 

Điều này sẽ tạo ra đẹp cũng trong khi chạy thử nghiệm:

go.py:2: test_me[1-go] PASSED 
go.py:2: test_me[2-do not go] PASSED 

Tôi đang sử dụng pytest trong hai năm bây giờ và nó là công cụ rất đẹp. Bạn có nhiều tính năng ở đó. Bên cạnh đó parametrization có đồ đạc cũng, xác nhận rất rất tốt đẹp (bạn không cần phải viết assertEqual, chỉ assert a==b và pytest có thể tạo ra sản lượng rất tốt đẹp và hữu ích cho nó.)