2010-03-28 46 views
7

Tôi gặp sự cố khi tổ chức bài kiểm tra lớp học dựa trên unittest cho gia đình kiểm tra. Ví dụ giả sử tôi triển khai giao diện "từ điển" và có 5 cách triển khai khác nhau muốn thử nghiệm.kiểm tra không sử dụng lại cho gia đình của các lớp học

Tôi viết một lớp thử nghiệm để kiểm tra giao diện từ điển. Nhưng làm thế nào tôi có thể tái sử dụng nó một cách độc đáo để kiểm tra tất cả các lớp của tôi? Cho đến nay tôi làm xấu xí:

DictType = hashtable.HashDict 

Ở đầu tệp và sau đó sử dụng DictType trong lớp thử nghiệm. Để kiểm tra một lớp khác, tôi tự thay đổi DictType thành một thứ khác.

Làm cách nào để thực hiện điều này bằng cách khác? Không thể chuyển đối số cho các lớp unittest để có cách nào đẹp hơn?

Trả lời

5

Cách tôi giải quyết vấn đề này với tiêu chuẩn unittest là bằng cách phân lớp - dữ liệu ghi đè dễ dàng như phương pháp ghi đè, sau khi tất cả.

Vì vậy, tôi có một lớp cơ sở cho các bài kiểm tra:

class MappingTestBase(unittest.TestCase): 
    dictype = None 
    # write all the tests using self.dictype 

và lớp con:

class HashtableTest(MappingTestBase): 
    dictype = hashtable.HashDict 

class OtherMappingTest(MappingTestBase): 
    dictype = othermodule.mappingimpl 

Ở đây, lớp con cần ghi đè chỉ dictype. Đôi khi nó là thủ công cũng để lộ MappingTestBase sử dụng "phương pháp móc". Khi các loại được kiểm tra không có giao diện giống hệt nhau trong mọi trường hợp, điều này có thể được giải quyết bằng cách có các lớp con ghi đè các phương thức móc nếu cần - đây là mẫu thiết kế "Phương thức mẫu", xem ví dụ: this page trong đó có một bộ sưu tập đã được nhận xét và theo thời gian của một vài bài giảng video của tôi về các mẫu thiết kế - phần II là về Phương pháp mẫu và các biến thể của chúng trong khoảng 30 phút đầu tiên.

Bạn không cần phải có tất cả điều này trong một mô-đun duy nhất, tất nhiên (mặc dù tôi thường thấy rõ ràng nhất để đặt mọi thứ theo cách này, bạn cũng có thể tạo một mô-đun thử nghiệm riêng cho mỗi loại bạn đang thử nghiệm, mỗi import nhập mô-đun với lớp cơ sở trừu tượng).

+0

oh, rất đẹp, 10x alex – zaharpopov

+0

Tôi đang cố gắng sử dụng mẫu này nhưng nhận được lỗi (ví dụ như 'TypeError: 'NoneType' đối tượng là không thể gọi') vì khuôn khổ' unittest' chạy các xét nghiệm trong bối cảnh 'MappingTestBase' cũng như các lớp học có nguồn gốc. Có cách nào để ngăn chặn điều này xảy ra ? – user200783

+0

@PaulBaker, chắc chắn, bạn có thể xây dựng bộ thử nghiệm mà bạn muốn chạy khá rõ ràng, ví dụ: bằng cách sử dụng lớp 'TestLoader', hãy xem https://docs.python.org/2/library/unittest.html#unittest.TestLoader , ví dụ bằng cách phân lớp nó và ghi đè 'getTestCaseNames' để trả về' [] 'cho các lớp có phương thức thử mà bạn không muốn chạy. Hoặc, bạn có thể trang trí tất cả các phương thức thử để chỉ trả về nếu' self.dicttype là None'. phương pháp tiếp cận làm việc tốt. –

0

Bạn có thể xem testscenarios cho phép bạn đặt danh sách được gọi là kịch bản. Đoạn mã sau đó tạo ra một phiên bản của lớp thử nghiệm cho mỗi giá trị/kịch bản trong danh sách

Xem the example

Vì vậy, trong trường hợp của bạn các kịch bản sẽ là một danh sách như [{dicttype: hashtable.HashDict}, {dicttype : otherimpl.class},] và sử dụng self.dicttype trong mã thử nghiệm của bạn.

+0

oh, vì vậy điều này không thể thực hiện được với tiêu chuẩn không nhất thiết? rất dissapointing :-( – zaharpopov

+0

Chưa - xem http://www.voidspace.org.uk/python/articles/unittest2.shtml cho những gì đang được thực hiện – Mark

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