2014-11-14 14 views
5

Theo JUnit4, tôi có một bộ thử nghiệm sử dụng chú thích @classrule để khởi động khung công tác. Điều này là cần thiết để có thể xây dựng các đối tượng nhất định trong quá trình thử nghiệm. Nó cũng tải một số thuộc tính ứng dụng tùy ý vào một tĩnh. Chúng thường dành riêng cho bộ thử nghiệm hiện tại và sẽ được sử dụng bởi nhiều thử nghiệm trong toàn bộ bộ phần mềm. bộ kiểm tra của tôi sẽ giống như thế này (nơi FrameworkResource kéo dài ExternalResource và làm rất nhiều công việc bootstrap):Có cách nào tốt để tham gia vào việc khởi tạo bộ thử nghiệm khi chạy một trường hợp thử nghiệm riêng lẻ không?

@RunWith(Suite.class) 
@SuiteClasses({com.example.test.MyTestCase.class}) 
public class MyTestSuite extends BaseTestSuite { 

    @ClassRule 
    public static FrameworkResource resource = new FrameworkResource(); 

    @BeforeClass 
    public static void setup(){ 
     loadProperties("props/suite.properties") 
    } 
} 

Các công trình trên thực sự tốt và xây dựng chính không có vấn đề thực hiện tất cả các testsuites và các trường hợp thử nghiệm của mình (SuiteClasses?). Vấn đề là khi tôi đang ở nhật thực và tôi muốn chạy một trường hợp thử nghiệm riêng lẻ với việc phải chạy toàn bộ bộ (như một phần của quá trình phát triển cục bộ). Tôi sẽ nhấp chuột phải vào tệp java Run As> JUnit Test và bất kỳ thử nghiệm nào cần tài nguyên khung công tác hoặc các thuộc tính thử nghiệm sẽ thất bại.

Câu hỏi của tôi là thế này:

  1. Liệu Junit4 cung cấp một giải pháp cho vấn đề này (mà không cần sao chép đoạn mã khởi tạo trong mọi trường hợp thử nghiệm)? Trường hợp thử nghiệm có thể nói điều gì đó như @dependsOn(MyTestSuite.class) không?
  2. Nếu Junit không có giải pháp ma thuật, có một mẫu thiết kế chung có thể giúp tôi ở đây không?

Trả lời

1

Khi bạn đang chạy chỉ một lớp thử nghiệm, một giải pháp tốt sẽ là chuyển mã khởi tạo vào lớp thử nghiệm. Bạn sẽ cần phải thêm chú thích @Before để khởi tạo các thuộc tính.

Điều đó sẽ yêu cầu bạn sao chép mã trên tất cả các lớp thử nghiệm của bạn. Để giải quyết vấn đề này, bạn có thể tạo một lớp cha trừu tượng có phương thức @Before để tất cả các lớp con có cùng một khởi tạo.

Ngoài ra, dữ liệu khởi tạo có thể là trên các biến tĩnh để kiểm tra xem liệu nó đã được khởi tạo cho thực thi cụ thể chưa.

+1

Cảm ơn bạn. Sử dụng một lớp cơ sở trừu tượng cho tất cả các trường hợp thử nghiệm là giải pháp mà tôi đã tán tỉnh nhưng tôi không hài lòng với nó. Đối với người mới bắt đầu, đó là một số lượng khá (mặc dù đơn giản) tái cấu trúc cho hàng trăm tệp lớp thử nghiệm hiện tại của tôi. Nó cũng có vẻ ngớ ngẩn rằng junit sẽ thiết kế một giải pháp cung cấp hookpoints ở cấp độ suite mà không cung cấp một cách cho các lớp thử nghiệm phụ thuộc để kích hoạt các móc đó. Nếu sử dụng một lớp cơ sở cho các bài kiểm tra là câu trả lời hay nhất, thì điều đó có ngụ ý rằng thực hành không tốt để làm bất kỳ công việc có ý nghĩa (trạng thái) nào ở cấp độ suite không? – icyitscold

+1

Điểm tốt. Như bạn nói, mỗi bài kiểm tra đơn vị phải độc lập và không có trạng thái ở bất kỳ cấp độ nào. – jordiburgos

+0

Ok, tôi sẽ mua nó. Kepping có nghĩa là mã ra khỏi các testuite là tốt như một giải pháp như bất kỳ! Cảm ơn! – icyitscold

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