ইন্টিগ্রেশন পরীক্ষার জন্য স্প্রিং-বুট ডিফল্ট প্রোফাইল


94

স্প্রিং-বুট স্প্রিং প্রোফাইলগুলি ব্যবহার করে ( http://docs.spring.io/spring-boot/docs/cटका / references/ html/boot-features-profiles.html ) যা উদাহরণস্বরূপ বিভিন্ন পরিবেশের জন্য পৃথক কনফিগারেশন রাখার অনুমতি দেয়। আমি এই বৈশিষ্ট্যটি ব্যবহার করার একটি উপায় হ'ল ইন্টিগ্রেশন পরীক্ষার দ্বারা ব্যবহৃত টেস্ট ডাটাবেস কনফিগার করা। আমি ভাবছি তবে কি নিজের প্রোফাইল 'পরীক্ষা' তৈরি করা এবং প্রতিটি পরীক্ষার ফাইলে স্পষ্টভাবে এই প্রোফাইলটি সক্রিয় করা দরকার? এখনই আমি এটি নিম্নলিখিত উপায়ে করছি:

  1. এসসিআর / মেইন / রিসোর্সের ভিতরে অ্যাপ্লিকেশন-টেষ্ট.প্রোপার্টি তৈরি করুন
  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"};
}

4
টীকা দ্বারা ব্যবহৃত একাধিক সক্রিয় প্রোফাইল ঘোষণার জন্য এটি কীভাবে ব্যবহার করবে?
পেইন

সহজ এবং ঝরঝরে ফিক্স।
ভিগনেশ

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

আপনি নিজের পরীক্ষা / সংস্থান ফোল্ডারে একটি অ্যাপ্লিকেশন.প্রপার্টি ফাইল রাখতে পারেন। আপনি সেখানে সেট

spring.profiles.active=test

পরীক্ষা চালানোর সময় এটি একটি ডিফল্ট পরীক্ষা প্রোফাইল।


আমি যদি @ অ্যাক্টিভপ্রাইফেলস ("পরীক্ষা") সেট করতে এড়াতে চাই তবে আমি আমার পরীক্ষার কেসগুলিতে এই এন্ট্রিটি ব্যবহার করি। এটি কি আপনার পক্ষে কাজ করে না?
সমাপ্তি

36
যদি আমি src/test/resources/application.propertiesফাইল তৈরি করি , src/main/resources/application.propertiesপরীক্ষা চালানোর সময় সামগ্রীটিকে উপেক্ষা করা হবে।
সিয়াসটেক

6
@ciastek আপনি application-test.propertiesপরীক্ষার জন্য যোগ করতে পারেন এবং কেবলমাত্র আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলিকে ওভাররাইড করতে পারেন ।
উপদেষ্টা

4
spring.profiles.active=testউত্তর হিসাবে যেমন ডিফল্ট বৈশিষ্ট্য নির্দিষ্ট না করা হয় যা অ্যাডভাইসরকে নেওয়া হবে না ।
অরেঞ্জডগ

4
@ ওরেঞ্জডগ হুবহু - সম্ভবত আপনি প্রোফাইল 'ডিফল্ট' ব্যবহার করতে পারেন যা ডিফল্টরূপে সক্রিয়। সুতরাং আপনি পরীক্ষা / সংস্থান / অ্যাপ্লিকেশন-
ডেফল্ট.প্রোপার্টিগুলিতে এই

16

এটি করার একটি বিপর্যয়কর উপায় (আসলে @ কমপিটোর মূল উত্তরটিতে একটি ছোট্ট টুইট):

  1. সেট spring.profiles.active=testমধ্যে test/resources/application-default.properties
  2. অ্যাড test/resources/application-test.propertiesপরীক্ষার জন্য যুক্ত এবং কেবলমাত্র আপনার প্রয়োজনীয় বৈশিষ্ট্যগুলিকে ওভাররাইড করুন।

