2010-07-15 37 views
15

Tôi muốn biết liệu có một số khung kiểm thử đơn vị có khả năng viết các bài kiểm tra đa luồng dễ dàng không?Làm thế nào để viết các bài kiểm tra đơn vị đa luồng?

Tôi sẽ tưởng tượng một cái gì đó như: gọi một phương pháp thử nghiệm đặc biệt bằng n chủ đề cùng một lúc cho m lần. Sau khi tất cả các chủ đề kiểm tra kết thúc, một phương thức xác nhận nơi một số ràng buộc cần được xác nhận hợp lệ sẽ được gọi ra.

Cách tiếp cận hiện tại của tôi là tạo đối tượng Thread bên trong một phương thức kiểm tra junit, vòng lặp thủ công các trường hợp kiểm thử thực bên trong mỗi phương thức run(), chờ tất cả các chủ đề và sau đó xác nhận các xác nhận. Nhưng sử dụng điều này, tôi có một khối mã bản mẫu lớn cho mỗi bài kiểm tra.

Trải nghiệm của bạn là gì?

+1

Tôi hỏi một liên quan (không trùng lặp) câu hỏi một số thời gian trở lại, và có một số câu trả lời tốt từ folks: http://stackoverflow.com/questions/537014/using-tdd -to-drive-out-thread-safe-code –

+0

Xem thêm https://stackoverflow.com/questions/12159/how-should-i-unit-test-threaded-code – Raedwald

Trả lời

11

ConTest và cũng là GroboUtils.

Tôi đã sử dụng GroboUtils nhiều năm trước và đã thực hiện công việc. ConTest là mới hơn, và sẽ là điểm bắt đầu ưa thích của tôi bây giờ, vì thay vì chỉ dựa vào thử và sai, thiết bị đo lực lượng interleavings cụ thể của các chủ đề, cung cấp một thử nghiệm xác định. Ngược lại, GroboUtils MultiThreadedTestRunner chỉ cần chạy thử nghiệm và hy vọng trình lên lịch tạo ra sự xen kẽ khiến cho lỗi luồng xuất hiện.

CHỈNH SỬA: Xem thêm ConcuTest cũng buộc phải xen kẽ và miễn phí.

+0

ConTest có vẻ tốt, nhưng có vẻ như không tự do có sẵn (tôi chỉ có thể tìm thấy bản dùng thử). – MRalwasser

+0

Ngoài ra còn có ConcuTest, mà tôi đã thêm làm bản chỉnh sửa. – mdma

4

Ngoài ra còn có MultithreadedTC bởi Bill Pugh của FindBugs nổi tiếng.

+0

+1: Tôi đã sử dụng nó trước đây, và tìm thấy nó rất tốt trong việc tạo ra interleavings cụ thể và khẳng định tài sản của bạn thực hiện. –

0

Chỉ cần sử dụng thư viện đồng thời sẽ đơn giản hóa mã của bạn. Bạn có thể biến mã tấm nồi hơi của bạn thành một phương pháp.

Something như

public static void runAll(int times, Runnable... tests) { 

} 
+0

Điều này không trả lời câu hỏi. Có, mã sẽ đơn giản hơn, và một số rủi ro bị loại bỏ, nhưng nó vẫn phải được kiểm tra bằng cách nào đó. –

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