Jalankan pengujian tunggal dari kelas JUnit menggunakan baris perintah

95

Saya mencoba menemukan pendekatan yang memungkinkan saya menjalankan tes tunggal dari kelas JUnit hanya menggunakan baris perintah dan java.

Saya dapat menjalankan seluruh rangkaian tes dari kelas menggunakan berikut ini:

java -cp .... org.junit.runner.JUnitCore org.package.classname

Yang benar-benar ingin saya lakukan adalah seperti ini:

java -cp .... org.junit.runner.JUnitCore org.package.classname.method

atau:

java -cp .... org.junit.runner.JUnitCore org.package.classname#method

Saya perhatikan bahwa mungkin ada cara untuk melakukan ini menggunakan anotasi JUnit, tetapi saya lebih suka untuk tidak mengubah sumber kelas pengujian saya dengan tangan (mencoba mengotomatiskan ini). Saya juga melihat bahwa Maven mungkin memiliki cara untuk melakukan ini, tetapi jika memungkinkan saya ingin menghindari bergantung pada Maven.

Jadi saya bertanya-tanya apakah ada cara untuk melakukan ini?


Poin utama yang saya cari:

  • Kemampuan untuk menjalankan satu pengujian dari kelas pengujian JUnit
  • Command Line (menggunakan JUnit)
  • Hindari memodifikasi sumber pengujian
  • Hindari menggunakan alat tambahan
Kevin Jalbert
sumber
4
Keren, penggemar jenis "Unix is ​​my IDE" lainnya. Saya suka menggunakan IDE untuk editor (terutama dengan plugin vim untuk NetBeans), tetapi saya setuju bahwa alat tajam kecil yang bertahan "selamanya", dan dapat dirakit dalam konfigurasi sewenang-wenang, seringkali lebih baik daripada terus-menerus mempelajari kembali fitur esoterik serangkaian merek dan versi IDE. Bagus untukmu!
Roboprog
2
Kamu bilang kamu ingin menghindari maven. Bagi siapa saja yang ingin melakukan ini menggunakan maven, lihat di sini, maven.apache.org/plugins/maven-surefire-plugin/examples/…
reevesy

Jawaban:

79

Anda dapat membuat runner JUnit barebone kustom dengan cukup mudah. Ini salah satu yang akan menjalankan metode pengujian tunggal dalam bentuk com.package.TestClass#methodName:

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

Anda bisa memintanya seperti ini:

> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

Setelah melihat sekilas di sumber JUnit, saya sampai pada kesimpulan yang sama seperti Anda bahwa JUnit tidak mendukung ini secara native. Ini tidak pernah menjadi masalah bagi saya karena semua IDE memiliki integrasi JUnit khusus yang memungkinkan Anda menjalankan metode pengujian di bawah kursor, di antara tindakan lainnya. Saya tidak pernah menjalankan tes JUnit dari baris perintah secara langsung; Saya selalu membiarkan IDE atau build tool (Ant, Maven) mengurusnya. Terutama karena titik masuk CLI default (JUnitCore) tidak menghasilkan keluaran apa pun selain kode keluar bukan nol pada kegagalan pengujian.

CATATAN: untuk JUnit versi> = 4.9 Anda memerlukan pustaka hamcrest di classpath

Mark Peters
sumber
2
Sebenarnya, saya sepertinya ingat mendapatkan pelacakan tumpukan penuh di log saat pernyataan dalam pengujian gagal, serta pesan (opsional, saat ditentukan) dari setiap pernyataan yang menjelaskan harapan yang belum direalisasi. Terima kasih untuk pekerjaannya.
Roboprog
48

Saya menggunakan Maven untuk membangun proyek saya, dan menggunakan plugin SureFire maven untuk menjalankan tes junit. Asalkan Anda memiliki pengaturan ini, maka Anda dapat melakukan:

mvn -Dtest=GreatTestClass#testMethod test

Dalam contoh ini, kami baru saja menjalankan metode pengujian bernama "testMethod" di dalam Kelas "GreatTestClass".

Untuk detail lebih lanjut, lihat http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html

Yiling Lu
sumber
-2

Kami menggunakan IntelliJ, dan menghabiskan cukup banyak waktu untuk mencoba mencari tahu juga.

Pada dasarnya, ini melibatkan 2 langkah:

Langkah 1: Kumpulkan Kelas Tes

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

Langkah 2: Jalankan Tes

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest

Benjamin Tan Wei Hao
sumber
6
Ini menjalankan setiap pengujian di kelas, bukan hanya satu pengujian.
Perampok