ป้องกันการทดสอบหน่วย แต่อนุญาตให้รวมการทดสอบใน Maven


157

ฉันเป็นรุ่น Maven ที่ฉันใช้ปลั๊กอิน SureFire เพื่อเรียกใช้การทดสอบหน่วยและปลั๊กอิน FailSafe เพื่อเรียกใช้การทดสอบการรวมบางอย่าง ฉันต้องการวิธีการใช้งานการทดสอบปลั๊กอินของ FailSafe

มันไม่ใช่ทางออกที่ดีสำหรับฉันที่จะเพิ่มโปรไฟล์หรืออะไรก็ตามใน pom เพราะมันเป็นโครงสร้างแบบมัลติโมดัลและฉันไม่ต้องการแก้ไข pom ของโมดูลทุกตัว

มีskip.testsและmaven.test.skipและskipTestsที่หยุดทุกการทดสอบและการskipITsที่จะหยุดเพียง failsafe ปลั๊กอิน

ดังนั้นจะมีการตั้งค่าสถานะบรรทัดคำสั่งสำหรับ Maven เหมือนskipITsแต่แทนที่จะใช้ฟังก์ชันของ "onlyITs" หรือไม่


คุณลองmaven.test.skipหรือskipTests?
โทมัส

1
@ Khmarbaise ในทางทฤษฎีใช่ แต่ในโครงการส่วนใหญ่ที่ฉันได้ทำงานใน "การทดสอบหน่วย" ที่จริงการทดสอบการรวมกับฐานข้อมูลในหน่วยความจำ (ถ้าคุณโชคดี)
Sean Patrick Floyd

9
@khmarbaise การทดสอบหน่วยจำนวนมาก พวกเขาใช้เวลาสองสามนาทีในการวิ่งและเราไม่ต้องการให้พวกเขาวิ่งในสถานการณ์เช่นนี้ โดยเฉพาะเราทำการทดสอบหน่วยก่อนที่จะสร้างสิ่งประดิษฐ์ (แน่นอน) แต่เราต้องการเรียกใช้ไอทีในสภาพแวดล้อมที่หลากหลาย ไม่มีจุดที่ทำการทดสอบหน่วยในจุดนี้อีกครั้ง
Matthew Gilliard

2
สวัสดี @khmarbaise ในการตั้งค่าของฉันskipTestsจะข้ามเฉพาะการทดสอบ surefire ไม่ใช่การทดสอบที่ไม่ปลอดภัย! อาจเป็นคุณสมบัติใหม่หรือไม่
danidemi

2
FYI: ไม่สนับสนุน skipTests ใน Failsafe Plugin 3.0.0-M3 ( SUREFIRE-1611 )
Guillaume

คำตอบ:


170

ฉันพบวิธีที่ง่ายที่สุดในการข้ามการทดสอบ Surefire เท่านั้นคือการกำหนดค่า Surefire ( แต่ไม่ล้มเหลว ) ดังนี้:

<plugin>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.14</version>
    <configuration>
        <!-- skips surefire tests without skipping failsafe tests.
                 Property value seems to magically default to false -->
        <skipTests>${skip.surefire.tests}</skipTests>
    </configuration>
</plugin>

สิ่งนี้ช่วยให้คุณสามารถเรียกใช้mvn verify -Dskip.surefire.testsและไม่รับประกันว่าปลอดภัยไม่สามารถทำการทดสอบได้ นอกจากนี้ยังจะดำเนินการตามขั้นตอนที่จำเป็นอื่น ๆ ทั้งหมดรวมถึงการรวมระบบล่วงหน้าและหลังการรวมระบบและจะทำงานตามverifyเป้าหมายที่จำเป็นในการสร้าง maven ที่ล้มเหลวหากการทดสอบการรวมระบบของคุณล้มเหลว

โปรดทราบว่านี่จะนิยามคุณสมบัติที่ใช้ในการระบุว่าการทดสอบควรถูกข้ามดังนั้นหากคุณกำหนดค่าตามมาตรฐาน-DskipTests=truecanon, surefire จะไม่สนใจ แต่จะไม่ปลอดภัยตามที่คาดไว้โดยเฉพาะอย่างยิ่งถ้าคุณมีบิลด์ / ผู้ใช้ที่มีอยู่แล้ว วิธีแก้ปัญหาง่าย ๆ น่าจะเป็นค่าเริ่มต้นskip.surefire.testsของค่าskipTestsใน<properties>ส่วนของ pom ของคุณ:

<properties>
    <skip.surefire.tests>${skipTests}</skip.surefire.tests>
</properties>

