Làm thế nào để thiết lập các tham số JVM cho Junit Unit Test?


95

Tôi có một số bài kiểm tra đơn vị Junit yêu cầu một lượng lớn không gian heap để chạy - tức là 1G. (Họ kiểm tra chức năng sử dụng nhiều bộ nhớ cho một ứng dụng khởi động web sẽ chỉ chạy với đủ dung lượng heap và sẽ được chạy nội bộ trên các máy Win 7 64-bit - vì vậy việc thiết kế lại các bài kiểm tra không phải là một gợi ý thực tế.)

Tôi đang phát triển trong Intellij IDEA, vì vậy tôi biết mình có thể đặt các thông số JVM (ví dụ -Xmx1024M) cho lớp thử nghiệm. Tuy nhiên, điều này chỉ để chạy toàn bộ lớp thử nghiệm - nếu tôi muốn chạy một bài kiểm tra riêng lẻ, tôi phải tạo lại cấu hình chạy cho phương pháp kiểm tra đó.

Ngoài ra, đó là IDE và hộp cụ thể - vì vậy nếu tôi chuyển hộp (tôi phát triển trên nhiều máy) hoặc một trong những đồng nghiệp của tôi cố gắng chạy thử nghiệm, những cài đặt đó sẽ không được chuyển. (Ngoài ra, các IDE khác như Eclipse và NetBeans cũng được các đồng nghiệp của tôi sử dụng.) FWIW, chúng tôi đang sử dụng thương mại để kiểm soát mã nguồn.

Đối với chu trình xây dựng, chúng tôi đang sử dụng Maven, vì vậy tôi biết cách chỉ định các tham số JVM cho điều đó.

Vì vậy: - Tôi đang tìm cách chỉ định các tham số JVM sẽ áp dụng cho toàn bộ lớp thử nghiệm và các phương pháp thử nghiệm riêng lẻ; và - Tôi muốn chia sẻ các thông số kỹ thuật đó qua các IDE trên bất kỳ máy nào (sau khi lấy mã từ kho lưu trữ).


Tôi nghi ngờ nó khả thi. Trên các máy, đối với một IDE nhất định, nó phải khả thi. Nhưng trên các IDE, tôi không thấy làm thế nào.
JB Nizet

@JBNizet - Tôi rất vui khi xem các máy cho một IDE nhất định (với điều kiện là Intellij IDEA).
amaidment

Câu trả lời:


48

Trong IntelliJ, bạn có thể chỉ định cài đặt mặc định cho từng cấu hình chạy. Trong hộp thoại cấu hình Run / Debug (hộp thoại bạn sử dụng để định cấu hình heap cho mỗi lần kiểm tra), nhấp vào DefaultsJUnit . Các cài đặt này sẽ được tự động áp dụng cho mỗi cấu hình thử nghiệm JUnit mới. Tôi đoán cài đặt tương tự tồn tại cho Eclipse.

Tuy nhiên, không có tùy chọn đơn giản nào để chuyển các cài đặt như vậy (ít nhất là trong IntelliJ) qua các môi trường. Bạn có thể cam kết các tệp dự án IntelliJ vào kho lưu trữ của mình: nó có thể hoạt động, nhưng tôi không khuyến khích.

Bạn biết cách thiết lập những điều này cho maven-surefire-plugin. Tốt. Đây là cách dễ di chuyển nhất (xem câu trả lời của Ptomli để làm ví dụ).

