2011-11-28 39 views
6

Có cách nào để biết trong Lớp kiểm tra JUnit 4 không, nếu Lớp học được khởi xướng bởi một Test-Suite? Tôi có những thứ toàn cầu mà tôi muốn chạy trước tất cả các bài kiểm tra (liên quan đến bộ nhớ trong DB), vì vậy tôi nghĩ rằng nó sẽ làm trong thử nghiệm. Tuy nhiên, tôi vẫn muốn có thể bắt đầu một bài kiểm tra tại một thời điểm mà không cần Test-Suit, Vì vậy, tôi cần phải biết liệu tôi có cần khởi tạo những thứ toàn cầu trong phần @ Trước khi kiểm tra ... Có ai biết không nếu có thể ?Yêu cầu kiểm tra: cách thiết lập chung cho tất cả các phòng thử nghiệm

Trả lời

5

Có một số cách để đạt được điều này. Cách dễ nhất và đơn giản nhất là có 'kiểm tra' được chạy ở đầu và cuối bộ phần mềm của bạn để thiết lập cơ sở dữ liệu của bạn và sau đó đặt cờ toàn cầu. Trong các bài kiểm tra @Before và @After của bạn, bạn kiểm tra cờ này và nếu cần thiết, hãy thiết lập/rách.

@RunWith(Suite.class) 
@SuiteClasses({SetupTest.class, RealTest.class, TeardownTest.class}); 

Đây là giải pháp đơn giản nhất, nhưng nó không phải là rất tốt đẹp, do đó, giải pháp neater sẽ là sử dụng TestRule. Xem xét mở rộng ExternalResource. Công cụ này triển khai trước & sau khi logic bao quanh các phương pháp thử nghiệm của bạn. Điều này sẽ cho phép bạn đưa ra các phương pháp @Trước và @After của bạn, để sử dụng lại cùng một mã ở mọi nơi.

Sau đó, đối với suite của bạn, bạn cũng cần triển khai trước/sau logic. Thật không may, lớp được chú thích với @RunWith (Suite.class) không thực sự được khởi tạo, vì vậy bạn không thể sử dụng hàm tạo của lớp đó, nhưng bạn có thể mở rộng Suite. Tùy thuộc vào cách bạn sẽ chạy này, bạn sẽ sẽ cần phải thực hiện một trong những nhà xây dựng, sử dụng @RunWith làm ví dụ:

public class MySuite extends Suite { 
    /** 
    * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code> 
    * 
    * @param klass the root class 
    * @param builder builds runners for classes in the suite 
    * @throws InitializationError 
    */ 
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
     this(builder, klass, getAnnotatedClasses(klass)); 
     // put your global setup here 
     // set global variable 
    } 
} 

Sau đó chạy bộ kiểm tra của bạn với

@RunWith(MySuite.class) 

Có một số nhà xây dựng được sử dụng trong các tình huống khác nhau, hãy xem các nhận xét bên cạnh từng chi tiết cụ thể. Bạn vẫn cần sử dụng biến toàn cục để Quy tắc của bạn không thực thi lại mã thiết lập. Ở trên sẽ làm việc nếu bạn chỉ muốn thực thi mã thiết lập, việc thực thi mã teardown khó hơn, nhưng có thể thực hiện được. Hãy cho tôi biết nếu bạn cần :-)

Nếu bạn muốn linh hoạt hơn (chỉ thực thi mã thiết lập cho các phương pháp cụ thể), thì hãy xem câu trả lời của tôi cho How to define JUnit method rule in a suite?.

+0

Hầu hết các liên kết đều đã chết. – Nadar

2

Tôi sẽ sử dụng chú thích @BeforeClass@AfterClass của JUnit để chỉ ra các phương pháp để thực hiện loại công việc này.

Từ Javadoc @BeforeClass:

Đôi khi một số xét nghiệm cần chia sẻ tính toán đắt tiền thiết lập (như cách đăng nhập vào một cơ sở dữ liệu). Trong khi điều này có thể thỏa hiệp sự độc lập của các thử nghiệm, đôi khi nó là một tối ưu hóa cần thiết. Chú thích phương thức public void no-arg với @BeforeClass gây ra nó sẽ được chạy một lần trước bất kỳ phương pháp thử nào trong lớp. Phương thức của các lớp siêu lớp @BeforeClass sẽ được chạy trước các lớp hiện tại.

+1

Điều này liên quan đến một số phương thức @Test được chú thích bên trong một tệp Lớp thử nghiệm, đây không phải là kịch bản mà tôi đang xử lý, tôi cần nó cho một vài CLASSES thử nghiệm. – stdcall

0

Bạn có thể đặt một số mã @BeforeClass trong mỗi bộ kiểm tra, ủy quyền cho một lớp phụ trợ được thiết lập chung. Lớp phụ trợ có thể có một số static boolean ghi lại việc thiết lập đã được thực hiện hay chưa. Nếu nó đã được thực hiện, lớp phụ trợ sẽ không làm gì cả.

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