2012-03-12 43 views
13

Tôi đang sử dụng JUnit4.Làm cách nào để các trường hợp kiểm tra JUnit chạy theo thứ tự tuần tự?

Tôi có một bộ phương pháp thử trong một trường hợp thử nghiệm.

Mỗi phương pháp thử chèn một số bản ghi và xác minh kết quả kiểm tra và cuối cùng xóa các bản ghi được chèn vào.

Do JUnit chạy song song, phương pháp thử không thành công do thực hiện phương pháp thử trước đó. Điều này xảy ra chỉ trong máy đồng nghiệp của tôi (Windows 7), không phải trong máy của tôi (Cent OS 6).

Điều chúng tôi cần là phương pháp thử phải vượt qua tất cả các máy của chúng tôi.

Tôi đã thử xóa các bản ghi trong phương thức Setup() nhưng một lần nữa nó chỉ hoạt động trên máy của tôi. Có bất kỳ tùy chọn có sẵn trong JUnit để làm cho các phương pháp thử nghiệm để chạy theo thứ tự tuần tự thống nhất không?

Xin cảm ơn,

Trả lời

5

Thứ tự kiểm tra không được đảm bảo trong JUnit.

Lý do cho điều này là các bài kiểm tra đơn vị có nghĩa là nguyên tử - tất cả các thiết lập sẽ xảy ra trong các phương pháp thiết lập/rớt xuống, nhưng không phải bằng các thử nghiệm khác.

Cân nhắc di chuyển mã chèn dữ liệu vào một lớp trợ giúp khác có thể được gọi bằng cả bài kiểm tra đang chèn và lớp cần xác minh và gọi lớp đó trong các phương thức @Trước của bạn.

Bạn cũng nên xem xét một giải pháp mocking (ví dụ như Mockito) trái ngược với việc nhấn cơ sở dữ liệu trực tiếp nếu bạn có thể - mocking sẽ đi một chặng đường dài để đảm bảo rằng bài kiểm tra của bạn là tốt đẹp và bị cô lập. thường giúp chỉ ra nơi bạn có thể sử dụng một số tái cấu trúc.

+0

Cảm ơn câu trả lời của bạn, tôi sẽ kiểm tra. – Athiruban

+1

Bạn cũng có thể sử dụng một cái gì đó như DBUnit để kiểm soát thiết lập cơ sở dữ liệu của bạn và teardown, nhưng đối với thử nghiệm đơn vị tinh khiết Mockito có ý nghĩa hơn vì nó cho phép kiểm tra hoàn toàn độc lập. – TrueDub

2

Vì bạn đang chạy thử nghiệm song song và bạn đang nhấn cơ sở dữ liệu, bạn rất có khả năng gặp sự cố, vì cơ sở dữ liệu không nhất thiết phải ở trạng thái mạch lạc cho mỗi thử nghiệm.

Giải pháp: không chạy song song các thử nghiệm của bạn. JUnit không chạy thử nghiệm song song theo mặc định, do đó, hoặc bạn đang thiết lập tùy chọn trong maven hoặc sử dụng một trong các trình chạy song song trong JUnit.

Nếu bạn vẫn gặp sự cố giữa các lần kiểm tra không thành công trên Windows nhưng không phải trên hệ điều hành Cent, thì đó có thể là sự cố với lệnh chạy mà bạn cần khắc phục. Xem câu trả lời của tôi cho Has JUnit4 begun supporting ordering of test? Is it intentional?.

Cách xung quanh điều này (ít nhất là trong thuật ngữ JUnit) là loại bỏ sự phụ thuộc giữa các thử nghiệm. Về cơ bản, JUnit không hỗ trợ đặt hàng và các bài kiểm tra sẽ có thể được chạy theo bất kỳ thứ tự nào.

Nếu bạn thực sự cần phải có sự phụ thuộc giữa các thử nghiệm, hãy sử dụng TestNG, nơi bạn có thể có các phụ thuộc.

23

JUnit 4.11 hiện hỗ trợ chỉ định thứ tự thực hiện bằng cách sử dụng chú thích @FixMethodOrder.

21

MethodSorters là một lớp mới được giới thiệu sau khi phát hành Junit 4.6. Lớp này đã khai báo ba loại lệnh thi hành, có thể được sử dụng trong các trường hợp thử nghiệm của bạn trong khi thực thi chúng.

  1. NAME_ASCENDING (MethodSorters.NAME_ASCENDING) - Sắp xếp các phương pháp thử nghiệm bằng tên phương pháp, để tự từ điển.

  2. JVM (null) - Lá các phương pháp thử theo thứ tự được trả về bởi JVM. Lưu ý rằng thứ tự từ JVM của tôi thay đổi từ khi chạy.

  3. DEFAULT (MethodSorter.DEFAULT) - Sắp xếp các phương pháp thử nghiệm trong một xác định, nhưng không thể dự đoán được, trật tự.

.

import org.junit.FixMethodOrder; 
import org.junit.Test; 
import org.junit.runners.MethodSorters; 

//Running test cases in order of method names in ascending order 

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class OrderedTestCasesExecution { 

    @Test 
    public void secondTest() { 
     System.out.println("Executing second test"); 
    } 

    @Test 
    public void firstTest() { 
     System.out.println("Executing first test"); 
    } 

    @Test 
    public void thirdTest() { 
     System.out.println("Executing third test"); 
    } 
} 

Output:

Executing first test 
Executing second test 
Executing third test 

tham khảo: http://howtodoinjava.com/2012/11/24/ordered-testcases-execution-in-junit-4/

-1

Không có vấn đề chạy thử nghiệm song song ngay cả khi bạn có lớp dữ liệu của bạn trong đó. Nhưng bạn cần phải có thêm công việc để tạo MOCK UPs cho dữ liệu của bạn để không nó sẽ không nhấn vào cơ sở dữ liệu. Bạn có thể sử dụng các khuôn khổ mockup khác nhau như Mockito, EasyMock và Arquillian.

+0

Arquillian không phải là một khuôn khổ mocking. xem http://arquillian.org/ –

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