2013-12-12 10 views
14

हमारे वसंत वेब अनुप्रयोगों में, हम तीन परिदृश्यों को अलग करने के लिए स्प्रिंग बीन प्रोफाइल का उपयोग करते हैं: विकास, एकीकरण और उत्पादन। हम उन्हें विभिन्न डेटाबेस से कनेक्ट करने या अन्य स्थिरांक सेट करने के लिए उपयोग करते हैं।प्रोफ़ाइल के साथ वसंत एकीकरण परीक्षण

वसंत बीन प्रोफाइल का उपयोग वेब ऐप पर्यावरण को बदलने के लिए बहुत अच्छी तरह से काम करता है।

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

हम निम्नलिखित जैसे हमारे एकीकरण परीक्षण सेटअप करते हैं।

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = ["classpath:applicationContext.xml"]) 
public class MyTestIT 
{ 
    @Autowired 
    @Qualifier("myRemoteURL") // a value from the web-app's applicationContext.xml 
    private String remoteURL; 
    ... 
} 

मैं इसे @ActiveProfiles का उपयोग कर स्थानीय स्तर पर चलाने के लिए कर सकते हैं, लेकिन यह हार्ड-कोडेड है और निर्माण सर्वर पर विफल हमारे परीक्षणों का कारण बनता है।

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = ["classpath:applicationContext.xml"]) 
@ActiveProfiles("development") 
public class MyTestIT 
{ ... } 

मैं भी उम्मीद कर रहा है कि यह किसी भी तरह Maven से spring.profiles.active संपत्ति आयात हो सकता है @WebAppConfiguration उपयोग करने की कोशिश, लेकिन वह काम नहीं करता।

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

उत्तर

29

के रूप में अन्य लोगों को पहले ही बताया है, आप Maven का उपयोग करने के spring.profiles.active प्रणाली गुण सेट करने के लिए विकल्प चुन सकते हैं, @ActiveProfiles का उपयोग करने के लिए सुनिश्चित करें, लेकिन आईडीई के भीतर चलने वाले परीक्षणों के लिए यह सुविधाजनक नहीं है।

सक्रिय प्रोफाइल सेट करने के लिए प्रोग्रामेटिक माध्यमों के लिए, आपके पास कुछ विकल्प हैं।

  1. स्प्रिंग 3.1: एक कस्टम ContextLoader इस संदर्भ के Environment में सक्रिय प्रोफाइल की स्थापना करके संदर्भ तैयार करता लिखें।
  2. वसंत 3.2: एक कस्टम ContextLoader एक विकल्प बना हुआ है, लेकिन ApplicationContextInitializer को लागू करने के लिए बेहतर विकल्प है और @ContextConfiguration की initializers विशेषता के माध्यम से इसे कॉन्फ़िगर करें। आपका कस्टम प्रारंभकर्ता सक्रिय प्रोफाइल को प्रोग्रामेटिक रूप से सेट करके Environment को कॉन्फ़िगर कर सकता है।
  3. वसंत 4.0: उपर्युक्त विकल्प अभी भी मौजूद हैं; हालांकि, स्प्रिंग फ्रेमवर्क 4 के रूप में।0 इस उद्देश्य के लिए बिल्कुल एक नया समर्पित ActiveProfilesResolver एपीआई है: परीक्षण में उपयोग करने के लिए सक्रिय प्रोफाइल के सेट को प्रोग्रामेटिक रूप से निर्धारित करने के लिए। ActiveProfilesResolver@ActiveProfiles की विशेषता के माध्यम से पंजीकृत किया जा सकता है।

सादर,

सैम (स्प्रिंग TestContext फ्रेमवर्क के लेखक)

+0

मैं वसंत 3.2 उपयोग कर रहा हूँ और आइटम # 2 काम करता है बहुत अच्छी तरह से इसके लिए। मैं 'configurableAplicationContext.getEnvironment()। SetDefaultProfiles (" विकास ") को कॉल करने के लिए अपना 'ApplicationContextInitializer' सेट अप करता हूं;' जब मैं IntelliJ के माध्यम से परीक्षण चलाता हूं तो विकास प्रोफ़ाइल चलाता है। –

+0

क्या 'ActiveProfilesResolver' का उपयोग करने के बारे में कोई उदाहरण है? मुझे वास्तव में यह नहीं पता कि इसका उपयोग कैसे करें – daydreamer

+1

