एकीकरण परीक्षणों के लिए स्प्रिंग-बूट डिफ़ॉल्ट प्रोफ़ाइल


94

स्प्रिंग-बूट स्प्रिंग प्रोफाइल ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ) का उपयोग करता है, जो उदाहरण के लिए अलग-अलग वातावरणों के लिए अलग-अलग कॉन्फिगरेशन की अनुमति देते हैं। इस सुविधा का उपयोग करने का एक तरीका यह है कि एकीकरण डेटाबेस द्वारा परीक्षण डेटाबेस का उपयोग किया जाए। मुझे आश्चर्य है कि क्या मेरी स्वयं की 'टेस्ट' प्रोफाइल बनाना आवश्यक है और प्रत्येक परीक्षण फ़ाइल में स्पष्ट रूप से इस प्रोफ़ाइल को सक्रिय करना है? अभी मैं इसे निम्नलिखित तरीके से करता हूं:

  1. Src / main / resource के अंदर Application-test.properties बनाएँ
  2. वहाँ परीक्षण विशिष्ट विन्यास लिखें (अभी के लिए केवल डेटाबेस का नाम)
  3. हर परीक्षण फ़ाइल में शामिल हैं:

    @ActiveProfiles("test")
    

वहाँ एक चालाक / अधिक संक्षिप्त तरीका है? उदाहरण के लिए एक डिफ़ॉल्ट परीक्षण प्रोफ़ाइल?

संपादन 1: यह सवाल स्प्रिंग-बूट 1.4.1 से संबंधित है

जवाबों:


93

जहां तक ​​मुझे पता है कि आपके अनुरोध को सीधे संबोधित करने के लिए कुछ भी नहीं है - लेकिन मैं एक प्रस्ताव सुझा सकता हूं जो मदद कर सकता है:

आप अपने स्वयं के परीक्षण एनोटेशन का उपयोग कर सकते हैं, जिसमें मेटा एनोटेशन शामिल है @SpringBootTestऔर @ActiveProfiles("test")। इसलिए आपको अभी भी समर्पित प्रोफ़ाइल की आवश्यकता है लेकिन अपने पूरे परीक्षण में प्रोफ़ाइल की परिभाषा को बिखेरने से बचें।

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringBootTest
@ActiveProfiles
public @interface MyApplicationTest {
  @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
}

1
एनोटेशन द्वारा उपयोग किए जाने वाले कई सक्रिय प्रोफाइल को घोषित करने के लिए कोई इसका उपयोग कैसे करता है?
पायने

सरल और साफ सुथरा।
विग्नेश

53

ऐसा करने का एक और तरीका आधार (सार) परीक्षण वर्ग को परिभाषित करना है जिसे आपके वास्तविक परीक्षण वर्ग विस्तारित करेंगे:

@RunWith(SpringRunner.class)
@SpringBootTest()
@ActiveProfiles("staging")
public abstract class BaseIntegrationTest {
}

ठोस परीक्षण:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

    @Test
    public void shouldInjectService(){
        assertThat(this.service).isNotNull();
    }
} 

यह आपको केवल @ActiveProfilesएनोटेशन से अधिक निकालने की अनुमति देता है । आप विभिन्न प्रकार के एकीकरण परीक्षणों के लिए अधिक विशिष्ट आधार वर्गों की कल्पना भी कर सकते हैं, जैसे डेटा एक्सेस लेयर बनाम सेवा परत, या कार्यात्मक विशिष्टताओं (सामान्य @Beforeया @Afterविधियों आदि) के लिए।


43

आप अपने परीक्षण / संसाधन फ़ोल्डर में एक application.properties फ़ाइल डाल सकते हैं। वहां आपने सेट किया

spring.profiles.active=test

परीक्षण चलाते समय यह एक डिफ़ॉल्ट परीक्षण प्रोफ़ाइल की तरह है।


अगर मैं @ActiveProfiles ("test") सेट करने से बचना चाहता हूं, तो मैं अपने टेस्टकेस में इस प्रविष्टि का उपयोग करता हूं। क्या यह आपके लिए काम नहीं करता है?
कॉम्पिटो

36
यदि मैं src/test/resources/application.propertiesफ़ाइल बनाता हूं , src/main/resources/application.propertiesतो परीक्षण चलाते समय सामग्री को अनदेखा कर दिया जाता है।
Ciastek

6
@ क्रेस्टेक आप application-test.propertiesपरीक्षण के लिए जोड़ सकते हैं और केवल उन गुणों को ओवरराइड कर सकते हैं जिनकी आपको आवश्यकता है।
एडवाइसर

3
@ एडवाइजर जो तब तक उठा नहीं जाता जब तक कि डिफ़ॉल्ट गुण निर्दिष्ट नहीं होता spring.profiles.active=testजैसे उत्तर कहता है।
ऑरेंजडॉग

4
@OrangeDog बिल्कुल - शायद आप 'डिफ़ॉल्ट' प्रोफाइल का उपयोग कर सकते हैं जो डिफ़ॉल्ट रूप से सक्रिय है। इसलिए आप परीक्षण / संसाधनों / application-default.properties में ऐसी एक पंक्ति जोड़ सकते हैं (जब तक कि आपके पास पहले से ही एक src / main / application-default.properties फ़ाइल नहीं है :-)
joensson

16

ऐसा करने का एक नाजुक तरीका (वास्तव में, @ कॉम्पिटो के मूल उत्तर के लिए एक मामूली ट्वेक):

  1. सेट spring.profiles.active=testमें test/resources/application-default.properties
  2. test/resources/application-test.propertiesपरीक्षण के लिए जोड़ें और केवल उन गुणों को ओवरराइड करें जिनकी आपको आवश्यकता है।

