Bagaimana cara mengatur parameter JVM untuk Tes Unit Junit?

96

Saya memiliki beberapa unit test Junit yang membutuhkan banyak ruang untuk dijalankan - yaitu 1G. (Mereka menguji fungsionalitas intensif memori untuk aplikasi webstart yang hanya akan berjalan dengan ruang heap yang cukup, dan akan dijalankan secara internal pada mesin Win 7 64-bit - jadi mendesain ulang pengujian bukanlah saran praktis.)

Saya mengembangkan di Intellij IDEA, jadi saya tahu saya dapat mengatur parameter JVM (misalnya -Xmx1024M) untuk kelas pengujian. Namun, ini hanya untuk menjalankan seluruh kelas pengujian - jika saya ingin menjalankan pengujian individu, saya harus membuat ulang konfigurasi proses untuk metode pengujian tersebut.

Juga, itu adalah IDE dan khusus kotak - jadi jika saya mengganti kotak (saya mengembangkan di beberapa mesin) atau salah satu rekan saya mencoba menjalankan tes, pengaturan itu tidak ditransfer. (Juga, IDE lain seperti Eclipse dan NetBeans digunakan oleh kolega saya.) FWIW, kami menggunakan lincah untuk kontrol kode sumber.

Untuk siklus pembuatan, kami menggunakan Maven, jadi saya tahu cara menentukan parameter JVM untuk itu.

Jadi: - Saya sedang mencari cara untuk menentukan parameter JVM yang akan diterapkan untuk seluruh kelas pengujian dan metode pengujian individu; dan - Saya ingin membagikan spesifikasi tersebut di seluruh IDE pada mesin apa pun (setelah mengambil kode dari repositori).

keheranan
sumber
Saya ragu itu mungkin. Di seluruh mesin, untuk IDE tertentu, seharusnya dapat dilakukan. Tapi di seluruh IDE saya tidak melihat caranya.
JB Nizet
@JBNizet - Saya akan dengan senang hati menggunakan mesin untuk IDE tertentu (asalkan itu Intellij IDEA).
keheranan

Jawaban:

48

Di IntelliJ Anda dapat menentukan pengaturan default untuk setiap konfigurasi proses. Dalam dialog konfigurasi Run / Debug (yang Anda gunakan untuk mengonfigurasi heap per pengujian) klik Default dan JUnit . Pengaturan ini akan secara otomatis diterapkan ke setiap konfigurasi pengujian JUnit baru. Saya kira pengaturan serupa ada untuk Eclipse.

Namun tidak ada pilihan sederhana untuk mentransfer pengaturan tersebut (setidaknya di IntelliJ) lintas lingkungan. Anda dapat memasukkan file proyek IntelliJ ke repositori Anda: ini mungkin berhasil, tetapi saya tidak merekomendasikannya.

Anda tahu cara menyetelnya maven-surefire-plugin. Baik. Ini adalah cara yang paling portabel (lihat jawaban Ptomli sebagai contoh).

