2013-06-23 71 views
10

Tôi muốn lặp qua danh sách các mục và chạy xác nhận trên mỗi mục. Một ví dụ có thể kiểm tra xem mỗi số trong một danh sách là lẻ.Khởi tạo Python unittest.TestCase với đối số

TestCase:

class TestOdd(unittest.TestCase): 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(NUMBER %2==1, "Number should be odd") 

thử nghiệm suite:

if __name__ == '__main__': 
    suite = unittest.TestSuite() 
    suite.addTest(TestOdd()) 
    # I would like to have: 
    # suite.addTest(TestOdd(1)) 
    # suite.addTest(TestOdd(2)) 
    # suite.addTest(TestOdd(3)) 
    # ... 
    unittest.main() 

Làm thế nào tôi có thể tạo một đối tượng TestOdd với một cuộc tranh cãi - ví dụ, con số này sẽ được kiểm tra?

Cập nhật: Theo bài đăng trên blog từ năm 2011 (được đăng dưới dạng câu trả lời), không có cơ chế tích hợp cho các bài kiểm tra được tham số. Tôi sẽ vui lòng chấp nhận mọi giải pháp sạch hơn.

+0

Xem thêm: [Truy cập vào lập luận argparse từ lớp] (http: //codereview.stackexchange. com/q/88655/15346) tại CR – kenorb

Trả lời

4

Tương tự có thể đạt được bằng cách sử dụng thuộc tính lớp.

class TestOdd1(unittest.TestCase): 
    NUMBER=1 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(self.NUMBER % 2 == 1, "Number should be odd") 

class TestOdd2(TestOdd1): 
    NUMBER=2 

if __name__ == '__main__': 
    unittest.main() 

Các unittesting sẽ khám phá ra một cách tự động, vì vậy không cần phải tạo ra một bộ.

Nếu bạn muốn tránh sử dụng một TestCase cho lớp cơ sở, bạn có thể sử dụng đa kế thừa:

from unittest import TestCase, main 

class TestOdd: 
    def runTest(self): 
     """Assert that the item is odd""" 
     self.assertTrue(self.NUMBER % 2 == 1, "Number should be odd") 

class TestOdd1(TestOdd, TestCase): 
    NUMBER=1 
class TestOdd2(TestOdd, TestCase): 
    NUMBER=2 

if __name__ == '__main__': 
    main() 
9

Theo "Python unit testing: parametrized test cases", được công bố trong blog của Eli Bendersky của:

chuẩn của Python unittest thư viện là rất tốt và tôi sử dụng nó mọi lúc. Tuy nhiên, một điều còn thiếu là một cách đơn giản để chạy trường hợp kiểm tra được yêu cầu. Nói cách khác, bạn không thể dễ dàng chuyển các đối số vào một unittest.TestCase từ bên ngoài.

Giải pháp của Eli được kế thừa unittest.TestCase thành ParametrizedTestCase. Tôi không chắc về vấn đề bản quyền, vì vậy tôi sẽ không sao chép-dán mã ở đây.

Nếu có giải pháp nào tốt hơn, tôi sẽ sẵn lòng chấp nhận.

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