2010-04-06 26 views
46

Bộ công cụ của chúng tôi có hơn 15000 JUnit kiểm tra và nhiều thử nghiệm được xác định là không thành công nếu một số thử nghiệm khác không thành công. Ví dụ, nếu phương thức X.foo() sử dụng chức năng từ Y.bar() và YTest.testBar() không thành công, thì XTest.testFoo() cũng sẽ thất bại. Rõ ràng, XTest.testFoo() cũng có thể thất bại vì các vấn đề cụ thể đối với X.foo().Làm cách nào tôi có thể chỉ định các phụ thuộc kiểm tra JUnit?

Trong khi điều này là tốt và tôi vẫn muốn cả hai thử nghiệm chạy, nó sẽ là tốt đẹp nếu người ta có thể chú thích một phụ thuộc kiểm tra với XTest.testFoo() trỏ đến YTest.testBar(). Bằng cách này, người ta có thể ngay lập tức thấy chức năng nào được sử dụng bởi X.foo() cũng không thành công, và những gì không.

Có chú thích như vậy trong JUnit hay ở nơi khác không? Một cái gì đó như:

public XTest { 

    @Test 
    @DependsOn(method=org.example.tests.YTest#testBar) 
    public void testFoo() { 
    // Assert.something(); 
    } 

} 
+0

Đây là một chủ đề tuổi già, tuy nhiên: Nếu X.foo() sử dụng Y.bar() kiểm tra phải giả Y.bar(), nếu không (!) kiểm tra của bạn không phải là một bài kiểm tra đơn vị (nhưng một bài kiểm tra tích hợp). Toàn bộ ý tưởng của các bài kiểm tra đơn vị là không có bất kỳ sự phụ thuộc nào. Tuy nhiên, tôi ở đây vì một lý do ;-) – letmejustfixthat

Trả lời

22

JExampleTestNG có điều gì đó tương tự.

Tôi không biết nó hữu ích như thế nào, nhưng nếu bạn thử, hãy quay lại để cho chúng tôi biết nó có hữu ích không.

+3

Vâng, nó có vẻ như là một khởi đầu tuyệt vời: http://chem-bla-ics.blogspot.com/2010/08/specifying-unit-test-dependencies-with. html –

+1

Nó hữu ích trong tình huống khi ClassA.methodA() gọi ClassB.methodB() và cả hai mất rất nhiều thời gian. Trong trường hợp này, bạn có thể chỉ định rằng testMethodA() phụ thuộc vào testMethodB(), đó là nếu testMethodB() không thành công, testMethodA() cũng không thành công ** nếu không thực thi **. – Cherry

+0

@Cherry: Âm thanh như một cái cớ để không viết [kiểm tra nhanh] (http://agileinaflash.blogspot.fi/2009/02/first.html). Một số tùy chọn để cải thiện thiết kế: (1) làm cho methodB nhanh, (2) làm cho methodA không phụ thuộc vào methodB, (3), sử dụng test double cho ClassB khi kiểm tra ClassA. –

1

Có thực sự không phải là một cái gì đó như thế này mà tôi biết. (Chỉnh sửa: bạn học điều gì đó mới mỗi ngày :)) Theo tôi, đây không phải là điều xấu (mặc dù tôi có thể thấy nó hữu ích, đặc biệt khi JUnit nó được sử dụng cho các hình thức kiểm tra tự động khác - ví dụ: kiểm thử tích hợp). Các xét nghiệm của bạn, IMO, không theo nghĩa nghiêm ngặt của từ "kiểm tra đơn vị" (ít nhất không phải là thử nghiệm cho X#foo()). Các thử nghiệm cho X#foo() sẽ thành công hoặc không thành công tùy thuộc vào số chỉ khi triển khai X#foo(). Nó không nên phụ thuộc vào Y#foo().

Điều tôi muốn làm ở vị trí của bạn là thử Y, và thực hiện một cái gì đó như MockY#foo() với hành vi được kiểm soát rất đơn giản và sử dụng trong các thử nghiệm của X#foo().

Điều đó nói rằng, với 15.000 bài kiểm tra, tôi có thể thấy điều này sẽ là một nỗi đau để tái cấu trúc. :)

+1

Tôi không thấy lý do tại sao các bài kiểm tra đơn vị không thể có phụ thuộc ... bộ công cụ của chúng tôi xác định đối tượng dữ liệu và thuật toán ... mong đợi thuật toán tự động chính xác cho điều đó? Có lẽ việc đặt tên của cả hai phương thức foo() là gây hiểu nhầm ... –

+0

Chỉ các thử nghiệm mô phỏng nghiêm ngặt sẽ không thể hiện bất kỳ sự phụ thuộc nào với nhau (và chúng vẫn có thể ...). Nói chung, các phụ thuộc như vậy luôn có thể và phải phản ánh các phụ thuộc trong thiết kế OO. Tôi tin rằng việc duy trì chú thích trên tất cả các thử nghiệm sẽ thêm vào sự phức tạp mà không có lợi ích đáng kể, nhưng việc chú thích như vậy trong một vài trường hợp cốt lõi có thể có lợi. – topchef

3

Bạn có thể khai báo test dependencies in TestNG, cú pháp gần như giống như trong ví dụ của bạn. Tôi không nghĩ rằng JUnit cung cấp một cái gì đó tương tự.

+1

https://github.com/junit-team/junit.contrib/tree/master/assumes – jplandrain

1

Trong behavior driven design thư viện jBehave có từ khóa GivenScenarios nhập danh sách các tình huống được chạy trước kịch bản chính. Điều này tạo cơ hội để xác định các phụ thuộc và có một điểm thất bại. Việc ghi nhật ký của jBehave sẽ cho bạn biết nếu kiểm tra thất bại trong các phần phụ thuộc hay phần thân chính.

17

Có một đóng góp cho JUnit rằng địa chỉ này: https://github.com/junit-team/junit.contrib/tree/master/assumes

+3

Tốt, tốt! Tôi hy vọng nó sẽ được sáp nhập trong thời gian sớm :) –

+0

Điều này có vẻ chưa có trong trung tâm maven (xem http://search.maven.org/#search%7Cga%7C1%7Cjunit-contrib). Làm thế nào để bạn sử dụng nó? Hay bạn có sử dụng cái gì khác bây giờ? – koppor

3

org.junit.FixMethodOrder

@FixMethodOrder (MethodSorters.NAME_ASCENDING) này đi trên đầu trang của lớp thử nghiệm đơn vị của bạn.

Bạn có thể đặt tên cho phương pháp của bạn public void step1_methodName vv

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