เรียกใช้วิธีการทดสอบเดียวด้วย maven


519

ฉันรู้ว่าคุณสามารถทำการทดสอบทั้งหมดในระดับหนึ่งโดยใช้:

mvn test -Dtest=classname

แต่ฉันต้องการเรียกใช้แต่ละวิธีและ -Dtest = classname.methodname ดูเหมือนจะไม่ทำงาน


3
ฉันสนใจที่จะรู้วิธีการทำสิ่งนี้เช่นกัน อย่างไรก็ตามถ้าฉันพบว่าตัวเองทำมันค่อนข้างบ่อยฉันคิดว่าการทดสอบนั้นอาจเป็นตัวเลือกที่แบ่งออกเป็นคลาสของตัวเองเพื่อให้คุณสามารถใช้mvn test -Dtest=classnameไวยากรณ์ได้
John Paulett

คุณต้องการที่จะรู้ว่าจะทำอย่างไรผ่านทางบรรทัดคำสั่งเท่านั้น หรือการใช้ IDE (eclipse) เหมาะกับคุณหรือไม่
Diego Dias

1
ฉันกำลังดูบรรทัดคำสั่ง ฉันคิดว่าปลั๊กอิน junit eclipse จะช่วยให้คุณทำสิ่งนี้ได้
BillMan

ฉันทำสิ่งนี้กับ Maven 1 เมื่อฉันจำได้มันเกี่ยวข้องกับการเปลี่ยนแปลง JUnit ซึ่งรับผิดชอบการตรวจสอบชั้นเรียน
kdgregory

คำตอบ:


698

ในการรันวิธีทดสอบเดียวใน Maven คุณต้องระบุคำสั่งดังนี้:

mvn test -Dtest=TestCircle#xyz test

TestCircleชื่อคลาสทดสอบอยู่ที่ไหนและxyzเป็นวิธีการทดสอบ

อักขระไวด์การ์ดยังใช้งานได้; ทั้งในชื่อเมธอดและชื่อคลาส

-pl <module-name>หากคุณกำลังทดสอบในโครงการหลายโมดูลระบุโมดูลที่การทดสอบด้วย

สำหรับการทดสอบการรวมใช้it.test=...ตัวเลือกแทนtest=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test

4
แก้ไขข้อผิดพลาด "ไม่มีการทดสอบถูกดำเนินการ" โดยปรับลดรุ่นเป็น surefire 2.9
qwerty

15
ฉันแก้ไข "ไม่มีการทดสอบดำเนินการ!" โดยอัปเกรดเป็น 2.14:
alfonx

54
-pl <module-name>หากคุณกำลังทดสอบในโครงการหลายโมดูลคุณยังต้องระบุโมดูลที่การทดสอบด้วย
Jon

22
ใช้-DfailIfNoTests=falseเพื่อข้ามโครงการโดยไม่ต้องทดสอบ No Tests Were Executedเกิดขึ้นเมื่อคุณพยายามเรียกใช้การทดสอบจากโครงการรูทและมีโมดูลที่ไม่มีการทดสอบเลย
เชอร์รี่

4
คำสั่งนี้ใช้งานได้ !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test โปรดทราบว่า "-DTest" เริ่มต้นด้วยกรณีบน 'T'
vikas

25

มีปัญหากับ Surefire 2.12 นี่คือสิ่งที่เกิดขึ้นกับฉันในการเปลี่ยน maven-surefire-plugin จาก 2.12 เป็น 2.11:

  1. mvn test -Dtest=DesignRulesTest

    ผลลัพธ์:
    [ข้อผิดพลาด] ล้มเหลวในการดำเนินการเป้าหมาย org.apache.maven.plugins: maven-surefire-plugin: 2.12 : การทดสอบ (ทดสอบเริ่มต้น) ในโครงการ pmd: ไม่มีการทดสอบใด ๆ !

  2. mvn test -Dtest=DesignRulesTest

    ผลลัพธ์: [INFO] --- maven-surefire-plugin: 2.11 : ทดสอบ (ค่าเริ่มต้น - ทดสอบ) @ pmd --- ... กำลังเรียกใช้ net.sourceforge.pmd.lang.java.rule.design.DesignRules การทดสอบการทดสอบ: 5 , ความล้มเหลว: 0, ข้อผิดพลาด: 0, ข้ามไป: 4, เวลาที่ผ่านไป: 4.009 วินาที


