2013-02-18 43 views
6

Tôi đang chuyển đổi bộ thử nghiệm của dự án Python từ không liên quan đến mũi. Khung công tác hiện tại của dự án (dựa trên unittest) khá phức tạp, chứa rất nhiều mã tùy chỉnh để khám phá và chạy thử nghiệm, vì vậy tôi đang cố gắng chuyển sang mũi để làm cho mọi thứ được sắp xếp hợp lý hơn.Thừa kế kiểm tra mũi Python: đồ đạc thử tải đơn vị từ các lớp con

Tôi đang gặp sự cố với mã đang tạo bộ thử nghiệm.

Khuôn khổ của dự án có hai cách để chạy thử nghiệm. Một là

class TestSomething(unittest.TestCase): 

    def setUp(self): 
     ... 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

suite = unittest.TestSuite() 
suite.addTest(unittest.makeSuite(TestSomething)) 

là cách "đơn giản", tất cả các ví dụ và hướng dẫn của Mũi đều hiển thị và hoạt động. Tuy nhiên, cách thứ hai là bằng cách định nghĩa một lớp thử nghiệm có chứa tất cả các logic kiểm tra, sau đó tạo ra trường hợp kiểm tra trong lớp con khác nhau có chứa các cấu hình thiết lập khác nhau và kế thừa các bài kiểm tra từ lớp cha:

class TestSomething(unittest.TestCase): 

    def test_x(self): 
     ... 

    def test_y(self): 
     ... 

class TestCase1(TestSomething): 

    def setUp(self): 
     ... 

class TestCase2(TestSomething): 

    def setUp(self): 
     ... 

suite = unittest.TestSuite() 

cases = [TestCase1,TestCase2] 
suite.addTests([unittest.makeSuite(case) for case in cases]) 

Đây là những gì Mũi thất bại với. Nó cố gắng chạy các phương thức thử nghiệm đầu tiên, rõ ràng là không hoạt động vì không có setUp() trong lớp cha và nhiều biến được sử dụng trong test_x() và test_y() chưa được xác định.

Tôi không tìm thấy bất kỳ ví dụ nào về việc này được thực hiện ở bất kỳ đâu và tài liệu của Nose (khá thưa thớt và khó điều hướng) dường như không đề cập đến nó. Làm thế nào điều này có thể được thực hiện để làm việc với mũi? Chúng tôi rất trân trọng bất kỳ sự giúp đỡ nào.

Trả lời

13

Trước hết, như unutbu đã lưu ý, bạn không nên cung cấp cho TestSomething tên bắt đầu bằng Test, bởi vì nose tự động xử lý các lớp như trường hợp kiểm tra. Ngoài ra, nose chạy tất cả TestCase lớp con ông tìm thấy, do đó thực hiện:

class Something(unittest.TestCase): 
    ... 

chính xác cho kết quả tương tự bạn đang gặp. Tôi nghĩ bạn không nên kế thừa từ TestCase và sử dụng lớp đó như là một sự pha trộn-in:

class Something(object): 
    def test_x(self): 
     # here the various assertEqual etc. do not resolve, but you can use them 
     # as if they were present, since in real test-cases they will be inherited 
     # from unittest.TestCase. 
     ... 
    ... 

class TestCase1(unittest.TestCase, Something): 
    def setUp(self): 
     ... 

Một cách khác để làm điều này là để thiết lập của lớp __test__ thuộc tính để False:

class TestSomething(unittest.TestCase): 
    __test__ = False 
    def test_x(self): 
     ... 


class TestCase1(TestSomething): 
    __test__ = True #must put this 
    def setUp(self): 
     ... 

Hoặc bạn có thể sử dụng nose.istestnose.nottest để đánh dấu mà lớp là một testcase và cái nào không phải là:

@tools.nottest 
class TestSomething(unittest.TestCase): 
    def test_x(self): 
     ... 

@tools.istest 
class TestCase1(TestSomething): 
    sef setUp(self): 
     ... 
+0

sử dụng trang trí mũi s đã làm các trick; nhìn lại, có vẻ như rất rõ ràng nhưng đôi khi các giải pháp rõ ràng nhất là những giải pháp khó nắm bắt nhất ... cảm ơn rất nhiều vì những lời khuyên! – Boris