Cara menjalankan JUnit test case dari baris perintah

333

Saya ingin menjalankan kotak uji JUnit dari baris perintah. Bagaimana saya bisa melakukan ini?

KK.
sumber
pertanyaan serupa android junit: stackoverflow.com/q/11144466/611007
n611x007
Android docs: menjalankan tes pada perangkat atau emulator (dari baris perintah). ( via andreea.sandu)
n611x007
Jawaban untuk JUnit 5 di stackoverflow.com/a/52373592/1431016
Sormuras
javac -cp "junit-4.12.jar; hamcrest-core-1.3.jar;." Tests.javabekerja untukku. Perhatikan titik akhir - penting!
parsecer

Jawaban:

274

Untuk JUnit 5.x itu:

java -jar junit-platform-console-standalone-<version>.jar <Options>

Temukan ringkasan singkat di https://stackoverflow.com/a/52373592/1431016 dan detail lengkapnya di https://junit.org/junit5/docs/current/user-guide/#running-tests-console-launcher

Untuk JUnit 4.X itu benar-benar:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

Tetapi jika Anda menggunakan JUnit 3.X perhatikan nama kelasnya berbeda:

java -cp .:/usr/share/java/junit.jar junit.textui.TestRunner [test class name]

Anda mungkin perlu menambahkan lebih banyak JAR atau direktori dengan file kelas Anda ke classpath dan pisahkan dengan titik koma (Windows) atau titik dua (UNIX / Linux). Itu tergantung pada lingkungan Anda.

Sunting: Saya telah menambahkan direktori saat ini sebagai contoh. Bergantung pada lingkungan Anda dan bagaimana Anda membangun aplikasi Anda (bisa berupa bin / atau build / atau bahkan my_application.jar dll). Catatan Java 6+ mendukung glob di classpath, Anda dapat melakukannya:

