2010-02-18 6 views
16

Tôi tự hỏi nếu plugin Maven surefire chạy thử nghiệm đa luồng theo mặc định (và nếu có thể số lượng chủ đề được kiểm soát?) Hoặc nếu nó chạy thử nghiệm từ các lớp thử nghiệm theo thứ tự ngẫu nhiên hoặc có thể dự đoán, hoặc nếu lệnh có thể được quyết định bởi một số phương tiện.Plugin Maven chắc chắn có chạy thử nghiệm sử dụng nhiều luồng không?

Tôi chưa xác minh điều này (Tôi sẽ làm như vậy vào ngày mai, chỉ cần tìm một số hướng dẫn và xác minh tại thời điểm này), nhưng có vẻ như các lớp JUnit Test khác nhau của tôi đang chạy thử nghiệm trong một số xen kẽ gọi món. Mà làm cho nó một nỗi đau thực sự để dàn xếp việc tạo ra các nguồn lực thử nghiệm (mà là khá nặng trong trường hợp của tôi).

Đó có thể là vấn đề kinh điển mà tôi chạy bộ ứng dụng của mình với trình chạy JUnit của Eclipse và mọi thứ chạy rất tuyến tính và phát rất đẹp. Tôi đi đến dòng Maven cmd và mọi thứ dường như đang bước qua nhau.

Trả lời

13

Theo mặc định, Maven chạy thử nghiệm của bạn trong một quy trình riêng biệt ("chia nhỏ"), không có gì khác (điều này có thể được kiểm soát bằng tham số tùy chọn forkMode).

Nếu bạn đang sử dụng TestNG hay Junit 4,7 + (từ SUREFIRE-555 ), nó có thể chạy thử nghiệm song song (xem parallelthreadCount thông số tùy chọn), nhưng đó không phải là một mặc định.

Bây giờ, trong khi tôi không chắc chắn nếu các plugin chắc chắn thành cư xử giống như JUnit, nó có thể nhận được một số kiểm soát bằng cách thủ công tạo ra một TestSuite và xác định thứ tự mà kiểm tra được thực hiện:

TestSuite suite= new TestSuite(); 
suite.addTest(new MathTest("testAdd")); 
suite.addTest(new MathTest("testDivideByZero")); 

Tuy nhiên, bạn được khuyên nên không bao giờ phụ thuộc vào thứ tự thực hiện kiểm tra, kiểm tra đơn vị thực sự phải thực sự độc lập.

P.S .: Chỉ trong trường hợp, cũng có yêu cầu này SUREFIRE-321 (để chạy thử nghiệm theo thứ tự bảng chữ cái) mà bạn có thể muốn bỏ phiếu.

+0

Xin chào, hãy nhớ tránh các bài kiểm tra tương tác, cố gắng đạt được điều đó ... Bình chọn cho cả hai vấn đề. Có vẻ như 555 giờ là một phần của bản phát hành 2.5 http://repo1.maven.org/maven2/org/apache/maven/plugins/maven-surefire-plugin/2.5/. – harschware

+0

hãy sử dụng phiên bản plugin chắc chắn 2.4.2 hoặc cao hơn trong trường hợp bạn không muốn gặp vấn đề liên quan đến OOM –

3

Trước hết, kiểm tra đơn vị của bạn phải độc lập với nhau. Điều này là do thứ tự thực hiện không được đảm bảo ngay cả bởi JUnit, do đó, mỗi bài kiểm tra nên thiết lập và xé bỏ ngữ cảnh của nó (còn gọi là test fixture) độc lập với những gì xảy ra trước hoặc sau.

Thứ tự thực hiện chắc chắn không phải ngẫu nhiên, trong JUnit nó có xu hướng giống nhau (tôi đoán thứ tự chữ cái), nhưng bạn không được xây dựng trên đó - nó có thể thay đổi bất cứ lúc nào, và rõ ràng là chắc chắn thứ tự là khác nhau.

Đây là một liên kết tốt về lý do tại sao interacting tests không phải là một ý tưởng hay.

+0

Hi, ý thức tránh các xét nghiệm tương tác, cố gắng để đến đó ... cảm ơn lời khuyên và liên kết. – harschware

2

JUnit chạy thử nghiệm theo thứ tự xuất hiện trong tệp .java (không theo bảng chữ cái). Maven-surefire chạy chúng theo thứ tự khác, nhưng không thể dự đoán được (theo như tôi có thể nói).

Lý tưởng nhất, các thử nghiệm sẽ độc lập với nhau, nhưng đơn và ngữ cảnh tĩnh có thể làm phức tạp mọi thứ. Một cách hữu ích để có được các bối cảnh tĩnh mới giữa các lần thực thi các test Test riêng lẻ của TestCase (nhưng không phải là các thử nghiệm riêng lẻ) là đặt biến forkMode trong tệp pom.xml của bạn.

<forkMode> luôn </forkMode >

0

Tôi đã tìm thấy rằng nếu bạn đang sử dụng tùy chọn -T trong lệnh maven của bạn, chắc chắn sau đó sẽ phân nhánh thành forkCount * <specified number of threads by the -T option> số quy trình đồng thời.

Để làm cho họ tất cả chạy trong một quá trình mặc dù có nhiều luồng theo quy định của -T, bạn có thể buộc forkCount là 0 bằng cách thêm tùy chọn -Dsurefire.forkCount = 0