2
क्या इसका मतलब application.propertiesहै कि क्लासपाथ में डिफॉल्ट को पर्स भी मिल जाता है, फिर test/resources/application-default.propertiesऔर फिर, क्योंकि प्रोफाइल "टेस्ट" का पता लगाया test/resources/application-test.propertiesजाता है, पर्स हो जाता है? अन्यथा यह @ कॉम्पिटो के उत्तर के तहत टिप्पणी के रूप में @ ciastek के मुद्दे को हल नहीं करेगा ।
anddero

8

यदि आप मावेन का उपयोग करते हैं, तो आप इसे pom.xml में जोड़ सकते हैं:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <argLine>-Dspring.profiles.active=test</argLine>
            </configuration>
        </plugin>
        ...

फिर, मावेन को इस arugument का उपयोग करके अपने एकीकरण परीक्षण (* IT.java) चलाना चाहिए, और IntelliJ भी इस प्रोफ़ाइल को सक्रिय करने के साथ शुरू होगा - तो आप फिर अंदर सभी संपत्तियों को निर्दिष्ट कर सकते हैं

application-test.yml

और आपको "-डॉफ़ॉल्ट" गुणों की आवश्यकता नहीं होनी चाहिए।


मेरे लिए काम किया है, लेकिन कॉन्फ़िगर करने के लिए अशुद्धि प्लगइन के साथ-साथ विफलताओं को भी जोड़ना पड़ा।
मोहम्मद आतिफ

5

मेरे मामले में मेरे पास अलग-अलग एप्लिकेशन हैं। पर्यावरण पर निर्भर करता है, कुछ इस तरह है:

application.properties (base file)
application-dev.properties
application-qa.properties
application-prod.properties

और application.properties में उचित फ़ाइल लेने के लिए एक प्रॉपर्टी spring.profiles.active शामिल है।

अपने एकीकरण परीक्षणों के लिए, मैंने एक नई application-test.propertiesफ़ाइल बनाई test/resourcesजिसके अंदर और @TestPropertySource({ "/application-test.properties" })एनोटेशन के साथ यह फ़ाइल है जो एप्लिकेशन को लेने के लिए प्रभारी है। उन परीक्षणों के लिए अपनी आवश्यकताओं के आधार पर मैं जो चाहता हूं, वह चाहता हूं।


आपको उपयोग करना चाहिए @ActiveProfiles, नहीं @TestPropertySource
ऑरेंजडॉग

मुझे लगता है कि यह @TestPropertiesSource का उपयोग करने के लिए बुरा नहीं है। यह प्रोफ़ाइल परीक्षण कॉन्फ़िगरेशन के बीच कॉन्फ़िगरेशन को लोड करने का तरीका भी है।
सोयाबीन

5

अपने build.gradle में "परीक्षण" प्रोफ़ाइल को सक्रिय करने के लिए:

    test.doFirst {
        systemProperty 'spring.profiles.active', 'test'
        activeProfiles = 'test'
    }

4

ऐसा करने के लिए एक और प्रोग्रामिक तरीका:

  import static org.springframework.core.env.AbstractEnvironment.DEFAULT_PROFILES_PROPERTY_NAME;

  @BeforeClass
  public static void setupTest() {
    System.setProperty(DEFAULT_PROFILES_PROPERTY_NAME, "test");
  }

यह बहुत अच्छा काम करता है।


4

आप अपने परीक्षण विशिष्ट गुणों में डाल सकते हैं src/test/resources/config/application.properties

इस फ़ाइल में परिभाषित गुण src/main/resources/application.propertiesपरीक्षण के दौरान परिभाषित उन लोगों को ओवरराइड करेगा ।

इस कार्य के बारे में अधिक जानकारी के लिए स्प्रिंग बूट्स डॉक्स पर एक नज़र डालें ।


कई अच्छे विचार यहां कई मामलों के लिए उपयोगी हैं। इस प्रश्न के लिए IMHO @Matze उत्तर सबसे संक्षिप्त और सीधा उत्तर है, नो प्रोफाइल्स नीड, नो मोडिफाइंग टेस्ट कोड की आवश्यकता ... इसके अलावा क्लीनर है (इसलिए मेरे मामले में भ्रमित करना कि स्प्रिंग लॉग बोली का उपयोग कर रहा है: org.hibernate.dialect.PostgreSQL93Dialect जब मेरा परीक्षण, शुक्र है, इसके बजाय परीक्षण H2 डेटाबेस का उपयोग करके)।
रेमंड नसीफ

1

आप बस तो maven के माध्यम से निर्माण करने के समय सेट / उपयोग डिफ़ॉल्ट प्रोफ़ाइल चाहते हैं, तर्क पारित -Dspring.profiles.active=test वैसे ही जैसे

mvan क्लीन इनस्टॉल -Dspring.profiles.active = dev


0

जोड़े spring.profiles.active=testsअपने application.properties फ़ाइल में, आप की तरह अपने वसंत बूट आवेदन में कई संपत्तियां फ़ाइल जोड़ सकते हैं application-stage.properties, application-prod.propertiesआदि और जब फ़ाइल जोड़कर उल्लेख करने के लिए आप फ़ाइल अपने application.properties में निर्दिष्ट कर सकते हैं spring.profiles.active=stageयाspring.profiles.active=prod

आप कमांड प्रदान करके स्प्रिंग बूट एप्लिकेशन चलाने के समय प्रोफ़ाइल भी पास कर सकते हैं:

java -jar-Dspring.profiles.active=localbuild/libs/turtle-rnr-0.0.1-SNAPSHOT.jar

प्रोफाइल नाम के अनुसार गुण फ़ाइल को उठाया जाता है, उपरोक्त मामले में पासिंग प्रोफ़ाइल फ़ाइल पर localविचार करती application-local.propertiesहै

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