Cấu hình mặc định của Spring-boot cho các bài kiểm tra tích hợp


94

Spring-boot sử dụng cấu hình Spring ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ), ví dụ, cho phép có cấu hình riêng cho các môi trường khác nhau. Một cách tôi sử dụng tính năng này là định cấu hình cơ sở dữ liệu thử nghiệm sẽ được sử dụng bởi các thử nghiệm tích hợp. Tuy nhiên, tôi tự hỏi liệu có cần thiết phải tạo hồ sơ 'thử nghiệm' của riêng tôi và kích hoạt hồ sơ này một cách rõ ràng trong mỗi tệp thử nghiệm không? Ngay bây giờ tôi thực hiện theo cách sau:

  1. Tạo application-test.properties bên trong src / main / resources
  2. Viết cấu hình thử nghiệm cụ thể ở đó (chỉ tên cơ sở dữ liệu bây giờ)
  3. Trong mỗi tệp thử nghiệm bao gồm:

    @ActiveProfiles("test")
    

Có cách nào thông minh hơn / ngắn gọn hơn không? Ví dụ: một hồ sơ thử nghiệm mặc định?

Chỉnh sửa 1: Câu hỏi này liên quan đến Spring-Boot 1.4.1

Câu trả lời:


93

Theo như tôi biết thì không có gì trực tiếp giải quyết yêu cầu của bạn - nhưng tôi có thể đề xuất một đề xuất có thể giúp:

Bạn có thể sử dụng chú thích thử nghiệm của riêng mình, chú thích meta bao gồm @SpringBootTest@ActiveProfiles("test"). Vì vậy, bạn vẫn cần hồ sơ chuyên dụng nhưng tránh phân tán định nghĩa hồ sơ trong tất cả các thử nghiệm của bạn.

Chú thích này sẽ mặc định cho cấu hình testvà bạn có thể ghi đè lên cấu hình bằng cách sử dụng chú thích meta.

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

1
Làm cách nào để sử dụng điều này để khai báo nhiều cấu hình hoạt động sẽ được chú thích sử dụng?
payne

Sửa chữa đơn giản và gọn gàng.
Canh thức

53

Một cách khác để làm điều này là xác định một lớp thử nghiệm cơ sở (trừu tượng) mà các lớp thử nghiệm thực tế của bạn sẽ mở rộng:

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

Kiểm tra bê tông:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Điều này cho phép bạn trích xuất nhiều hơn chỉ @ActiveProfileschú thích. Bạn cũng có thể hình dung các lớp cơ sở chuyên biệt hơn cho các loại thử nghiệm tích hợp khác nhau, ví dụ như lớp truy cập dữ liệu so với lớp dịch vụ hoặc cho các chuyên ngành chức năng (chung @Beforehoặc @Aftercác phương pháp, v.v.).


43

Bạn có thể đặt một tệp application.properties trong thư mục test / resources của mình. Bạn đã đặt

spring.profiles.active=test

Đây là loại cấu hình thử nghiệm mặc định trong khi chạy thử nghiệm.


Tôi sử dụng mục nhập này trong hộp kiểm thử của mình nếu tôi muốn tránh đặt @ActiveProfiles ("kiểm tra"). Nó không làm việc cho bạn?
Compito

36
Nếu tôi tạo src/test/resources/application.propertiestệp, src/main/resources/application.propertiesnội dung sẽ bị bỏ qua khi chạy thử nghiệm.
ciastek

6
@ciastek Bạn có thể thêm application-test.propertiesđể kiểm tra và chỉ ghi đè các thuộc tính bạn cần.
Người

3
@Advicer không được chọn trừ khi các thuộc tính mặc định chỉ định spring.profiles.active=testnhư câu trả lời cho biết.
OrangeDog

4
@OrangeDog chính xác - có thể bạn có thể sử dụng cấu hình 'mặc định' đang hoạt động theo mặc định. Vì vậy, bạn có thể thêm một dòng như vậy trong test / resources / application-default.properties (tất nhiên trừ khi bạn đã có tệp src / main / application-default.properties :-)
joensson

16

Một cách so sánh để làm điều đó (Trên thực tế, một tweek nhỏ đối với câu trả lời ban đầu của @ Compito):

  1. Đặt spring.profiles.active=testtrong test/resources/application-default.properties.
  2. Thêm test/resources/application-test.propertiesđể kiểm tra và chỉ ghi đè các thuộc tính bạn cần.