Selebihnya - Anda harus ingat bahwa kasus uji JUnit hanyalah sekumpulan kelas Java, bukan program mandiri. Terserah runner (biarkan runner JUnit mandiri, IDE Anda, maven-surefire-pluginuntuk menyetel opsi tersebut. Dengan kata lain, tidak ada cara "portabel" untuk menyetelnya, sehingga setelan memori diterapkan apa pun ke runner.

Sebagai contoh: Anda tidak dapat menentukan Xmxparameter saat mengembangkan servlet - tergantung wadah untuk mendefinisikannya. Anda tidak bisa mengatakan: "servlet ini harus selalu dijalankan dengan Xmx=1G.

Tomasz Nurkiewicz
sumber
di mana konfigurasi Run / Debug berada? Saya tidak melihat ini di preferensi atau menu konteks ketika saya menjalankan tes?
Dean Hiller
2
Perhatikan bahwa ini TIDAK akan mengubah konfigurasi JUnit run yang ada, hanya konfigurasi yang dibuat setelah Anda mengubah defaultnya. Anda harus mengubah yang sudah ada secara manual.
MikeFHay
78

Di Maven Anda dapat mengkonfigurasi plugin yang pasti

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

Jika Anda menggunakan Maven untuk build, konfigurasi ini akan dijalankan di pohon sumber dan diterapkan saat pengujian dilakukan. Lihat dokumentasi Plugin Maven Surefire .

ptomli.dll
sumber
1
@ptomli - Saya selalu tidak mempercayai komentar yang dimulai dengan "Tentunya ...". Integrasi Intellij maven menggunakan konfigurasi plugin pom saat menjalankan tugas pada siklus build maven. Menjalankan pengujian unit di IDE adalah proses terpisah, dan secara default tidak memiliki pengetahuan tentang proses build. Sepengetahuan saya, tidak ada cara untuk menghubungkan ini - meskipun saya senang diberitahu sebaliknya. Apakah ini sesuatu yang Anda ketahui / telah lakukan - dalam hal ini, dapatkah Anda berbagi cara melakukannya?
keheranan
1
Saya tidak yakin itu mungkin di Intellij. TBH, meskipun demikian, saya tidak ingin menggunakan pendekatan itu, karena kemungkinan besar, jika saya menjalankan pengujian unit di IDE, saya ingin memanfaatkan debugger IDE, yang tidak dapat saya lakukan dengan menjalankan tes mvn.
keheranan
5
Sebenarnya, integrasi Maven IntelliJ memang menggunakan konfigurasi Maven Surefire saat menjalankan pengujian unit individu. Menggunakan konfigurasi Maven di atas akan menyebabkan -Xmx256Mditeruskan ke baris perintah Java saat menjalankan pengujian unit Anda langsung dari IntelliJ. Ini baru saja membuatku bingung :-(
Kkkev
1
FYI: Netbeans juga menggunakan Maven Suefire untuk menjalankan pengujiannya
Ferrybig
1
Integrasi Maven @Kkkev IntelliJ berbeda dari menjalankan pengujian individual di IntelliJ. Yang pertama menggunakan konfigurasi run Maven (dan karenanya membaca argumen), yang kedua menggunakan konfigurasi JUnit, TestNG ....
danresp
15

Menurut pertanyaan dukungan ini https://intellij-support.jetbrains.com/hc/en-us/community/posts/206165789-JUnit-default-heap-size-overridden-

argumen -Xmx untuk uji coba junit IntelliJ akan datang dari maven-surefire-plugin, jika disetel.

Potongan pom.xml ini

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

tampaknya meneruskan argumen -Xmx1024 ke uji coba junit, dengan IntelliJ 2016.2.4.

Mark K.
sumber
13

Saya setuju dengan orang lain yang mengatakan bahwa tidak ada cara sederhana untuk mendistribusikan pengaturan ini.

Untuk Eclipse: minta kolega Anda untuk menyetel berikut ini:

  • Preferensi Windows / Java / JRE Terpasang:
  • Pilih JRE / JDK yang tepat (atau lakukan untuk semuanya)
  • Edit
  • Argumen VM default: -Xmx1024m
  • Selesai ya.

Setelah itu semua tes akan berjalan -Xmx1024mtetapi sayangnya Anda telah mengaturnya di setiap instalasi Eclipse. Mungkin Anda bisa membuat paket Eclipse kustom yang berisi pengaturan ini dan memberikannya kepada Anda rekan kerja.

Proses kerja berikut juga dapat membantu: Jika IDE tidak dapat menjalankan tes, pengembang harus memeriksa apakah Maven dapat menjalankan tes ini atau tidak.

  • Jika Maven dapat menjalankannya , penyebab kegagalan biasanya adalah pengaturan IDE pengembang. Pengembang harus memeriksa pengaturan ini.
  • Jika Maven juga tidak dapat menjalankan pengujian, pengembang mengetahui bahwa penyebab kegagalan bukanlah IDE, jadi dia dapat menggunakan IDE untuk men-debug pengujian.
palacsint.dll
sumber
Mengatakan proyek harus dibangun dengan maven tidak terlalu membantu. (Kami hanya membangun dengan maven.) Namun, tersirat dalam saran Anda adalah bahwa kami hanya menjalankan pengujian sebagai bagian dari siklus build maven - kami sering menggunakan pengujian yang sama untuk men-debug di IDE. (Dengan keuntungan lebih lanjut bahwa setelah sesuatu di-debug, mudah untuk mempertahankan pengujian tersebut dalam siklus pembuatan.)
amaidment
ok - tapi sekarang Anda hanya mengulangi jawaban Tomasz, tetapi dengan spesifikasi Eclipse ...
amaidment
2

Anda dapat menggunakan systemPropertyVariables (java.protocol.handler.pkgs adalah nama argumen JVM Anda):

<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

sendon1982
sumber
1

Alternatif khusus gerhana yang terbatas pada parameter JVM java.library.path memungkinkan untuk menyetelnya untuk folder sumber tertentu, bukan untuk seluruh jdk seperti yang diusulkan dalam respons lain:

  1. pilih folder sumber tempat program untuk memulai berada (biasanya sumber / tes / java)
  2. ketik alt enter untuk membuka halaman Properti untuk folder itu
  3. pilih asli di panel kiri
  4. Edit jalur asli. Jalur bisa absolut atau relatif terhadap ruang kerja, yang kedua lebih tahan terhadap perubahan.

Bagi mereka yang tertarik dengan detail tentang mengapa maven argline tag harus diutamakan daripada systemProperties, lihat, misalnya:

Ambil file JNI asli di pengujian Maven (lwjgl)

paswar
sumber