4
এর অর্থ কি application.propertiesক্লাসপথে ডিফল্টটি খুব পার্স হয়ে যায়, তারপরে test/resources/application-default.propertiesএবং তারপরে, প্রোফাইল "পরীক্ষা" সনাক্ত test/resources/application-test.propertiesহওয়ার পরে , পার্স করা যায়? অন্যথায় এটি @ কমিটো এর উত্তর হিসাবে মন্তব্য করা হিসাবে @ সিয়াসটেকের সমস্যা সমাধান করবে না ।
আন্ডেরো

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>
        ...

তারপরে, মাভেনকে এই তাত্পর্যটি ব্যবহার করে আপনার ইন্টিগ্রেশন টেস্টগুলি (* আইটি.জভা) চালানো উচিত এবং এছাড়াও ইন্টেলিজ এই প্রোফাইলটি সক্রিয় করে শুরু করবে - যাতে আপনি তারপরে সমস্ত বৈশিষ্ট্য নির্দিষ্ট করতে পারেন

application-test.yml

এবং আপনার "-ডিফল্ট" বৈশিষ্ট্যের দরকার নেই।


আমার জন্য কাজ করেছে, তবে ব্যর্থ সাফল্যের পাশাপাশি নিশ্চিতফায়ার প্লাগইনে কনফিগারেশন যুক্ত করতে হয়েছিল।
মোহাম্মদ আতিফ

5

আমার ক্ষেত্রে আমার বিভিন্ন অ্যাপ্লিকেশন রয়েছে the পরিবেশের উপর নির্ভর করে প্রপার্টিগুলি, এরকম কিছু:

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

এবং অ্যাপ্লিকেশন.প্রোপার্টিগুলিতে যথাযথ ফাইলটি বাছাই করার জন্য একটি স্প্রিং.প্রোফিলস.অ্যাকটিভ রয়েছে।

আমার সংহতকরণ পরীক্ষার জন্য, আমি application-test.propertiesভিতরে একটি নতুন ফাইল তৈরি করেছি test/resourcesএবং @TestPropertySource({ "/application-test.properties" })টীকাগুলির সাথে এই ফাইলটি যিনি অ্যাপ্লিকেশনটি বেছে নেওয়ার দায়িত্বে রয়েছেন p ব্যক্তিগতভাবে আমি সেই পরীক্ষাগুলির জন্য আমার প্রয়োজনের উপর নির্ভর করে


আপনার ব্যবহার করা উচিত @ActiveProfiles, না @TestPropertySource
অরেঞ্জডগ

আমি মনে করি @ টেস্টপ্রোপার্টিসোর্স ব্যবহারে এটি আপত্তি করে না। এটি প্রোফাইল পরীক্ষার কনফিগারেশনের মধ্যে কনফিগারেশন লোড করার উপায়।
সোফিয়া

5

আপনার বিল্ড.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 পরীক্ষার সময় ।

কেন এই কাজ কটাক্ষপাত আছে আরও তথ্যের জন্য স্প্রিং বুট ডক্স


এখানে অনেক ভাল ধারণা অনেক ক্ষেত্রে কার্যকর। আইএমএইচও @ ম্যাটজে উত্তর এই প্রশ্নের সর্বাধিক সংক্ষিপ্ত এবং সোজা উত্তর, কোনও প্রোফাইলের প্রয়োজন নেই, কোনও টেস্ট কোডের কোনও সংশোধন করার প্রয়োজন নেই ... এছাড়াও লগিং ক্লিয়ার (আমার ক্ষেত্রে এত বিভ্রান্তিকর যে স্প্রিং লগগুলি ডায়ালেক্ট ব্যবহার করে: org.hibernate.dialect.PostgreSQL93Dialect যখন আমার পরীক্ষা হয়, ধন্যবাদ, পরিবর্তে পরীক্ষার H2 ডাটাবেস ব্যবহার করে)।
রেমন্ড নাসিফ

1

আপনি যদি কেবলমাত্র মাভেনের মাধ্যমে বিল্ডিং করার সময় ডিফল্ট প্রোফাইল সেট / ব্যবহার করতে চান তবে আর্গুমেন্টটি -Dspring.profiles.active=test ঠিক এর মতো পাস করুন

এমভিএন ক্লিন ইনস্টল -Dspring.profiles.active = দেব


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করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.