Đối với phần còn lại - bạn phải nhớ rằng các trường hợp thử nghiệm JUnit chỉ là một loạt các lớp Java, không phải là một chương trình độc lập. Đó là tùy thuộc vào người chạy (giả sử nó là một trình chạy JUnit độc lập, IDE của bạn, maven-surefire-pluginđể đặt các tùy chọn đó. Điều đó được cho là không có cách "di động" để thiết lập chúng, do đó cài đặt bộ nhớ được áp dụng bất kể người chạy.

Để cung cấp cho bạn một ví dụ: bạn không thể xác định Xmxtham số khi phát triển một servlet - tùy thuộc vào vùng chứa để xác định điều đó. Bạn không thể nói: "servlet này phải luôn được chạy với Xmx=1G.


cấu hình Run / Debug ở đâu? Tôi không thấy điều này trong tùy chọn hoặc menu ngữ cảnh khi tôi chạy thử nghiệm?
Dean Hiller

2
Lưu ý rằng điều này sẽ KHÔNG thay đổi cấu hình chạy JUnit hiện có, chỉ những cấu hình được tạo sau khi bạn thay đổi giá trị mặc định. Bạn phải thay đổi những cái hiện có theo cách thủ công.
MikeFHay

78

Trong Maven, bạn có thể định cấu hình plugin surefire

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.9</version>
    <configuration>
        <argLine>-Xmx256M</argLine>
    </configuration>
</plugin>

Nếu bạn sử dụng Maven cho các bản dựng thì cấu hình này sẽ được đưa vào cây nguồn và được áp dụng khi thực hiện các thử nghiệm. Xem tài liệu về Maven Surefire Plugin .


1
@ptomli - Tôi luôn không tin vào những nhận xét bắt đầu "Chắc chắn là ...". Tích hợp Intellij maven sử dụng cấu hình plugin pom khi chạy các tác vụ trong chu kỳ xây dựng maven. Chạy các bài kiểm tra đơn vị trong IDE là một quá trình riêng biệt và theo mặc định không có kiến ​​thức về quá trình xây dựng. Theo hiểu biết của tôi, không có cách nào kết nối những điều này - mặc dù tôi rất vui khi được cho biết cách khác. Đây có phải là điều bạn có kiến ​​thức / đã làm - trong trường hợp này, bạn có thể chia sẻ cách thực hiện không?
amaidment

1
Tôi không chắc điều đó có thể xảy ra trong Intellij. TBH, ngay cả khi có, tôi sẽ không muốn sử dụng cách tiếp cận đó, vì rất có thể, nếu tôi đang chạy các bài kiểm tra đơn vị trong IDE, tôi muốn tận dụng trình gỡ lỗi IDE, điều mà tôi không thể làm bằng cách chạy thử nghiệm mvn.
amaidment

5
Trên thực tế, hội nhập Maven IntelliJ của không sử dụng cấu hình Maven chắc chắn khi thực hiện kiểm tra đơn vị cá nhân. Sử dụng cấu hình Maven ở trên sẽ dẫn -Xmx256Mđến việc được chuyển đến dòng lệnh Java khi thực hiện các bài kiểm tra đơn vị của bạn trực tiếp từ IntelliJ. Điều này vừa khiến tôi bối rối :-(
Kkkev

1
FYI: Netbeans cũng sử dụng Maven Suefire để chạy thử nghiệm của nó
Ferrybig

1
@Kkkev Tích hợp Maven của IntelliJ khác với việc chạy thử nghiệm riêng lẻ trong IntelliJ. Đầu tiên sử dụng cấu hình chạy Maven (và do đó đọc đối số), thứ hai sử dụng cấu hình JUnit, TestNG ...
andresp


14

Theo câu hỏi hỗ trợ này https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

đối số -Xmx cho lần chạy thử nghiệm IntelliJ junit sẽ đến từ plugin maven-surefire-nếu nó được đặt.

Đoạn mã pom.xml này

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <argLine>-Xmx1024m</argLine>
            </configuration>
        </plugin>

dường như chuyển đối số -Xmx1024 cho lần chạy thử nghiệm junit, với IntelliJ 2016.2.4.


13

Tôi đồng ý với những người khác nói rằng không có cách nào đơn giản để phân phối các cài đặt này.

Đối với Eclipse: yêu cầu đồng nghiệp của bạn thiết lập những điều sau:

  • Tùy chọn Windows / Java / JRE đã cài đặt:
  • Chọn JRE / JDK thích hợp (hoặc làm điều đó cho tất cả chúng)
  • Biên tập
  • Đối số VM mặc định: -Xmx1024m
  • Kết thúc, OK.

Sau đó, tất cả thử nghiệm sẽ chạy với -Xmx1024mnhưng tiếc là bạn đã thiết lập nó trong mọi cài đặt Eclipse. Có thể bạn có thể tạo một gói Eclipse tùy chỉnh chứa cài đặt này và cung cấp cho đồng nghiệp của bạn.

Quá trình làm việc sau đây cũng có thể hữu ích: Nếu IDE không thể chạy thử nghiệm, nhà phát triển nên kiểm tra xem Maven có thể chạy thử nghiệm này hay không.

  • Nếu Maven có thể chạy nó, nguyên nhân của lỗi thường là do cài đặt IDE của nhà phát triển. Nhà phát triển nên kiểm tra các cài đặt này.
  • Nếu Maven cũng không thể chạy thử nghiệm, nhà phát triển biết rằng nguyên nhân của lỗi không phải là IDE, vì vậy họ có thể sử dụng IDE để gỡ lỗi kiểm tra.

Nói rằng dự án phải xây dựng với maven không phải là rất hữu ích. (Chúng tôi chỉ xây dựng với maven.) Tuy nhiên, gợi ý của bạn là chúng tôi chỉ nên chạy thử nghiệm như một phần của chu trình xây dựng maven - chúng tôi thường sử dụng các thử nghiệm tương tự để gỡ lỗi trong IDE. (Với lợi ích hơn nữa rằng một khi một cái gì đó đã được gỡ lỗi nó rất dễ dàng để giữ cho những thử nghiệm trong xây dựng chu kỳ.)
amaidment

ok - nhưng bây giờ bạn chỉ cần lặp lại câu trả lời Tomasz, nhưng với thông số kỹ thuật Eclipse ...
amaidment

2

Bạn có thể sử dụng systemPropertyVariables (java.protocol.handler.pkgs là tên đối số JVM của bạn):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.12.4</version>
    <configuration>
        <systemPropertyVariables>
            <java.protocol.handler.pkgs>com.zunix.base</java.protocol.handler.pkgs>
            <log4j.configuration>log4j-core.properties</log4j.configuration>
        </systemPropertyVariables>
    </configuration>
</plugin>

http://maven.apache.org/surefire/maven-surefire-plugin/examples/system-properties.html


1

Một giải pháp thay thế cụ thể của nhật thực giới hạn đối với thông số JVM java.library.path cho phép đặt nó cho một thư mục nguồn cụ thể thay vì cho toàn bộ jdk như được đề xuất trong một phản hồi khác:

  1. chọn thư mục nguồn chứa chương trình bắt đầu (thường là source / test / java)
  2. gõ alt enter để mở trang Thuộc tính cho thư mục đó
  3. chọn bản địa trong bảng điều khiển bên trái
  4. Chỉnh sửa đường dẫn gốc. Đường dẫn có thể là tuyệt đối hoặc tương đối với không gian làm việc, thứ hai là thay đổi linh hoạt hơn.

Đối với những người quan tâm đến chi tiết về lý do tại sao thẻ maven argline nên được ưu tiên hơn thẻ systemProperties, hãy xem, ví dụ:

Chọn các tệp JNI gốc trong kiểm tra Maven (lwjgl)


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.