java -cp lib/*.jar:/usr/share/java/junit.jar ...

Semoga ini bisa membantu. Tulis tes! :-)

lzap
sumber
@Izap Ada ide untuk menentukan apakah suatu tes menggunakan JUnit4 atau JUnit3 secara terprogram?
Goaler444
2
Class.forName kurasa. Sudah bertahun-tahun saya pemrograman di Jawa untuk terakhir kalinya ...
lzap
dan bagaimana jika Anda menggunakan android?
n611x007
1
Dokumentasi untuk argumen "-cp" (yaitu CLASSPATH) ada di sini (Java 7, Unix) dan di sini (Tutorial) dan di sini (Java 8, Unix) dan di sini (Java 8, Windows) . Rupanya wildcard di classpath sekarang didukung.
David Tonhofer
1
Downvote. Untuk JUnit 4.x itu tidak benar. Instruksi Anda memberikan "Tidak dapat menemukan kelas: [nama kelas uji]" Bahkan ketika [nama kelas uji] ada di classpath.
Philip Rego
117

Cara Maven

Jika Anda menggunakan Maven, Anda dapat menjalankan perintah berikut untuk menjalankan semua kasus pengujian Anda:

mvn clean test

Atau Anda dapat menjalankan tes tertentu seperti di bawah ini

mvn clean test -Dtest=your.package.TestClassName
mvn clean test -Dtest=your.package.TestClassName#particularMethod

Jika Anda ingin melihat jejak tumpukan (jika ada) di konsol alih-alih file laporan di folder target \ surefire-laporan, setel properti pengguna surefire.useFile ke false. Sebagai contoh:

mvn clean test -Dtest=your.package.TestClassName -Dsurefire.useFile=false

Cara gradle

Jika Anda menggunakan Gradle, Anda dapat menjalankan perintah berikut untuk menjalankan semua kasus pengujian Anda:

gradle test

Atau Anda dapat menjalankan tes tertentu seperti di bawah ini

gradle test --tests your.package.TestClassName
gradle test --tests your.package.TestClassName.particularMethod

Jika Anda ingin informasi lebih lanjut, Anda dapat mempertimbangkan opsi seperti --stacktrace, atau --info, atau --debug.

Misalnya, ketika Anda menjalankan Gradle dengan info logging level --info, itu akan menunjukkan kepada Anda hasil dari setiap tes saat mereka berjalan. Jika ada pengecualian, itu akan menunjukkan jejak tumpukan, menunjukkan apa masalahnya.

gradle test --info

Jika Anda ingin melihat hasil pengujian keseluruhan, Anda dapat membuka laporan di browser, misalnya (Buka menggunakan Google Chrome di Ubuntu):

google-chrome build/reports/tests/index.html

Cara semut

Setelah Anda mengatur file build build Ant.xml Anda, Anda dapat menjalankan test case JUnit Anda dari baris perintah seperti di bawah ini:

ant -f build.xml <Your JUnit test target name>

Anda dapat mengikuti tautan di bawah ini untuk membaca lebih lanjut tentang cara mengkonfigurasi tes JUnit dalam file Ant build: https://ant.apache.org/manual/Tasks/junit.html

Cara normal

Jika Anda tidak menggunakan Maven, atau Gradle atau Ant, Anda dapat mengikuti cara berikut:

Pertama-tama, Anda perlu mengkompilasi kasus pengujian Anda. Misalnya (di Linux):

javac -d /absolute/path/for/compiled/classes -cp /absolute/path/to/junit-4.12.jar /absolute/path/to/TestClassName.java

Kemudian jalankan test case Anda. Sebagai contoh:

java -cp /absolute/path/for/compiled/classes:/absolute/path/to/junit-4.12.jar:/absolute/path/to/hamcrest-core-1.3.jar org.junit.runner.JUnitCore your.package.TestClassName
Yuci
sumber
1
Saya suka bahwa jawaban ini memiliki contoh untuk banyak teknologi, pujian!
Josie Thompson
bagaimana dengan tes asyik menggunakan pendekatan terakhir?
midori
1
Lambang emas yang memang layak;)
Eric Duminil
Terima kasih untuk versi gradle! Pujian!
ady
52

Jawaban yang diberikan @ lzap adalah solusi yang bagus. Namun, saya ingin menambahkan bahwa Anda harus menambahkan. ke jalur kelas, sehingga direktori Anda saat ini tidak ditinggalkan, sehingga kelas Anda sendiri akan ditinggalkan. Ini terjadi pada saya di beberapa platform. Jadi versi terbaru untuk JUnit 4.x adalah:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]
rand_acs
sumber
1
apakah itu seharusnya merupakan titik koma?
Panny
14
@panny itu adalah titik koma di Windows. Pada lingkungan n * nix (setidaknya OSX dan semua distro Linux yang saya gunakan) Anda menggunakan titik dua.
rand_acs
1
@rand_acs apakah nama kelas uji harus nama kelas yang sepenuhnya terklasifikasi?
Goaler444
1
@ Goaler444 Ya, saya selalu menggunakan nama lengkap, dengan semua ruang nama yang ditentukan.
rand_acs
22

Pastikan JUnit.jar ada di classpath Anda, lalu panggil runner baris perintah dari konsol

java org.junit.runner.JUnitCore [nama kelas tes]

Referensi: FAQ junit

Gishu
sumber
4
Anda juga perlu mengatur sisa classpath proyek Anda.
Thilo
Ini hanya memberikan "Tidak dapat menemukan kelas: [nama kelas uji]" bahkan ketika [nama kelas uji] di classpath.
Philip Rego
19

Dengan JUnit 4.12 berikut ini tidak berfungsi untuk saya:

java -cp .:/usr/share/java/junit.jar org.junit.runner.JUnitCore [test class name]

Rupanya , mulai JUnit 4.11 dan selanjutnya Anda juga harus memasukkan hamcrest-core.jardalam classpath Anda:

java -cp .:/usr/share/java/junit.jar:/usr/share/java/hamcrest-core.jar org.junit.runner.JUnitCore [test class name]
Stefan van den Akker
sumber
Punya masalah yang sama dengan JUnit 4.12. Datang dengan solusi yang serupa, tetapi tidak berhasil untuk saya, gagal memuat JUnitCore. Saya pada dasarnya beralih ke JUnit 4.8.2 karena tidak perlu menyertakan hamcrest-core.jar di classpath.
Vladimir Nazarenko
Mengonfirmasi bahwa ini harus dilakukan dengan JUnit 4.12. +1.
rayryeng
Ini bekerja untuk saya:java -cp .:/usr/share/java/junit4.jar org.junit.runner.JUnitCore [test class name]
Raffi Khatchadourian
11

Di windows itu

java -cp .;/path/junit.jar org.junit.runner.JUnitCore TestClass [nama kelas uji tanpa ekstensi .class]

misalnya: c:\>java -cp .;f:/libraries/junit-4.8.2 org.junit.runner.JUnitCore TestSample1 TestSample2 ...dan seterusnya, jika seseorang memiliki lebih dari satu kelas tes.

-cp adalah singkatan dari class path dan dot (.) mewakili classpath yang ada sementara semi colon (;) menambahkan jar yang diberikan tambahan ke classpath, seperti pada contoh di atas junit-4.8.2 sekarang tersedia di classpath untuk mengeksekusi kelas JUnitCore yang di sini kita telah terbiasa mengeksekusi kelas tes kami.

Pernyataan baris perintah di atas membantu Anda untuk menjalankan tes junit (versi 4+) dari command prompt (yaitu MSDos).

Catatan: JUnitCore adalah fasad untuk menjalankan tes junit, fasad ini termasuk dalam 4+ versi junit.

anak nakal
sumber
Tolong jelaskan jawaban Anda dengan sangat singkat.
Mohit Jain
Saya tidak meminta Anda untuk membuat jawaban Anda singkat. Saya meminta untuk menambahkan beberapa penjelasan (setidaknya penjelasan singkat). Merupakan praktik yang baik untuk menjelaskan bagaimana jawaban Anda bekerja. Pembaca dapat memahaminya, menyukainya, memperbaiki itu.
Mohit Jain
jadi jika saya punya toples pengujian tambahan DAN toples vanilla junit, saya harus memiliki keduanya di perintah java -cp agar semuanya benar-benar berfungsi? Apakah ada cara untuk meletakkan semua ini ke dalam baris perintah sehingga saya tidak perlu mengetik banyak hal?
Ungeheuer
5

Sebenarnya Anda juga bisa membuat tes Junit Jar yang bisa dijalankan dan memanggil jar yang bisa dijalankan sebagai java -jar

Indraneel
sumber
2
Di Eclipse, klik kanan proyek JUnit Anda -> Klik Ekspor -> Pilih Java-> Runnable Jar File
Indraneel
4

Jika proyek Anda berbasis Maven, Anda dapat menjalankan semua metode uji dari kelas uji CustomTest yang termasuk dalam modul 'modul-saya' menggunakan perintah berikut:

mvn clean test -pl :my-module -Dtest=CustomTest

Atau jalankan hanya 1 metode uji myMethod dari kelas uji CustomTest menggunakan perintah berikut:

mvn clean test -pl :my-module -Dtest=CustomTest#myMethod

Untuk kemampuan ini Anda memerlukan Maven Surefire Plugin v.2.7.3 + dan Junit 4. Lebih detail ada di sini: http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html


sumber
4

Secara pribadi saya akan menggunakan pelari JUnit pasti Maven untuk melakukan itu.

Djangofan
sumber
-1

Jika Anda memproyeksikan berdasarkan semut maka Anda harus dapat melakukan sesuatu seperti ini dari konsol:

ant test

Jika ini tidak berhasil, tetapi tetap saja proyek Anda berbasis semut, Anda dapat menjalankan ant -pdaftar target utama proyek.

cherouvim
sumber
2
Q tidak ada hubungannya dengan semut
accuya
3
Itu sebabnya saya berkata "jika proyek Anda berbasis semut". Perhatikan juga bahwa OP mungkin tidak tahu tentang semut.
cherouvim
Saya mengalami dillema ini, file tes unit tidak ada dalam folder yang ditandai sebagai sumber oleh gerhana. Proyek itu menggunakan semut untuk membangun, ini adalah cara yang tepat untuk menjalankan tes JUnit itu.
Andrzej Rehmann