หากคุณต้องการคุณสามารถระบุพารามิเตอร์แบบอะนาล็อกที่เรียกว่าskip.failsafe.testsfailafe ได้ แต่ฉันไม่พบว่าจำเป็น - เพราะการทดสอบหน่วยมักจะทำงานในระยะก่อนหน้านี้และถ้าฉันต้องการเรียกใช้การทดสอบแบบหน่วย แต่ไม่รวมการทดสอบฉันจะเรียกใช้testเฟสแทนของverifyเฟส ประสบการณ์ของคุณอาจแตกต่างกันไป!

skip.(surefire|failsafe).testsคุณสมบัติเหล่านี้น่าจะรวมอยู่ในโค้ด surefire / failafe เอง แต่ฉันไม่แน่ใจว่ามันจะละเมิดมากแค่ไหน "พวกเขาเป็นปลั๊กอินเดียวกันทั้งหมดยกเว้นความแตกต่างเล็ก ๆ 1"


4
การใช้โซลูชันนี้ฉันสามารถตั้งค่าเฟรมเวิร์กของฉันได้ดังนั้น -DskipUnitTests ข้ามปลั๊กอิน surefire -DskipIntegrationTests ข้ามปลั๊กอินที่ไม่ปลอดภัยและ DskipTests ข้ามไปทั้งสองอย่าง สิ่งที่ต้องการคือสิ่งที่แน่นอน!
Alex Jansen

2
IDE ของฉันกำลังบ่นเกี่ยวกับ "ไม่สามารถแก้ปัญหาสัญลักษณ์ 'skipTests'" การแก้ปัญหาคือการเพิ่มบรรทัด<skipTests>false</skipTests>ยังคงทำงานร่วมกับการรวมกันของ -DskipTests หรือ -Dskip.surefire.tests ใด ๆ เนื่องจากบรรทัดคำสั่ง args ดูเหมือนจะเขียนทับคุณสมบัติstackoverflow.com/questions/13708738 / …คุณอาจต้องการที่จะเพิ่มวิธีการแก้ปัญหาของคุณ
globalworming

<skipTests>${skip.surefire.tests}</skipTests>ไม่ได้ทำงานกับรุ่นmaven-surefire-plugin 3.0.0-M3การทดสอบ surefire ทั้งหมดยังคงทำงานอยู่ ใครพบสิ่งนี้ วิธีแก้ปัญหาด้านล่างของ Sean Patrick Floyd นั้นยังใช้งานได้
John Meyer

120

วิธีแก้ปัญหาคือการโทร:

mvn clean test-compile failsafe:integration-test

เป็นที่ยอมรับว่าเป็นเรื่องน่าเกลียด แต่อาจช่วยแก้ปัญหาของคุณได้


หรือ (แฮ็คอื่น):

mvn clean integration-test -Dtest=SomePatternThatDoesntMatchAnything -DfailIfNoTests=false

อ้างอิง:


1
ข้อเสนอแนะที่สองทำงานให้ฉัน การทดสอบก่อนการรวมระบบถูกเรียกสำเร็จแล้ว
Lawrence Tierney

7
นี่เป็นความคิดที่ดีหรือไม่? สิ่งนี้จะส่งผลให้งานสร้างของคุณประสบความสำเร็จหรือไม่แม้ว่าการทดสอบการรวมระบบของคุณจะล้มเหลว นั่นคือสาระสำคัญทั้งหมดของ failsafe, ถ้าคุณไม่ได้นอกจากนี้ยังเรียกใช้เป้าหมาย 'ตรวจสอบ' อ้างอิง: "ปลั๊กอิน Failsafe จะไม่สร้างบิลด์ในระหว่างขั้นตอนการทดสอบการรวมระบบ" คุณต้องใช้เป้าหมายการยืนยันเพื่อบอกจริง ๆ ว่าการทดสอบการรวมระบบสำเร็จหรือไม่!
บาคาร่า

2
@bacar ถูกต้อง แต่ใช้verifyแทนintegration-testวิธีที่ 2
Matthew Gilliard

1
คุณควรเห็นคำตอบ @bacar เพื่อหาทางออกที่ดีกว่า
FBB

12
หากคุณเพิ่มfailsafe:verifyในตอนท้ายของการแฮ็กแรก ( mvn clean test-compile failsafe:integration-test failsafe:verify) มันจะล้มเหลวในการสร้างถ้าหนึ่งในการทดสอบการรวมล้มเหลว
Shadow Man

73

ฉันใช้รหัสจากบล็อกของ Antonio Goncalvesซึ่งใช้งานได้ดี

คุณสามารถใช้คุณสมบัติต่อไปนี้:

-DskipUTs=true สำหรับการข้ามการทดสอบ surefire

-DskipITs=true สำหรับการข้ามการทดสอบล้มเหลว

