जूनिट: स्प्लिट इंटीग्रेशन टेस्ट और यूनिट टेस्ट


126

मुझे जुनिट परीक्षण का भार विरासत में मिला है, लेकिन ये परीक्षण (अधिकांश काम नहीं करने के अलावा) वास्तविक इकाई परीक्षण और एकीकरण परीक्षण (बाहरी सिस्टम, डीबी आदि की आवश्यकता) का मिश्रण हैं।

इसलिए मैं वास्तव में उन्हें अलग करने के तरीके के बारे में सोचने की कोशिश कर रहा हूं, ताकि मैं इकाई परीक्षण को अच्छी और जल्दी से चला सकूं और उसके बाद एकीकरण परीक्षण कर सकूं।

विकल्प हैं ..

  1. उन्हें अलग निर्देशिका में विभाजित करें।

  2. Junit4 (v3 से) पर जाएं और उन्हें अलग करने के लिए कक्षाओं को एनोटेट करें।

  3. एक फ़ाइल नामकरण सम्मेलन का उपयोग यह बताने के लिए करें कि क्लास क्या है, अर्थात एडेप्टरएस्टएस्ट और एडेप्टरएनेटरग्रेशनटेस्ट।

3 में समस्या है कि एक्लिप्स में "चयनित प्रोजेक्ट / पैकेज या फ़ोल्डर में सभी परीक्षण चलाएं" का विकल्प है। इसलिए यह सिर्फ एकीकरण परीक्षण चलाने के लिए बहुत कठिन होगा।

2: जोखिम है कि डेवलपर्स इकाई परीक्षण कक्षाओं में एकीकरण परीक्षण लिखना शुरू कर सकते हैं और यह सिर्फ गड़बड़ हो जाता है।

1: सबसे साफ समाधान की तरह लगता है, लेकिन मेरे पेट कहते हैं कि वहाँ एक बेहतर समाधान होना चाहिए।

तो यह मेरा सवाल है, आप एकीकरण परीक्षणों और उचित इकाई परीक्षणों को कैसे तोड़ सकते हैं?


मैं आप सभी को इनपुट के लिए धन्यवाद देना चाहूंगा, मुझे पता है कि यह एक व्यक्तिपरक प्रश्न है, और कोई भी सही उत्तर नहीं देता है। लेकिन आपने मुझे यह महसूस करने में मदद की है कि मेरे द्वारा सूचीबद्ध लोगों के अलावा कोई अन्य विकल्प नहीं है। मुझे लगता है कि मैं इस समय के लिए डायरेक्टरी के उतार-चढ़ाव के साथ जा रहा हूं और JUnit4 में जा रहा हूं, हालांकि अभी तक उन्हें विभाजित करने के लिए एनोटेशन का उपयोग नहीं करते हैं।
जेफ पोर्टर

जवाबों:


10

मैं वर्तमान में संगठनात्मक नीति (और Junit 3 विरासत) के कारण अलग-अलग निर्देशिकाओं का उपयोग करता हूं, लेकिन मैं खुद को एनोटेशन पर संक्रमण के लिए देख रहा हूं अब मैं Junit 4 पर हूं।

मुझे आपकी इकाई परीक्षण कक्षाओं में एकीकरण परीक्षण डालने वाले डेवलपर्स के बारे में अधिक चिंता नहीं होगी - यदि आवश्यक हो तो अपने कोडिंग मानकों में एक नियम जोड़ें।

मुझे यह जानने में दिलचस्पी है कि एनोटेशन या शारीरिक रूप से वर्गों को अलग करने के अलावा किस तरह के अन्य समाधान हो सकते हैं।


145

आप JUnit श्रेणियों और मावेन का उपयोग करके उन्हें बहुत आसानी से विभाजित कर सकते हैं।

यह विभाजन इकाई और एकीकरण परीक्षणों द्वारा बहुत संक्षिप्त रूप से नीचे दिखाया गया है।

एक मार्कर इंटरफ़ेस परिभाषित करें

श्रेणियों का उपयोग करके परीक्षण का समूह बनाने में पहला कदम एक मार्कर इंटरफ़ेस बनाना है।

इस इंटरफ़ेस का उपयोग उन सभी परीक्षणों को चिह्नित करने के लिए किया जाएगा जिन्हें आप एकीकरण परीक्षणों के रूप में चलाना चाहते हैं।

public interface IntegrationTest {}

अपनी परीक्षा कक्षाएं चिह्नित करें

अपनी श्रेणी के शीर्ष पर श्रेणी एनोटेशन जोड़ें। यह आपके नए इंटरफ़ेस का नाम लेता है।

import org.junit.experimental.categories.Category;
@Category(IntegrationTest.class)
public class ExampleIntegrationTest{
  @Test
  public void longRunningServiceTest() throws Exception {
  }
}

मावेन यूनिट टेस्ट कॉन्फ़िगर करें