हां, [परीक्षण अध्याय] में एक कस्टम 'ActiveProfilesResolver' का उपयोग करने का एक उदाहरण है (http://docs.spring.io/spring/docs/current/spring-framework स्प्रिंग फ्रेमवर्क संदर्भ मैनुअल के संदर्भ/एचटीएमएल/test.html # testcontext-ctx-management-env-profiles-ActiveProfilesResolver)। –

3

यदि आप प्रोफ़ाइल को हार्ड-कोडिंग से बचना चाहते हैं तो आप system propertyspring.profiles.active का उपयोग करना चाहेंगे और इसे उस विशेष वातावरण में जो कुछ भी चाहिए उसे सेट करें। हमारे पास हमारे विभिन्न वातावरण के लिए "देव", "चरण" और "प्रोड" प्रोफाइल हैं; हमारे परीक्षण के लिए हमारे पास "टेस्ट", "टेस्ट-लोकल" और "टेस्ट-सर्वर" प्रोफाइल भी हैं।

याद रखें कि आपके पास अल्पविराम से अलग मूल्यों की सूची का उपयोग करके उस सिस्टम प्रॉपर्टी में एक से अधिक प्रोफ़ाइल हो सकती हैं। "परीक्षण, परीक्षण क्यूए"।

आप maven surefire plugin में एक Maven परियोजना में सिस्टम गुण निर्दिष्ट कर सकते हैं या उन्हें इस तरह गुजर:

mvn -DargLine="-DpropertyName=propertyValue" 
0

@ElderMael आप Maven अचूक प्लगइन का argLine संपत्ति इस्तेमाल कर सकते हैं उल्लेख किया है। अक्सर जब मुझे विभिन्न विशिष्ट स्प्रिंग प्रोफाइल के साथ सभी परीक्षण चलाने की आवश्यकता होती है तो मैं अतिरिक्त मैवेन प्रोफाइल को परिभाषित करता हूं। उदाहरण:

mvn clean test -Pfoo 

@ActiveProfile एनोटेशन अच्छा है, लेकिन कभी कभी हम सक्रिय के साथ सभी परीक्षण चलाने की जरूरत है:

<profiles> 
    <profile> 
     <id>foo</id> 
     <dependencies> 
      <!-- additional dependencies if needed, i.e. database drivers -> 
     </dependencies> 
     <build> 
      <plugins> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <configuration> 
         <argLine>-Dspring.profiles.active=foo</argLine> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 
कि दृष्टिकोण आप आसानी से Maven आदेश से सक्रिय प्रोफाइल के साथ सभी परीक्षण चला सकते हैं के साथ

विशिष्ट प्रोफाइल और हार्ड-कोडेड @ActiveProfile पैरामीटर के साथ यह एक समस्या है।

उदाहरण के लिए: एच 2 इन-मेमोरी डीबी के साथ डिफ़ॉल्ट एकीकरण परीक्षण द्वारा, लेकिन कभी-कभी आप "वास्तविक" डेटाबेस पर परीक्षण चलाने के लिए चाहते हैं। आप उस अतिरिक्त मेवेन प्रोफाइल को परिभाषित कर सकते हैं और जेनकींस नौकरी को परिभाषित कर सकते हैं। स्प्रिंगबूट के साथ आप नाम एप्लिकेशन-foo.yml (या गुण) के साथ परीक्षण/संसाधनों के लिए अतिरिक्त गुण भी डाल सकते हैं और उन गुणों को ध्यान में रखा जाएगा।

10

मुझे एक ही समस्या थी: मैं अपने सभी एकीकरण परीक्षण को डिफ़ॉल्ट प्रोफ़ाइल के साथ चलाने के लिए चाहता था, लेकिन उपयोगकर्ता को एक प्रोफ़ाइल के साथ ओवरराइड करने की अनुमति देता है जो एक अलग वातावरण या यहां तक ​​कि डीबी स्वाद का प्रतिनिधित्व करता है बिना @ActiveProfiles मान को बदलने के । यदि आप कस्टम ActiveProfilesResolver के साथ स्प्रिंग 4.1+ का उपयोग कर रहे हैं तो यह करने योग्य है।

यह उदाहरण रिसोल्वर एक प्रणाली संपत्ति के लिए लग रहा है, spring.profiles.active, और अगर यह मौजूद नहीं है यह डिफ़ॉल्ट समाधानकर्ता जो केवल @ActiveProfiles एनोटेशन का उपयोग करता है को सौंप देगा।

public class SystemPropertyActiveProfileResolver implements ActiveProfilesResolver { 

private final DefaultActiveProfilesResolver defaultActiveProfilesResolver = new DefaultActiveProfilesResolver(); 

@Override 
public String[] resolve(Class<?> testClass) { 

    if(System.getProperties().containsKey("spring.profiles.active")) { 

     final String profiles = System.getProperty("spring.profiles.active"); 
     return profiles.split("\\s*,\\s*"); 

    } else { 

     return defaultActiveProfilesResolver.resolve(testClass); 
    } 
} 

}

और अपने परीक्षण कक्षाओं में, आप इसे इस तरह का प्रयोग करेंगे:

@RunWith(SpringJUnit4ClassRunner.class) 
@ActiveProfiles(profiles={"h2","xyz"}, 
resolver=SystemPropertyActiveProfileResolver.class) 
public class MyTest { } 

आप निश्चित रूप से एक प्रणाली संपत्ति के अस्तित्व स्थापित करने के लिए के लिए जाँच के अलावा अन्य तरीकों का उपयोग कर सकते हैं सक्रिय प्रोफाइल उम्मीद है कि यह किसी की मदद करता है।

-1

इस समस्या के कई चेहरे हैं। मेरे मामले में , एक सरल इसके अलावा build.gradle पहले से ही मदद की है:

test { systemProperties = System.properties } 
संबंधित मुद्दे