Tại sao các khung xUnit không cho phép các bài kiểm tra chạy song song?


15

Bạn có biết bất kỳ khung xUnit nào cho phép chạy thử nghiệm song song, để sử dụng nhiều lõi trong máy ngày nay không?

Nếu không có (hoặc rất ít) trong số họ làm điều đó, có thể có một lý do ... Có phải các bài kiểm tra thường nhanh đến mức mọi người đơn giản không cảm thấy cần phải làm tê liệt chúng?

Có một cái gì đó sâu hơn ngăn cản phân phối (ít nhất là một số) các bài kiểm tra trên nhiều luồng không?


Kiểm tra đơn vị chắc chắn là chậm. Ngay cả khi mỗi bài kiểm tra tự nó nhanh, chúng sẽ tích lũy khi mọi người thực sự có hàng triệu trường hợp kiểm tra.
Pacerier

Câu trả lời:


6

NUnit 2.5 gói pNUnit cho phép chạy các bài kiểm tra song song.

Bản phát hành này bao gồm pNUnit, một trình chạy NUnit mở rộng cho các bài kiểm tra song song phân tán. Chương trình pNUnit được phát triển tại Codice Software để sử dụng để thử nghiệm SCM nhựa và đã được đóng góp cho NUnit. Để biết thêm thông tin về việc sử dụng pNUnit, hãy xem trang web pNUnit.

Phía JUnit có song song cũng như amino .


Vì vậy, lý do duy nhất cho các khung công tác khác là "chưa được triển khai"?
Xavier Nodet

1
@Xavier Có; đó là một tuyên bố công bằng
Aaron McIver

10

Để trả lời phần thứ hai của câu hỏi của bạn: Có điều gì sâu hơn ngăn cản việc phân phối (ít nhất là một số) các bài kiểm tra trên nhiều luồng không?

Rất nhiều mã chỉ hoạt động khi chạy một luồng. Thật vô tình khi vô tình tạo ra sự tranh chấp tài nguyên và sự bế tắc khi viết chương trình với giả định rằng chúng sẽ được chạy một luồng. Và điều này hoạt động tốt bởi vì hầu hết các chương trình thực sự chạy luồng đơn. Tính song song có được bằng cách chạy nhiều bản sao hoặc các chương trình khác nhau cùng một lúc (tập lệnh web là một ví dụ phổ biến - nhiều người dùng truy cập vào một trang có nghĩa là có nhiều bản sao của tập lệnh cho trang đó chạy cùng một lúc).

Hãy tưởng tượng một lớp "đăng nhập vào tập tin" đơn giản. Khi bạn tạo một cá thể, nó sẽ mở tệp để ghi, khi bạn giải phóng thể hiện đó, nó sẽ đóng tệp. Vì vậy, thử nghiệm đầu tiên tạo ra một thể hiện và bắt đầu chạy thử nghiệm. Thử nghiệm thứ hai thực hiện điều tương tự trong một luồng thứ hai. Và không thành công, vì phiên bản thứ hai không thể có quyền ghi vào tệp. Nhưng nếu chạy một lúc tất cả các bài kiểm tra sẽ vượt qua.

Tất cả điều này có thể được mã hóa xung quanh và ví dụ đơn giản có thể được điều chỉnh để hoạt động. Nhưng làm điều đó có lẽ là không cần thiết cho chương trình ban đầu . Phải viết mã an toàn luồng chỉ để bạn có thể chạy thử nghiệm đơn vị là không hợp lý đối với nhiều người. Vì vậy, các bài kiểm tra đơn vị đa luồng nên vẫn là một tùy chọn bổ sung.


+1 Đây phải là câu trả lời bị loại trừ vì nó thực sự trả lời tại sao.
Oliver Weiler

4

Nếu các kiểm tra cần thiết lập và truy vấn cơ sở dữ liệu, các kiểm tra chạy song song sẽ can thiệp lẫn nhau trừ khi có cơ sở dữ liệu riêng cho mỗi kiểm tra chạy song song.


Đó không phải là nền tảng thử nghiệm (xUnit) quan tâm; đó là một chi tiết thực hiện.
Aaron McIver

