โปรไฟล์เริ่มต้น Spring-boot สำหรับการทดสอบการรวม


94

Spring-boot ใช้โปรไฟล์ Spring ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ) ซึ่งอนุญาตให้อินสแตนซ์มีการกำหนดค่าแยกกันสำหรับสภาพแวดล้อมที่แตกต่างกัน วิธีหนึ่งที่ฉันใช้คุณสมบัตินี้คือกำหนดค่าฐานข้อมูลทดสอบที่จะใช้โดยการทดสอบการรวม ฉันสงสัยว่าจำเป็นต้องสร้าง 'การทดสอบ' โปรไฟล์ของตัวเองและเปิดใช้งานโปรไฟล์นี้อย่างชัดเจนในแต่ละไฟล์ทดสอบหรือไม่? ตอนนี้ฉันทำด้วยวิธีต่อไปนี้:

  1. สร้าง application-test.properties ภายใน src / main / resources
  2. เขียน config เฉพาะการทดสอบที่นั่น (ตอนนี้ชื่อฐานข้อมูล)
  3. ในทุกไฟล์ทดสอบประกอบด้วย:

    @ActiveProfiles("test")
    

มีวิธีที่ชาญฉลาด / รัดกุมกว่านี้ไหม? ตัวอย่างเช่นโปรไฟล์การทดสอบเริ่มต้น?

แก้ไข 1: คำถามนี้เกี่ยวข้องกับ Spring-Boot 1.4.1

คำตอบ:


94

เท่าที่ฉันทราบไม่มีสิ่งใดที่ตอบสนองคำขอของคุณโดยตรง - แต่ฉันสามารถแนะนำข้อเสนอที่สามารถช่วยได้:

คุณสามารถใช้คำอธิบายประกอบการทดสอบของคุณเองซึ่งเป็นคำอธิบายประกอบเมตาที่ประกอบด้วย@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
หนึ่งใช้สิ่งนี้เพื่อประกาศโปรไฟล์ที่ใช้งานอยู่หลายโปรไฟล์ที่จะใช้โดยคำอธิบายประกอบได้อย่างไร
payne

แก้ไขง่ายและเรียบร้อย
Vignesh

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 ในโฟลเดอร์ test / resources ของคุณ ที่นั่นคุณตั้ง

spring.profiles.active=test

นี่เป็นโปรไฟล์การทดสอบเริ่มต้นในขณะที่เรียกใช้การทดสอบ


ฉันใช้รายการนี้ในการทดสอบของฉันหากฉันต้องการหลีกเลี่ยงการตั้งค่า @ActiveProfiles ("test") มันไม่ได้ผลสำหรับคุณ?
Compito

36
หากฉันสร้างsrc/test/resources/application.propertiesไฟล์src/main/resources/application.propertiesเนื้อหาจะถูกละเว้นเมื่อเรียกใช้การทดสอบ
ciastek

6
@ciastek คุณสามารถเพิ่มapplication-test.propertiesสำหรับการทดสอบและแทนที่เฉพาะคุณสมบัติที่คุณต้องการ
Advicer

3
@Advicer ซึ่งจะไม่ถูกหยิบขึ้นมาเว้นแต่คุณสมบัติเริ่มต้นจะระบุspring.profiles.active=testเหมือนคำตอบที่ระบุ
OrangeDog

4
@OrangeDog อย่างแน่นอน - บางทีคุณอาจใช้ประโยชน์จาก 'ค่าเริ่มต้น' ของโปรไฟล์ซึ่งใช้งานได้ตามค่าเริ่มต้น ดังนั้นคุณสามารถเพิ่มบรรทัดดังกล่าวใน test / resources / application-default.properties (เว้นแต่คุณจะมีไฟล์ src / main / application-default.properties อยู่แล้ว :-)
joensson

16

วิธีที่ล่าช้าในการทำเช่นนั้น (ในความเป็นจริงเล็กน้อยสองสัปดาห์สำหรับคำตอบเดิมของ @ Compito):

  1. ตั้งค่าspring.profiles.active=testในtest/resources/application-default.properties.
  2. เพิ่มtest/resources/application-test.propertiesสำหรับการทดสอบและแทนที่เฉพาะคุณสมบัติที่คุณต้องการ

2
หมายความว่าค่าเริ่มต้นapplication.propertiesใน classpath จะถูกแยกวิเคราะห์ด้วยหรือไม่จากtest/resources/application-default.propertiesนั้นเนื่องจากตรวจพบโปรไฟล์ "test" จึงtest/resources/application-test.propertiesได้รับการแยกวิเคราะห์ มิฉะนั้นก็จะไม่แก้ปัญหา @ ciastek เป็นความเห็นภายใต้@ คำตอบของ
anddero

8

หากคุณใช้ maven คุณสามารถเพิ่มสิ่งนี้ใน 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>
        ...

จากนั้น maven ควรเรียกใช้การทดสอบการรวมของคุณ (* IT.java) โดยใช้อาร์กิวเมนต์นี้และ IntelliJ จะเริ่มต้นด้วยการเปิดใช้งานโปรไฟล์นี้เพื่อให้คุณสามารถระบุคุณสมบัติทั้งหมดภายใน

application-test.yml

และคุณไม่ควรต้องการคุณสมบัติ "-default"


ใช้งานได้สำหรับฉัน แต่ต้องเพิ่มการกำหนดค่าให้กับปลั๊กอิน surefire พร้อมกับไม่ปลอดภัย
Mohammed Atif

5

ในกรณีของฉันฉันมี application.properties ที่แตกต่างกันขึ้นอยู่กับสภาพแวดล้อมเช่น:

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
OrangeDog

ฉันคิดว่ามันไม่สำคัญสำหรับการใช้ @TestPropertiesSource นอกจากนี้ยังเป็นวิธีโหลดการกำหนดค่าระหว่างการกำหนดค่าการทดสอบโปรไฟล์
soyphea

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ระหว่างการทดสอบ

สำหรับข้อมูลเพิ่มเติมว่าเหตุใดจึงสามารถดูเอกสาร Spring Bootsได้


ข้อคิดดีๆมากมายที่นี่มีประโยชน์สำหรับหลาย ๆ กรณี คำตอบของ IMHO @Matze เป็นคำตอบที่กระชับและตรงไปตรงมาที่สุดสำหรับคำถามนี้ไม่จำเป็นต้องมีโปรไฟล์ไม่จำเป็นต้องแก้ไขรหัสทดสอบ ... นอกจากนี้การบันทึกยังสะอาดกว่า (ในกรณีของฉันทำให้เกิดความสับสนในกรณีของฉันที่บันทึกสปริงโดยใช้ภาษาถิ่น: org.hibernate.dialect.PostgreSQL93Dialect เมื่อการทดสอบของฉันโชคดีที่ใช้ฐานข้อมูล H2 ทดสอบแทน)
Raymond Naseef

1

หากคุณต้องการตั้งค่า / ใช้โปรไฟล์เริ่มต้นในเวลาที่สร้างผ่าน maven ให้ส่งอาร์กิวเมนต์ -Dspring.profiles.active=test เช่นเดียวกับ

mvn ล้างการติดตั้ง -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ไฟล์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.