2
Nó có nghĩa là mặc định application.propertiestrong classpath cũng được phân tích cú pháp, sau test/resources/application-default.propertiesđó, vì "kiểm tra" hồ sơ được phát hiện, test/resources/application-test.propertiesnên nó sẽ được phân tích cú pháp? Nếu không, nó sẽ không giải quyết được vấn đề của @ ciastek như đã nhận xét trong câu trả lời của @ Compito .
anddero

8

Nếu bạn sử dụng maven, bạn có thể thêm cái này trong 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>
        ...

Sau đó, maven sẽ chạy các bài kiểm tra tích hợp của bạn (* IT.java) bằng cách sử dụng arugument này và IntelliJ cũng sẽ bắt đầu với cấu hình này được kích hoạt - vì vậy bạn có thể chỉ định tất cả các thuộc tính bên trong

application-test.yml

và bạn không cần thuộc tính "-default".


Làm việc cho tôi, nhưng phải thêm cấu hình để plugin chắc chắn cùng với an toàn dự phòng.
Mohammed Atif

5

Trong trường hợp của tôi, tôi có ứng dụng. Các quyền khác nhau tùy thuộc vào môi trường, chẳng hạn như:

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

và application.properties chứa thuộc tính spring.profiles.active để chọn tệp thích hợp.

Đối với các bài kiểm tra tích hợp của mình, tôi đã tạo một application-test.propertiestệp mới bên trong test/resourcesvà với @TestPropertySource({ "/application-test.properties" })chú thích, đây là tệp chịu trách nhiệm chọn ứng dụng. Các tính năng tôi muốn tùy thuộc vào nhu cầu của tôi cho các bài kiểm tra đó


Bạn nên sử dụng @ActiveProfiles, không @TestPropertySource.
OrangeDog

Tôi nghĩ không phiền khi sử dụng @TestPropertiesSource. Đó cũng là cách để tải cấu hình giữa cấu hình kiểm tra cấu hình.
đậu nành

5

Để kích hoạt hồ sơ "thử nghiệm", hãy viết trong build.gradle của bạn:

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

4

Một cách lập trình khác để làm điều đó:

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

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

Nó hoạt động tuyệt vời.


4

Bạn có thể đưa các thuộc tính thử nghiệm cụ thể của mình vào src/test/resources/config/application.properties.

Các thuộc tính được xác định trong tệp này sẽ ghi đè các thuộc tính được xác định trong src/main/resources/application.propertiesquá trình thử nghiệm.

Để biết thêm thông tin về lý do tại sao hoạt động này, hãy xem tài liệu về Spring Boots .


Nhiều ý kiến ​​hay ở đây hữu ích cho nhiều trường hợp. Câu trả lời IMHO @Matze là câu trả lời ngắn gọn và dễ hiểu nhất cho câu hỏi này, Không cần hồ sơ, Không cần sửa đổi mã kiểm tra ... Ngoài ra, việc ghi nhật ký cũng rõ ràng hơn (rất khó hiểu trong trường hợp của tôi là Spring ghi nhật ký bằng phương ngữ: org.hibernate.dialect.PostgreSQL93Dialect. khi thử nghiệm của tôi, rất may, sử dụng cơ sở dữ liệu H2 thử nghiệm thay thế).
Raymond Naseef

1

Nếu bạn chỉ muốn đặt / sử dụng cấu hình mặc định tại thời điểm tạo thông qua maven thì hãy chuyển đối số -Dspring.profiles.active=test Giống như

mvn clean install -Dspring.profiles.active = dev


0

Thêm spring.profiles.active=testsvào tập tin application.properties của bạn, bạn có thể thêm nhiều thuộc tính tập tin trong ứng dụng khởi động mùa xuân của bạn như application-stage.properties, application-prod.propertiesvv Và bạn có thể chỉ định trong application.properties của bạn tập tin trong khi tập tin để tham khảo bằng cách thêm spring.profiles.active=stagehoặcspring.profiles.active=prod

bạn cũng có thể vượt qua hồ sơ tại thời điểm chạy ứng dụng khởi động mùa xuân bằng cách cung cấp lệnh:

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

Theo tên hồ sơ, tệp thuộc tính được chọn, trong trường hợp trên, thông qua hồ sơ localxem xét application-local.propertiestệp

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.