यूनिट परीक्षण रोकें लेकिन मावेन में एकीकरण परीक्षण की अनुमति दें


157

मेरे पास एक मावेन बिल्ड है जिसमें मैं कुछ यूनिट परीक्षण चलाने के लिए SureFire प्लगइन का उपयोग करता हूं, और अन्य एकीकरण परीक्षण चलाने के लिए FailSafe प्लगइन। मैं सिर्फ FailSafe प्लगइन के परीक्षण चलाने का एक तरीका चाहूंगा।

पोम में अलग-अलग प्रोफाइल या कुछ भी जोड़ने के लिए यह मेरे लिए एक अच्छा समाधान नहीं है, क्योंकि यह एक मल्टीमॉडल बिल्ड है और मैं हर मॉड्यूल के पोम को संपादित करना नहीं चाहता।

कर रहे हैं skip.testsऔर maven.test.skipऔर skipTestsजो रोक सभी परीक्षण, और skipITsहै, जो केवल फेल सेफ प्लगइन बंद हो जाता है।

तो, क्या मावेन के लिए एक कमांड-लाइन झंडा है skipITs, लेकिन इसके बजाय "केवल" की कार्यक्षमता के साथ?


क्या आपने कोशिश की maven.test.skipया skipTests?
थॉमस

1
@khmarbaise सिद्धांत में, हाँ। लेकिन ज्यादातर परियोजनाओं में मैंने काम किया है, "यूनिट परीक्षण" जहां वास्तव में एक इन-मेमोरी डीबी (यदि आप भाग्यशाली थे) के साथ एकीकरण परीक्षण
शॉन पैट्रिक फ्लॉयड

9
@khmarbaise बहुत सारे यूनिट परीक्षण। उन्हें चलने में कुछ मिनट लगते हैं और हमें इस परिस्थिति में दौड़ने की आवश्यकता नहीं है। विशेष रूप से, हम कलाकृतियों (बेशक) के निर्माण से पहले इकाई परीक्षण चलाते हैं, लेकिन हम आईटी को कई वातावरणों में चलाना चाहते हैं। कोई बिंदु इस बिंदु पर इकाई परीक्षणों को फिर से नहीं चला रहा है।
मैथ्यू गिलियार्ड

2
हाय @khmarbaise, मेरे सेट अप में skipTestsकेवल अचूक परीक्षण छोड़ता है, न कि असफल परीक्षा! शायद यह एक नई सुविधा है?
दानीदिमेई