5
ทำงานได้อีกครั้งใน 2.12.1 หรือใหม่กว่า
yurez

แก้ไข "ไม่ทำการทดสอบ!" โดยอัปเกรดเป็น 2.14
alfonx

หากคุณใช้@Category(IntegrationTest.class)ให้ใช้-Dit.test=ClassNameมิฉะนั้นคุณจะได้No tests were executed!ใช้งานปลั๊กอินรุ่นล่าสุด
uvsmtid

16

สิ่งที่ฉันทำกับ TestNG ของฉัน (ขออภัย JUnit ไม่สนับสนุนสิ่งนี้) กรณีทดสอบคือฉันสามารถกำหนดกลุ่มให้กับการทดสอบที่ฉันต้องการเรียกใช้

@Test(groups="broken")

จากนั้นเรียกใช้ 'mvn -Dgroups = broken'


1
นี่เป็นคำตอบที่ดี ในกรณีของฉันการทดสอบพยายามเรียกใช้ แต่ส่วนประกอบ Seam บางตัวไม่ได้ตั้งค่าอย่างถูกต้องดังนั้นดูเหมือนว่านี่เป็นการข้ามส่วนของรหัสการตั้งค่าบางส่วนเช่นกัน
Chris Williams

1
แก้ไข. คุณต้องใส่กลุ่ม = แตกใน @BeforeMethod ของคุณหรือทำ @BeforeMethod (alwaysRun = true)
tunaranch

โปรดแจ้งให้เราทราบว่ากลุ่มคืออะไรที่นี่เนื่องจากฉันได้รับปัญหาการรวบรวม
Paramesh Korrakuti

14

การรันชุดเมธอดในคลาสการทดสอบเดี่ยวด้วยเวอร์ชัน 2.7.3 คุณสามารถรันการทดสอบ n เท่านั้นในคลาสการทดสอบเดียว

หมายเหตุ: รองรับ Junit 4.x และ TestNG

คุณต้องใช้ไวยากรณ์ต่อไปนี้

mvn -Dtest=TestCircle#mytest test

คุณสามารถใช้รูปแบบได้เช่นกัน

mvn -Dtest=TestCircle#test* test

ในขณะที่ surefire 2.12.1 คุณสามารถเลือกได้หลายวิธี (JUnit4X เท่านั้นในเวลานี้ยินดีต้อนรับการแก้ไข)

mvn -Dtest=TestCircle#testOne+testTwo test

ตรวจสอบลิงค์นี้เกี่ยวกับการทดสอบเดียว


2
ในกรณีของฉันฉันต้องพูดสองครั้ง TestClass # ชื่อทดสอบเช่น mvn -Dtest = "TestCircle # myTest" การทดสอบ
Pratik Khadloya

@PratikKhadloya ความคิดใด ๆ ที่มันทำงานอย่างไรสำหรับการทดสอบที่ขึ้นต่อกัน บอกว่าฉันมี test1 (), test2 (), test3 () วิธีการใน TestClass และ test2 ขึ้นอยู่กับ test1 ฉันจะรันแค่ test2 () ได้อย่างไร?
Ziska

3
ฉันคิดว่าถ้าคุณมีการพึ่งพาระหว่างการทดสอบของคุณคุณกำลังทำอะไรผิด การทดสอบแต่ละครั้งควรเป็นอิสระจากการทดสอบอื่น ๆ คุณต้องลบการเชื่อมต่อระหว่างพวกเขา
Pratik Khadloya

11

คุณสามารถเรียกใช้คลาสการทดสอบและวิธีการเฉพาะโดยใช้ไวยากรณ์ต่อไปนี้:

  1. แพ็คเกจเต็มรูปแบบ: การทดสอบ mvn -Dtest = "com.oracle.tests." "

  2. วิธีการทั้งหมดในชั้นเรียน: ทดสอบ mvn -Dtest = CLASS_NAME1

  3. วิธีการเดียวจากชั้นเดียว: การทดสอบ mvn -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. หลายวิธีจากหลายคลาส: ทดสอบ mvn -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2