इस समाधान की सुंदरता यह है कि चीजों के यूनिट परीक्षण पक्ष के लिए वास्तव में कुछ भी नहीं बदलता है।

हम किसी भी एकीकरण परीक्षण की अनदेखी करने के लिए इसे बनाने के लिए मावेन अचूक प्लगइन में कुछ विन्यास जोड़ते हैं।

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.11</version>
  <dependencies>
   <dependency>
     <groupId>org.apache.maven.surefire</groupId>
     <artifactId>surefire-junit47</artifactId>
     <version>2.12</version>
   </dependency>
  </dependencies>
  <configuration>
    <includes>
      <include>**/*.class</include>
    </includes>
    <excludedGroups>com.test.annotation.type.IntegrationTest</excludedGroups>
  </configuration>
</plugin>

जब आप एक mvan क्लीन टेस्ट करते हैं तो केवल आपकी अनकवर्ड यूनिट टेस्ट ही चलेगी।

मावेन एकीकरण टेस्ट कॉन्फ़िगर करें

फिर इसके लिए विन्यास बहुत सरल है।

केवल एकीकरण परीक्षण चलाने के लिए, इसका उपयोग करें:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-surefire-plugin</artifactId>
  <version>2.11</version>
  <dependencies>
   <dependency>
     <groupId>org.apache.maven.surefire</groupId>
     <artifactId>surefire-junit47</artifactId>
     <version>2.12</version>
   </dependency>
  </dependencies>
  <configuration>
    <groups>com.test.annotation.type.IntegrationTest</groups>
  </configuration>
</plugin>

यदि आप इसे आईडी के साथ एक प्रोफ़ाइल में लपेटते हैं IT, तो आप केवल तेज़ परीक्षणों का उपयोग करके चला सकते हैं mvn clean install। केवल एकीकरण / धीमी परीक्षणों को चलाने के लिए, उपयोग करें mvn clean install -P IT

लेकिन सबसे अधिक बार, आप डिफ़ॉल्ट रूप से और सभी परीक्षणों के साथ तेज परीक्षण चलाना चाहेंगे -P IT। अगर ऐसा है, तो आपको एक ट्रिक का उपयोग करना होगा:

<profiles>
    <profile>
        <id>IT</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <excludedGroups>java.io.Serializable</excludedGroups> <!-- An empty element doesn't overwrite, so I'm using an interface here which no one will ever use -->
                    </configuration>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>

जैसा कि आप देख सकते हैं, मैं उन परीक्षणों को छोड़ रहा हूं, जिनके साथ एनोटेट किया गया है java.io.Serializable। यह आवश्यक है क्योंकि प्रोफ़ाइल अचूक प्लगइन के डिफ़ॉल्ट कॉन्फ़िगरेशन को इनहेरिट करेगा, इसलिए भले ही आप कहें <excludedGroups/>या <excludedGroups></excludedGroups>, मान com.test.annotation.type.IntegrationTestका उपयोग किया जाएगा।

आप भी इसका उपयोग नहीं कर सकते noneक्योंकि यह क्लासपाथ पर एक इंटरफ़ेस होना चाहिए (मैवेन यह जांच करेगा)।

टिप्पणियाँ:

  • निर्भरता surefire-junit47केवल तब आवश्यक है जब मावेन जेयूनेट 4 धावक पर स्वचालित रूप से स्विच नहीं करता है। groupsया excludedGroupsतत्व का उपयोग करके स्विच को ट्रिगर करना चाहिए। यहाँ देखें
  • ऊपर दिए गए अधिकांश कोड Maven Failsafe प्लगइन के लिए प्रलेखन से लिए गए थे। इस पृष्ठ पर "JUnit श्रेणियाँ का उपयोग करना" अनुभाग देखें ।
  • अपने परीक्षणों के दौरान, मैंने पाया कि यह तब भी काम करता है जब आप @RunWith()सूट या स्प्रिंग-आधारित परीक्षण चलाने के लिए एनोटेशन का उपयोग करते हैं ।

18
मुझे लगता है कि आपके पिछले pom.xml टुकड़े में कोई त्रुटि है। आपने "परीक्षण" चरण के लिए उसी स्निपेट को चिपकाया है। यह अभी भी एकीकरण परीक्षणों को शामिल नहीं करता है और किसी भी मावेन चरण के लिए बाध्य नहीं है।
एलेक्स

1
वास्तव में, अंतिम पोम टुकड़ा एक कॉपी और पेस्ट गलती है। यह मावेन-फ़ेलसेफ़-प्लगइन दिखाना चाहिए।
19o में पाउलो मर्सन

2
तो फिर दूसरी xml क्या होनी चाहिए? : ओ
लिव

यदि आप डिफ़ॉल्ट मावेन प्रोफ़ाइल का उपयोग करते हैं तो आपको ट्रिक (सीरियल मैजिक के साथ अंतिम जादू) का उपयोग करने की आवश्यकता नहीं है
user831217

यह वास्तव में स्वीकृत उत्तर होना चाहिए क्योंकि यह वास्तव में एक दार्शनिक बहस के बजाय सवाल का हल है कि विभिन्न परीक्षणों को कहां रखा जाए।
Bwvolleyball

40

हम एकीकरण परीक्षण चलाने के लिए यूनिट परीक्षण और मावेन फेलसेफ प्लगिन को चलाने के लिए मावेन स्योरफेयर प्लगइन का उपयोग करते हैं। इकाई परीक्षण **/Test*.java **/*Test.java **/*TestCase.javaनामकरण सम्मेलनों, एकीकरण परीक्षणों का पालन करते हैं - **/IT*.java **/*IT.java **/*ITCase.java। तो यह वास्तव में आपका विकल्प नंबर तीन है।