Và không phải tất cả các bài kiểm tra được viết trong khung kiểm thử đơn vị đều là các bài kiểm tra đơn vị, giống như bài kiểm tra truy cập cơ sở dữ liệu không thực sự là bài kiểm tra đơn vị, giống như bài kiểm tra tích hợp.
c_maker

Chỉ vì một bài kiểm tra chạm vào cơ sở dữ liệu không có nghĩa đó là một bài kiểm tra tích hợp. Ví dụ, một phương thức chạy một phần trong C # và một phần trong cơ sở dữ liệu vẫn là một thử nghiệm đơn vị, miễn là không có cấu hình trước được mong đợi (nghĩa là có lược đồ dữ liệu, nhưng không có dữ liệu). Các thử nghiệm như vậy có thể tạo dữ liệu cho một lần chạy riêng lẻ, nhưng nên đặt lại về trạng thái trống khi kết thúc). Đây có lẽ là một ý kiến ​​gây tranh cãi, nhưng các thử nghiệm như vậy không thể được coi là thử nghiệm tích hợp, bởi vì chúng rõ ràng là các thử nghiệm zero-config, zero-integration để kiểm tra các đơn vị mã nhỏ.
Triynko

2

Mặc dù JUnit per se có thể không cho phép điều đó (mặc dù tôi không quen thuộc lắm với các phiên bản mới nhất của nó), Maven với plugin Surefire của nó có tùy chọn để chạy thử nghiệm song song. Tôi chưa thử nó mặc dù.

Tôi không bị ép buộc phải điều tra tùy chọn này, vì chúng tôi chỉ có hơn một nghìn bài kiểm tra và chúng chạy đủ nhanh. Tuy nhiên, tôi biết rằng một số thiết bị kiểm tra có sự phụ thuộc ngầm giữa (chúng tôi đã tìm thấy một số phụ thuộc như vậy khi một số thử nghiệm bị hỏng bất ngờ trong quá khứ), do đó, có một rủi ro là việc song song các thử nghiệm sẽ khiến một số trong số chúng thất bại khó lường. Bạn có thể nói điều này là tốt vì nó làm cho vấn đề rõ ràng. Tuy nhiên, chúng tôi đang xử lý một hệ thống cũ và chúng tôi có nhiều vấn đề quan trọng hơn để giải quyết - thời gian là nguồn lực khan hiếm (như thường lệ).


0

Mã hóa đa luồng không tầm thường. Ngay cả khi được thực hiện bởi những người biết họ đang làm gì, lỗi phụ thuộc thời gian có thể xảy ra. Chúng rất khó sửa. Đã xử lý một vài nghìn lỗi loại đa trường hợp có thể tạo ra, tôi không muốn có chúng trong khung thử nghiệm của mình. Bản sửa lỗi đầu tiên tôi đã xuất hiện để hoạt động, nhưng khi thử nghiệm thêm, người ta thấy rằng nó đã trở thành một trong hàng chục ngàn lỗi.

Các kỹ thuật để thực hiện đa luồng trên nhiều bộ xử lý đang trở nên tốt hơn với sự ra đời của các PC đa bộ xử lý. Tuy nhiên, sẽ mất thời gian trước khi chúng được sử dụng rộng rãi.

Một số bộ kiểm thử có sự phụ thuộc giữa các kiểm tra không cần phải được nêu rõ ràng khi các kiểm tra được chạy trong một luồng. Tuy nhiên, trên một động cơ đa hơi, chúng sẽ cần phải được tuyên bố rõ ràng. (Trường hợp phụ thuộc như vậy nên tồn tại là một câu hỏi khác nhau.)

Từ quan điểm khác, một số thứ không cần phải được chạy song song. Đó là quá trình chạy đủ nhanh, có thể tốt hơn để tập trung nỗ lực vào những thứ khác hơn là thực hiện đa luồng.


0

MBUnit có thể chạy thử nghiệm song song chỉ bằng cách chỉ định một số thuộc tính cấp độ lắp ráp.

[assembly: DegreeOfParallelism(6)]
[assembly: Parallelizable(TestScope.All)]

Tôi đã sử dụng dự án đó để chạy các thử nghiệm selen song song khá thành công trong một thời gian. Thật không may, dự án không còn sống nhiều nữa.

xUnit 2.0 cũng sẽ hỗ trợ kiểm tra đơn vị song song nhưng tôi chưa thử.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.