10

คำสั่งนี้ใช้งานได้ !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testโปรดทราบว่า "-DTest" เริ่มต้นด้วยกรณีบน 'T'


4
ไม่ได้ทำงานร่วมกับกระสุนแห้ง 2.18.x; มันรันการทดสอบทั้งหมด
Janaka Bandara

4

ทดสอบพารามิเตอร์กล่าวโดย tobrien ช่วยให้คุณระบุวิธีการใช้#ก่อนชื่อวิธี สิ่งนี้ควรใช้กับ JUnit และ TestNG ฉันไม่เคยลองเลยอ่านบนหน้าSurefire Plugin :

ระบุพารามิเตอร์นี้เพื่อรันการทดสอบแยกตามชื่อไฟล์การแทนที่พารามิเตอร์ include / แยก แต่ละรูปแบบที่คุณระบุที่นี่จะถูกใช้เพื่อสร้างรูปแบบการรวมที่จัดรูปแบบเช่น ** / $ {test} .java ดังนั้นคุณสามารถพิมพ์ "-Dtest = MyTest" เพื่อรันการทดสอบเดียวที่เรียกว่า "foo / MyTest.java" พารามิเตอร์นี้แทนที่พารามิเตอร์ include / แยกและพารามิเตอร์ TestNG suiteXmlFiles ตั้งแต่ 2.7.3 คุณสามารถดำเนินการตามจำนวนที่ จำกัด ในการทดสอบโดยเพิ่ม #myMethod หรือ # my * ethod พิมพ์ Si "-Dtest = MyTest # myMethod" สำหรับ junit 4.x และ testNg


3

เวอร์ชั่นใหม่ของ JUnit มีหมวดหมู่ Runner: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

แต่การปล่อยโพรซีเดอร์ของ JUnit ไม่ได้เป็น maven ดังนั้นผู้ใช้ maven ต้องวางมันลงในที่เก็บด้วยตนเอง


1
ดี แต่ฉันไม่เห็นว่าสิ่งนี้ตอบคำถามได้อย่างไร
Pascal Thivent

2
Subj ได้รับการสนับสนุนจากรุ่น 2.7.3 ของ maven-surefire-plugin: maven.apache.org/plugins/maven-surefire-plugin/examples/ …
Andriy Plokhotnyuk

3

ในฐานะที่เป็นปลั๊กอิน surefire รุ่น 2.22.1 (อาจจะก่อนหน้านี้) คุณสามารถเรียกใช้การทดสอบเดียวโดยใช้คุณสมบัติ testnames เมื่อใช้ testng.xml

รับ testng.xml ต่อไปนี้

<?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> 

ด้วย 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>

จากบรรทัดคำสั่ง

mvn clean test -DselectedTests=run-B-test

อ่านเพิ่มเติม - Maven surefire plugin ใช้ testng


-5

คุณสามารถเรียกใช้คลาสการทดสอบเดียว แต่ไม่สามารถใช้วิธีการเดียวภายในคลาสการทดสอบ คุณใช้ชื่อแบบง่ายของคลาสไม่ใช่ชื่อแบบเต็มของคลาส ดังนั้นหากคุณมีการทดสอบใน "org.sonatype.test.MyTest" และนั่นเป็นการทดสอบเดียวที่คุณต้องการเรียกใช้บรรทัดคำสั่งของคุณจะมีลักษณะดังนี้:

mvn test -Dtest=MyTest

ฉันทดสอบวิธีการแก้ปัญหาที่อธิบายไว้ในความคิดเห็นก่อนหน้าในโครงการโมดูลเดียวดังนั้นสิ่งที่ความคิดเห็นนี้พูดไม่เป็นความจริง
tonio

5
มันอาจเป็นจริงในปี 2009 เมื่อคำตอบเดิม
ทนทาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.