कुछ परियोजनाओं में हम TestNG का उपयोग करते हैं और एकीकरण / यूनिट परीक्षणों के लिए विभिन्न परीक्षण समूहों को परिभाषित करते हैं, लेकिन यह संभवतः आपके लिए उपयुक्त नहीं है।


1
मावेन के लिए +1 + अचूक + फेलसेफ + जूनिट कॉम्बो। मुझे पता ही नहीं चला कि फेलसेफ स्वचालित रूप से "आईटी *" चलाएगा। मिठाई।
पापाफ्रायड

13

मैं इसे करने के लिए Junit4 पर जाऊंगा :)

आप उन्हें अलग-अलग टेस्ट सूट में अलग कर सकते हैं। मुझे नहीं पता है कि उन्हें जून 3 में कैसे आयोजित किया जाता है, लेकिन टेस्ट सूट बनाने और उनमें से सभी वास्तविक इकाई परीक्षणों को एक में रखने के लिए जूनिट 4 में आसान होना चाहिए और फिर एकीकरण परीक्षणों के लिए दूसरे सूट का उपयोग करना चाहिए।

अब ग्रहण में दोनों सुइट्स के लिए रन कॉन्फ़िगरेशन को परिभाषित करें और आप आसानी से एकल सूट चला सकते हैं। इन सुइट्स को एक स्वचालित प्रक्रिया से भी लॉन्च किया जा सकता है, जिससे आप हर बार स्रोत में बदलाव और शायद एकीकरण परीक्षण (यदि वे वास्तव में बड़े हैं) केवल एक दिन में एक बार या एक घंटे में एक बार यूनिट परीक्षण चलाने की अनुमति दे सकते हैं।


9

IfProfileValue वसंत एनोटेशन का उपयोग करना आवश्यक है कि यह बिना मावेन प्लगइन या कॉन्फ़िगरेशन के बिना इसे प्राप्त करना संभव है ।

IfProfileValue का उपयोग करके एकीकरण परीक्षण कक्षाओं या विधियों का उल्लेख करें

import org.springframework.test.annotation.IfProfileValue;

@IfProfileValue(name="test-groups", value="integration")
public class ExampleIntegrationTest{
    @Test
    public void longRunningServiceTest() throws Exception {
    }
} 

केवल यूनिट परीक्षणों का उपयोग करने के लिए:

mvn clean test

एकीकरण परीक्षण और इकाई परीक्षणों का उपयोग करके चलाने के लिए:

mvn clean test -Dtest-groups=integration

इसके अलावा, एक IDE में "सभी परीक्षण चलाएं" केवल इकाई परीक्षण चलाएगा। -Dtest-groups=integrationएकीकरण और इकाई परीक्षण दोनों को चलाने के लिए VM तर्कों में जोड़ें ।


यह दृष्टिकोण अच्छा और सरल है, लेकिन मुझे जो समस्या है, वह यह है कि डिफ़ॉल्ट रूप से मैं सभी परीक्षण (एकीकरण परीक्षण सहित) चलाना चाहूंगा। यह इस दृष्टिकोण के साथ संभव नहीं है, क्या यह है?
सीएसलजर

6

एक सही उत्तर नहीं है। जैसा कि आपने समझाया है, इसे करने के कई तरीके हैं जो काम करेंगे। मैंने दोनों फ़ाइल नामकरण योजना और अलग-अलग निर्देशिकाओं में चीजों को विभाजित किया है।

ऐसा लगता है कि अलग-अलग निर्देशिकाओं में बात करने से आपके लिए बेहतर काम हो सकता है, और यह मुझे थोड़ा स्पष्ट लगता है, इसलिए मैं उस ओर झुकूंगा।

मुझे नहीं लगता कि मैं एनोटेशन की कोशिश करूंगा क्योंकि यह मुझे अधिक ठीक लगता है। क्या आप वास्तव में इन दो प्रकार के परीक्षणों को एक साथ एक ही फ़ाइल में मिश्रित करना चाहते हैं? मैं नहीं होगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.