-DskipTests=true สำหรับการข้ามการทดสอบทั้งหมด

pom.xmlเป็นดังนี้:

<properties>
    <skipTests>false</skipTests>
    <skipITs>${skipTests}</skipITs>
    <skipUTs>${skipTests}</skipUTs>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.19.1</version>
            <configuration>
                <skipTests>${skipUTs}</skipTests>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <version>2.19.1</version>
            <executions>
                <execution>
                    <id>run-integration-tests</id>
                    <phase>integration-test</phase>
                    <goals>
                        <goal>integration-test</goal>
                        <goal>verify</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <skipTests>${skipTests}</skipTests>
                <skipITs>${skipITs}</skipITs>
            </configuration>
        </plugin>
    </plugins>
</build>

2
ขอบคุณแนวทางที่ยอดเยี่ยม! นอกจากนี้ยังมีประโยชน์ในการแทนที่การดำเนินการเริ่มต้นของ Surefire (การทดสอบเริ่มต้น) ดู: stackoverflow.com/questions/11935181/…
กรุณา

1
นี่คือเหตุผลที่บางครั้งคุณต้องเลื่อนลงและมองหาวิธีการทำงานที่ดีพร้อมข้อมูลที่จำเป็นทั้งหมด ขอบคุณสำหรับการแบ่งปัน
Atul Chaudhary

เป็นทางออกที่ดีจริงๆ อย่างไรก็ตามการกำหนดค่า failafe ซ้ำซ้อนเช่นเดียวskipITsกับค่าเริ่มต้น
timomeinen

SkipITs เป็นตัวเลือกที่กำหนดเองในการกำหนดค่านี้ คุณถูกต้องในการใช้งานเริ่มต้น แต่นั่นไม่ใช่คำถาม OPs
Martijn Burger

รุ่งโรจน์คุณเป็นกูรู maven! สิ่งนี้ควรอยู่ใน super mom maven
Adam

22

หวังว่านี่จะช่วยได้!

ลองเรียกใช้การทดสอบด้วย FailSafe เท่านั้น (ปลั๊กอินสำหรับการทดสอบการรวม - จะช่วยให้คุณรันการทดสอบการรวมด้วยการตั้งชื่อประเภทนี้ตามค่าเริ่มต้น: * / IT .java, ** / IT.java, * /*ITCase.java ; แต่คุณสามารถเปลี่ยนได้อย่างง่ายดายจากไฟล์ pom)

mvn failsafe:integration-test

และเมื่อคุณต้องการใช้ SureFire เท่านั้น (ปลั๊กอินสำหรับทดสอบหน่วย)

mvn surefire:test

หรือการทดสอบหนึ่งครั้งพร้อมกับ:

mvn -Dtest=MyUnitlTest

9

ฉันชอบสิ่งนี้ดังนั้นทุก ๆ ขั้นตอนจะดำเนินการตามปกติ:

 mvn -Dtest=foo -DfailIfNoTests=false verify

1
นี่เป็นทางออกที่ง่ายที่สุด (และยอดเยี่ยมที่สุด)!
Titulum

ไม่ต้องการเพิ่มอะไรใน pom ตามที่ OP ถามและเรียกใช้ทุกเฟสตามที่ระบุ คำตอบที่ดี
jnichols959

1

วิธีขยายความคิดเห็นจาก @danidemi และ @GuillaumeHusta:

FYI: ไม่สนับสนุน skipTests ในปลั๊กอิน Failsafe 3.0.0-M3 ( SUREFIRE-1611 )

ดังนั้นในการข้ามการทดสอบหน่วย แต่ไม่ใช่การทดสอบการรวมคุณสามารถทำได้หากคุณใช้ปลั๊กอิน Failsafe เวอร์ชันล่าสุด:

mvn verify -DskipTests

(โปรดให้ความคิดเห็นดังกล่าวถึงการโหวตถ้าสิ่งนี้ช่วยคุณได้)


-3

ลองเรียกใช้การรวมหรือการทดสอบหน่วยของคุณในโปรไฟล์แยกต่างหาก จากนั้นคุณสามารถเปิด / ปิดโปรไฟล์ได้


อาจเพิ่ม parent pom ที่คุณกำหนดโพรไฟล์ที่ใช้งานไอทีเท่านั้น โมดูลย่อยของโครงการทั้งหมดสามารถสืบทอดรูปแบบที่ pom ดังนั้นคุณไม่จำเป็นต้องเปลี่ยนทุก pom หรือเรียกใช้โมดูลด้วยสวิตช์พิเศษ (เนื่องจากคุณสามารถเปิดใช้งานโปรไฟล์เมื่อไม่มีคุณสมบัติ)
yoosiba
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.