統合テスト用のSpring-bootのデフォルトプロファイル


94

Spring-bootはSpringプロファイル(http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html)を利用します。これにより、たとえば、環境ごとに個別の構成を設定できます。この機能を使用する1つの方法は、統合テストで使用するテストデータベースを構成することです。ただし、独自のプロファイル「test」を作成し、各テストファイルでこのプロファイルを明示的にアクティブ化する必要があるのでしょうか。今、私はそれを次のようにしています:

  1. src / main / resources内にapplication-test.propertiesを作成します
  2. そこにテスト固有の構成を書き込みます(今のところデータベース名のみ)
  3. すべてのテストファイルには、次のものが含まれます。

    @ActiveProfiles("test")
    

よりスマートで簡潔な方法はありますか?たとえば、デフォルトのテストプロファイル?

編集1:この質問はSpring-Boot1.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ファイルをtest / resourcesフォルダーに置くことができます。そこに設定します

spring.profiles.active=test

これは、テスト実行中のデフォルトのテストプロファイルの一種です。


@ActiveProfiles( "test")の設定を避けたい場合は、テストケースでこのエントリを使用します。それはあなたのために働きませんか?
Compito 2016

36
src/test/resources/application.propertiesファイルを作成すると、src/main/resources/application.propertiesテストの実行時にコンテンツが無視されます。
ciastek 2017年

6
@ciastekapplication-test.propertiesテスト用に追加して、必要なプロパティのみをオーバーライドできます。
アドバイザー2018

3
spring.profiles.active=test答えが言うようにデフォルトのプロパティが指定しない限り、ピックアップされない@Advicer 。
OrangeDog

4
@OrangeDog正確に-デフォルトでアクティブになっているプロファイル「default」を利用できるかもしれません。したがって、このような行をtest / resources / application-default.propertiesに追加できます(もちろん、src / main / application-default.propertiesファイルが既にある場合を除く:
joensson19年

16

それを行うための退屈な方法(実際、@ Compitoの元の答えへのマイナーなtweek):

  1. に設定spring.profiles.active=testtest/resources/application-default.propertiesます。
  2. test/resources/application-test.propertiesテスト用に追加し、必要なプロパティのみをオーバーライドします。

2
application.propertiesクラスパスのデフォルトも解析され、次にtest/resources/application-default.propertiesプロファイル「テスト」が検出されたため、test/resources/application-test.propertiesが解析されることを意味しますか?そうしないと、@ Compitoの回答の下にコメントされているように、@ 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プラグインにも構成を追加しなければならなかった。
モハメッドアティフ

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" })注釈を付けて、これらのテストのニーズに応じて、必要なapplication.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、テスト中に。

これが機能する理由の詳細については、SpringBootsのドキュメントを参照してください。


ここにある多くの優れたアイデアは、多くの場合に役立ちます。IMHO @Matzeの回答は、この質問に対する最も簡潔でわかりやすい回答です。プロファイルは不要、テストコードの変更は不要です...また、ロギングはよりクリーンです(私の場合、Springが方言を使用してログを記録するので混乱します:org.hibernate.dialect.PostgreSQL93Dialectありがたいことに、私のテストが代わりにテストH2データベースを使用している場合)。
Raymond Naseef

1

Mavenを介してビルドを作成するときにデフォルトのプロファイルを設定/使用するだけの場合は、次の-Dspring.profiles.active=test ように引数を渡します。

mvn clean install -Dspring.profiles.active = dev


0

追加spring.profiles.active=testsあなたのようなあなたの春のブートアプリケーションで複数のプロパティファイルを追加することができ、あなたのapplication.propertiesファイルに application-stage.propertiesapplication-prod.propertiesなど、そのファイルが追加して参照する一方で、あなたのapplication.propertiesファイルで指定することができますspring.profiles.active=stagespring.profiles.active=prod

次のコマンドを指定して、SpringBootアプリケーションの実行時にプロファイルを渡すこともできます。

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

プロファイル名に従って、プロパティファイルが取得されます。上記の場合、プロファイルを渡すlocalapplication-local.propertiesファイルが考慮されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.