2
FYI करें: SkipTests को अब Failsafe Plugin 3.0.0-M3 (
SUREFIRE

जवाबों:


170

मैंने पाया कि केवल अचूक परीक्षण को छोड़ना सबसे आसान तरीका है अचूक को कॉन्फ़िगर करना ( लेकिन असफल नहीं ) निम्नानुसार है:

<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लक्ष्य भी चलाएगा जो कि आपके मैवेन बिल्ड को वास्तव में विफल करने के लिए आवश्यक है यदि आपका एकीकरण परीक्षण विफल हो जाता है।

ध्यान दें कि यह निर्दिष्ट करने के लिए उपयोग की गई संपत्ति को फिर से परिभाषित करता है कि परीक्षणों को छोड़ दिया जाना चाहिए, इसलिए यदि आप विहित की आपूर्ति करते हैं -DskipTests=true, तो अचूकता इसे नजरअंदाज कर देगी, लेकिन असफलता इसे सम्मान देगी, जो अप्रत्याशित हो सकती है, खासकर यदि आपके पास पहले से मौजूद बिल्ड / उपयोगकर्ता इस ध्वज को निर्दिष्ट कर रहे हैं। पोम के अपने सेक्शन में एक साधारण वर्कफ़्लो डिफ़ॉल्ट रूप skip.surefire.testsसे लगता है :skipTests<properties>

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

यदि आपको जरूरत है, तो आप एक असुरक्षित पैरामीटर प्रदान कर सकते हैं जिसे skip.failsafe.testsफेलसेफ के लिए बुलाया जाता है, हालांकि मुझे यह आवश्यक नहीं लगा है - क्योंकि यूनिट परीक्षण आमतौर पर पहले चरण में चलते हैं, और अगर मैं यूनिट परीक्षण चलाना चाहता हूं, लेकिन एकीकरण परीक्षण नहीं, तो मैं दौड़ूंगा testके बजाय चरण verifyचरण। आपके अनुभव भिन्न हो सकते हैं!

इन skip.(surefire|failsafe).testsगुणों को निश्चित रूप से अचूक / विफल कोड में एकीकृत किया जाना चाहिए, लेकिन मुझे यकीन नहीं है कि यह "1 बिल्कुल छोटे अंतर को छोड़कर" एक ही प्लगइन का उल्लंघन करेगा।


4
इस समाधान का उपयोग करके मैं अपने ढांचे को सेट करने में सक्षम हो गया हूँ -DskipUnitTests स्किफ़ायर प्लग पर, -DskipIntegrationTests फ़ेलसेफ़र प्लगइन पर स्किप करता है, और DskipTests दोनों से स्काइप करता है। वास्तव में क्या जरूरत थी!
एलेक्स जानसेन

2
मेरी आईडीई शिकायत कर रही है कि "प्रतीक 'स्किपसेट्स' को हल नहीं कर सकता है" समाधान एक लाइन जोड़ने के लिए था <skipTests>false</skipTests>-DskipTests या -Dskip.surefire.tests के किसी भी संयोजन के साथ काम करता है क्योंकि कमांड लाइन आर्ग्स संपत्तियों को अधिलेखित करने लगता है stackoverflow.com/questions/13708738 /… आप इसे अपने समाधान में जोड़ना चाह सकते हैं
ग्लोबलवॉर्मिंग

<skipTests>${skip.surefire.tests}</skipTests>maven-surefire-pluginसंस्करण के साथ काम नहीं कर रहा है 3.0.0-M3। सभी अचूक परीक्षण अभी भी चल रहे हैं। किसी और को यह मिला? शॉन पैट्रिक फ्लोयड का नीचे का समाधान हालांकि काम कर रहा है।
जॉन मेयर

120

कॉल करने के लिए एक वर्कअराउंड होगा:

mvn clean test-compile failsafe:integration-test

बेशक, यह बदसूरत है, लेकिन यह आपकी समस्या को हल कर सकता है।


या (एक और हैक):

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

संदर्भ:


1
दूसरे सुझाव ने मेरे लिए काम किया। प्री-इंटीग्रेशन-टेस्ट को सफलतापूर्वक कहा गया
लॉरेंस टेरनी

7
यह एक अच्छा विचार है? क्या आपके निर्माण में यह परिणाम सफल नहीं होगा भले ही आपका एकीकरण परीक्षण विफल हो जाए? यदि आप 'सत्यापित' लक्ष्य भी नहीं चलाते हैं , तो यह विफलता का पूरा सार है । उद्धरण: "फेलसेफ प्लगिन एकीकरण-परीक्षण चरण के दौरान निर्माण को विफल नहीं करेगा"। आपको वास्तव में आपको यह बताने के लिए सत्यापन लक्ष्य को चलाने की आवश्यकता है कि एकीकरण परीक्षण सफल हुआ या नहीं!
17

2
@bacar सही है, लेकिन सिर्फ का उपयोग verifyकरने के बजाय integration-test2 समाधान में।
मैथ्यू गिलियार्ड

1
आपको वास्तव में बहुत बेहतर समाधान के लिए @bacar उत्तर देखना चाहिए।
FBB

12
यदि आप failsafe:verifyपहली हैक के अंत में जोड़ते हैं ( mvn clean test-compile failsafe:integration-test failsafe:verify) तो यह एकीकरण को विफल कर देगा यदि एकीकरण परीक्षण में से एक विफल हो जाता है।
शैडो मैन

73

मैं एंटोनियो गोंक्लेव्स ब्लॉग के कोड का उपयोग कर रहा हूं , जो एकदम सही काम करता है।

आप निम्नलिखित गुणों का उपयोग कर सकते हैं:

-DskipUTs=true अचूक परीक्षण लंघन के लिए।

-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
धन्यवाद, महान दृष्टिकोण! यह अचूक फायर (डिफॉल्ट-टेस्ट) के डिफॉल्ट एक्जीक्यूशन को ओवरराइड करने के लिए भी उपयोगी है: देखें: stackoverflow.com/questions/11935181/…
pls

1
यही कारण है कि कभी-कभी आपको नीचे स्क्रॉल करना पड़ता है और सभी आवश्यक जानकारी के साथ एक अच्छा काम करने वाला समाधान ढूंढना पड़ता है। साझा करने के लिए धन्यवाद
अतुल चौधरी

वास्तव में एक अच्छा समाधान है। हालाँकि, skipITsडिफ़ॉल्ट के रूप में विफलता कॉन्फ़िगरेशन बेमानी है।
टाइमोमेनन

इस कॉन्फिग में स्किपिट्स एक कस्टम विकल्प है। आप डिफ़ॉल्ट कार्यान्वयन में सही हैं, लेकिन यह ओपी प्रश्न नहीं था।
मार्टिंज बर्गर

कुडोस, आप एक मावेन गुरु हैं! यह मावेन सुपरपॉम में होना चाहिए।
एडम

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

जैसा कि ओपी ने पूछा है और संकेत के अनुसार सभी चरणों को चलाने के लिए पोम में कुछ भी जोड़ने की आवश्यकता नहीं है। बहुत बढ़िया जवाब।
jnichols959

1

@Danidemi और @GuillaumeHusta से टिप्पणियों का विस्तार करने के लिए:

जानकारी के लिए: skipTests अब फेलसेफ प्लगइन में पदावनत किया गया है 3.0.0-एम 3 ( अचूक-1611 )

इसलिए यूनिट परीक्षणों को छोड़ें, लेकिन एकीकरण परीक्षणों को नहीं, आप ऐसा कर सकते हैं यदि आप Failsafe प्लगइन के नवीनतम संस्करण का उपयोग कर रहे हैं:

mvn verify -DskipTests

(कृपया उल्लेखित टिप्पणियों को आगे बढ़ाएं यदि यह आपकी मदद करता है)


-3

एक अलग प्रोफ़ाइल में अपने एकीकरण या इकाई परीक्षण चलाने का प्रयास करें। तब आप केवल प्रोफ़ाइल को सक्षम / अक्षम कर सकते हैं।


हो सकता है कि पैरेंट पोम जोड़ें जिसमें आप केवल आईटी को चलाने वाली प्रोफाइल को परिभाषित करते हैं? सभी परियोजना उप मॉड्यूल उस पोम को इनहेरिट कर सकते हैं, इसलिए आपको विशेष स्विच के साथ हर पोम या रन मॉड्यूल को बदलने की आवश्यकता नहीं होगी (जैसा कि आप संपत्ति की अनुपस्थिति पर प्रोफ़ाइल को सक्रिय कर सकते हैं)।
योसिबा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.