Jalankan metode uji tunggal dengan pakar

519

Saya tahu Anda dapat menjalankan semua tes di kelas tertentu menggunakan:

mvn test -Dtest=classname

Tapi saya ingin menjalankan metode individual dan -Dtest = classname.methodname tampaknya tidak berfungsi.

BillMan
sumber
3
Saya akan tertarik mengetahui bagaimana melakukan ini juga. Namun, jika saya mendapati diri saya cukup sering melakukannya, saya pikir tes itu mungkin merupakan kandidat untuk dibagi ke dalam kelasnya sendiri, sehingga Anda dapat menggunakan mvn test -Dtest=classnamesintaksisnya.
John Paulett
Apakah Anda ingin tahu cara melakukannya hanya melalui command line ?? Atau menggunakan IDE (gerhana) akan bekerja untuk Anda?
Diego Dias
1
Saya sedang melihat baris perintah. Saya pikir plugin gerhana junit akan memungkinkan Anda untuk melakukan ini.
BillMan
Saya melakukan ini untuk Maven 1. Seperti yang saya ingat, itu melibatkan membuat perubahan pada JUnit, yang bertanggung jawab untuk mengintrospeksi kelas tes.
kdgregory

Jawaban:

698

Untuk menjalankan metode uji tunggal di Maven, Anda perlu memberikan perintah sebagai:

mvn test -Dtest=TestCircle#xyz test

dimana TestCirclenama kelas tes danxyz metode tes.

Karakter wild card juga berfungsi; baik dalam nama metode dan nama kelas.

Jika Anda menguji dalam proyek multi-modul, tentukan modul yang digunakan untuk menguji -pl <module-name>.

Untuk tes integrasi gunakan it.test=...opsi alih-alih test=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test
Mudit Srivastava
sumber
4
Memperbaiki kesalahan "Tidak Ada Tes yang Dieksekusi" dengan merendahkan ke versi pasti 2.9
qwerty
15
Saya memperbaiki, "Tidak Ada Tes yang Dilakukan!" dengan memutakhirkan ke 2.14:
alfonx
54
Jika Anda menguji dalam proyek multi-modul, Anda juga perlu menentukan modul yang digunakan dalam pengujian -pl <module-name>.
Jon
22
Gunakan -DfailIfNoTests=falseuntuk melewati proyek tanpa tes. No Tests Were Executedterjadi ketika Anda mencoba menjalankan tes dari proyek root dan ada modul tanpa tes sama sekali.
Cherry
4
Perintah ini berhasil !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Perhatikan bahwa "-DTest" dimulai dengan KASUS UPPER 'T'.
vikas
25

Ada masalah dengan pasti 2.12. Inilah yang terjadi pada saya mengubah maven-surefire-plugin dari 2.12 menjadi 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Hasil:
    [KESALAHAN] Gagal menjalankan tujuan org.apache.maven.plugins: maven-surefire-plugin: 2.12 : tes (uji default) pada proyek pmd: Tidak ada tes yang dijalankan!

  2. mvn test -Dtest=DesignRulesTest

    Hasil: [INFO] --- maven-surefire-plugin: 2.11 : test (default-test) @ pmd --- ... Menjalankan net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Tes dijalankan: 5 , Kegagalan: 0, Kesalahan: 0, Dilewati: 4, Waktu berlalu: 4,009 dtk

Duccio Fabbri
sumber
5
Bekerja lagi di 2.12.1 atau lebih baru.
yurez
Memperbaiki "Tidak Ada Tes yang Dilakukan!" dengan memutakhirkan ke 2.14
alfonx
Jika Anda menggunakan @Category(IntegrationTest.class), gunakan -Dit.test=ClassName, jika tidak, Anda akan mendapatkan No tests were executed!versi plugin terbaru.
uvsmtid
16

Apa yang saya lakukan dengan TestNG saya, (maaf, JUnit tidak mendukung ini) kasus uji adalah saya dapat menetapkan grup untuk tes yang ingin saya jalankan

@Test(groups="broken")

Dan kemudian jalankan 'mvn -Dgroups = broken'.

tunaranch
sumber
1
Ini jawaban yang bagus. Dalam kasus saya, tes mencoba untuk menjalankan tetapi beberapa komponen Seam tidak diatur dengan benar sehingga sepertinya ini melewatkan beberapa bagian dari kode pengaturan juga.
Chris Williams
1
Benar. Anda perlu memasukkan kelompok = rusak di @BeforeMethod Anda, atau lakukan @BeforeMethod (alwaysRun = true)
tunaranch
Tolong beri tahu saya apa itu grup di sini, karena saya mendapatkan masalah kompilasi.
Paramesh Korrakuti
14

Menjalankan serangkaian metode dalam Kelas Tes Tunggal Dengan versi 2.7.3, Anda hanya dapat menjalankan n tes dalam Kelas Tes tunggal.

CATATAN: ini didukung untuk junit 4.x dan TestNG.

Anda harus menggunakan sintaks berikut

mvn -Dtest=TestCircle#mytest test

Anda juga bisa menggunakan pola

mvn -Dtest=TestCircle#test* test

Pada ayal 2.12.1, Anda dapat memilih beberapa metode (hanya JUnit4X saat ini, patch diterima)

mvn -Dtest=TestCircle#testOne+testTwo test

Periksa tautan ini tentang tes tunggal

Prasanth Kumar Diddi
sumber
2
Dalam kasus saya, saya harus menggandakan penawaran testClass # test name seperti mvn -Dtest = "TestCircle # myTest" test
Pratik Khadloya
@PratikKhadloya Ada yang tahu cara kerjanya untuk tes dependen? Katakanlah, saya memiliki metode test1 (), test2 (), test3 () di TestClass dan test2 tergantung pada test1. Bagaimana saya bisa menjalankan hanya test2 ()?
Ziska
3
Saya pikir jika Anda memiliki ketergantungan di antara tes Anda, Anda melakukan sesuatu yang salah. Setiap tes harus independen dari tes lain. Anda harus menghapus sambungan di antara mereka.
Pratik Khadloya
11

Anda dapat menjalankan kelas dan metode pengujian khusus menggunakan sintaks berikut:

  1. paket lengkap: mvn test -Dtest = "com.oracle.tests. **"

  2. semua metode di kelas: mvn test -Dtest = CLASS_NAME1

  3. metode tunggal dari kelas tunggal: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. beberapa metode dari beberapa kelas: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2

Nazmul Hoque Shafin
sumber
9

Perintah ini berhasil !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testPerhatikan bahwa "-DTest" dimulai dengan KASUS UPPER 'T'.

vikas
sumber
4
Apakah tidak bekerja dengan ayal 2.18.x; itu hanya menjalankan semua tes.
Janaka Bandara
4

The uji parameter yang disebutkan oleh tobrien memungkinkan Anda untuk menentukan metode menggunakan # sebelum nama metode. Ini harus bekerja untuk JUnit dan TestNG. Saya belum pernah mencobanya, cukup baca di halaman Plugin Surefire :

Tentukan parameter ini untuk menjalankan tes individual dengan nama file, menimpa parameter include / exclude. Setiap pola yang Anda tentukan di sini akan digunakan untuk membuat pola menyertakan diformat seperti ** / $ {test} .java, jadi Anda cukup mengetik "-Dtest = MyTest" untuk menjalankan tes tunggal yang disebut "foo / MyTest.java". Parameter ini mengabaikan parameter include / exclude, dan parameter TestNG suiteXmlFiles. sejak 2.7.3 Anda dapat menjalankan sejumlah metode dalam pengujian dengan menambahkan #myMethod atau # my * ethod. Si tipe "-Dtest = MyTest # myMethod" didukung untuk junit 4.x dan testNg

Wesley Hartford
sumber
3

Versi baru JUnit berisi pelari Kategori: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Tetapi prosedur melepaskan JUnit tidak berbasis maven, jadi pengguna maven harus memasukkannya secara manual ke repositori mereka.

Andriy Plokhotnyuk
sumber
1
Bagus. Tetapi saya tidak melihat bagaimana ini menjawab pertanyaan.
Pascal Thivent
2
Subj didukung dari versi 2.7.3 dari maven- surefire
Andriy Plokhotnyuk
3

Pada plugin plugin surefire versi 2.22.1 (mungkin lebih awal) Anda dapat menjalankan tes tunggal menggunakan properti testnames saat menggunakan testng.xml

Diberikan testng.xml berikut

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="all-tests">
        <classes>
            <class name="server.Atest"/>
            <class name="server.Btest"/>
            <class name="server.Ctest"/>
        </classes>
    </test>
    <test name="run-A-test">
        <classes>
            <class name="server.Atest"/>
        </classes>
    </test>
    <test name="run-B-test">
        <classes>
            <class name="server.Btest"/>
        </classes>
    </test>
    <test name="run-C-test">
        <classes>
            <class name="server.Ctest"/>
        </classes>
    </test>
</suite> 

dengan pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    [...]
    <properties>
        <selectedTests>all-tests</selectedTests>
    </properties>
    [...]
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
            <configuration>
                <suiteXmlFiles>
                    <file>src/test/resources/testng.xml</file>
                </suiteXmlFiles>
                <properties>
                    <property>
                        <name>testnames</name>
                        <value>${selectedTests}</value>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
    [...]
</project>

Dari baris perintah

mvn clean test -DselectedTests=run-B-test

Bacaan lebih lanjut - Maven plugin pasti menggunakan testng

bsk
sumber
-5

Anda dapat menjalankan kelas uji tunggal, tetapi bukan metode tunggal dalam kelas uji. Anda menggunakan nama kelas yang sederhana bukan nama kelas yang sepenuhnya memenuhi syarat. Jadi, jika Anda memiliki tes di "org.sonatype.test.MyTest" dan itu adalah satu-satunya tes yang ingin Anda jalankan, baris perintah Anda akan terlihat seperti ini:

mvn test -Dtest=MyTest
Tim O'Brien
sumber
Saya menguji solusi yang dijelaskan pada komentar sebelumnya dalam proyek modul tunggal, jadi apa yang dikatakan komentar ini tidak benar.
tonio
5
Mungkin benar pada tahun 2009 ketika awalnya dijawab.
flurdy
-9

Sepengetahuan saya, plugin jitu tidak memberikan cara untuk melakukan ini. Tapi jangan ragu untuk membuka masalah :)

Thivent Pascal
sumber