Spring-Boot-Standardprofil für Integrationstests

89

Spring-Boot verwendet Spring-Profile ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ), die beispielsweise eine separate Konfiguration für verschiedene Umgebungen ermöglichen. Eine Möglichkeit, diese Funktion zu verwenden, besteht darin, die Testdatenbank für Integrationstests zu konfigurieren. Ich frage mich jedoch, ob es notwendig ist, mein eigenes Profil 'test' zu erstellen und dieses Profil in jeder Testdatei explizit zu aktivieren. Im Moment mache ich das folgendermaßen:

  1. Erstellen Sie application-test.properties in src / main / resources
  2. Schreiben Sie dort eine testspezifische Konfiguration (vorerst nur den Datenbanknamen)
  3. In jeder Testdatei sind enthalten:

    @ActiveProfiles("test")

Gibt es einen intelligenteren / prägnanteren Weg? Zum Beispiel ein Standardtestprofil?

Edit 1: Diese Frage bezieht sich auf Spring-Boot 1.4.1

Piotr Zakrzewski
quelle

Antworten:

87

Soweit ich weiß, geht nichts direkt auf Ihre Anfrage ein - aber ich kann einen Vorschlag vorschlagen, der helfen könnte:

Sie können Ihre eigene Testanmerkung verwenden, bei der es sich um eine Metaanmerkung handelt, die @SpringBootTestund umfasst @ActiveProfiles("test"). Sie benötigen also immer noch das dedizierte Profil, aber vermeiden Sie es, die Profildefinition über Ihren gesamten Test zu verteilen.

Diese Annotation wird standardmäßig auf das Profil testangewendet, und Sie können das Profil mithilfe der Meta-Annotation überschreiben.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringBootTest
@ActiveProfiles
public @interface MyApplicationTest {
  @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
}
Mathias Dpunkt
quelle
1
Wie deklariert man damit mehrere aktive Profile, die von der Annotation verwendet werden sollen?
Payne
51

Eine andere Möglichkeit, dies zu tun, besteht darin, eine (abstrakte) Basistestklasse zu definieren, die Ihre tatsächlichen Testklassen erweitern:

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

Konkrete Prüfung:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Auf diese Weise können Sie mehr als nur die @ActiveProfilesAnmerkung extrahieren . Sie können sich auch spezialisiertere Basisklassen für verschiedene Arten von Integrationstests vorstellen, z. B. Datenzugriffsschicht oder Serviceschicht oder für funktionale Besonderheiten (allgemein @Beforeoder @AfterMethoden usw.).

Pierre Henry
quelle
41

Sie können eine application.properties-Datei in Ihrem Ordner test / resources ablegen. Dort setzen Sie

spring.profiles.active=test

Dies ist eine Art Standardtestprofil beim Ausführen von Tests.

Compito
quelle
Ich verwende diesen Eintrag in meinen Testfällen, wenn ich vermeiden möchte, @ActiveProfiles ("test") festzulegen. Funktioniert es bei dir nicht?
Compito
32
Wenn ich eine src/test/resources/application.propertiesDatei erstelle , wird der src/main/resources/application.propertiesInhalt beim Ausführen von Tests ignoriert.
Ciastek
6
@ciastek Sie können application-test.propertiesfür Tests hinzufügen und nur die Eigenschaften überschreiben, die Sie benötigen.
Advicer
3
@Advicer, der nur dann abgeholt wird, wenn die Standardeigenschaften spring.profiles.active=testwie in der Antwort angegeben angegeben sind.
OrangeDog
4
@OrangeDog genau - vielleicht können Sie das Profil 'default' verwenden, das standardmäßig aktiv ist. Sie könnten also eine solche Zeile in test / resources / application-default.properties hinzufügen (es sei denn, Sie haben natürlich bereits eine src / main / application-
default.properties-
15

Ein delarativer Weg, dies zu tun (in der Tat eine kleine Woche zu @ Compitos ursprünglicher Antwort):

  1. Setzen Sie spring.profiles.active=testein test/resources/application-default.properties.
  2. Fügen Sie test/resources/application-test.propertiesfür Tests hinzu und überschreiben Sie nur die Eigenschaften, die Sie benötigen.
JohnW
quelle
2
Bedeutet dies, dass die Standardeinstellung application.propertiesim Klassenpfad ebenfalls analysiert wird, test/resources/application-default.propertiesund dann, da das Profil "Test" erkannt wird, wird die test/resources/application-test.propertiesAnalyse analysiert? Andernfalls würde das Problem von @ ciastek nicht gelöst, wie unter @ Compitos Antwort kommentiert .
Anddero
8

Wenn Sie maven verwenden, können Sie dies in pom.xml hinzufügen:

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

Dann sollte maven Ihre Integrationstests (* IT.java) mit diesem Argument ausführen, und auch IntelliJ wird mit aktiviertem Profil beginnen, sodass Sie alle darin enthaltenen Eigenschaften angeben können

application-test.yml

und Sie sollten keine "-default" -Eigenschaften benötigen.

Bojan Vukasovic
quelle
Arbeitete für mich, musste aber neben dem Fail-Safe auch Konfigurationen zum todsicheren Plugin hinzufügen.
Mohammed Atif
5

In meinem Fall habe ich je nach Umgebung unterschiedliche application.properties, etwa:

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

und application.properties enthält eine Eigenschaft spring.profiles.active, um die richtige Datei auszuwählen.

Für meine Integrationstests habe ich eine neue application-test.propertiesDatei erstellt. test/resourcesMit der @TestPropertySource({ "/application-test.properties" })Anmerkung ist dies die Datei, die für die Auswahl der gewünschten application.properties verantwortlich ist, abhängig von meinen Anforderungen für diese Tests

Eduardo
quelle
Sie sollten @ActiveProfilesnicht verwenden @TestPropertySource.
OrangeDog
Ich denke, es macht nichts aus, @TestPropertiesSource zu verwenden. Auf diese Weise können Sie auch die Konfiguration zwischen den Profiltestkonfigurationen laden.
Sojabohnen
5

Um das "Test" -Profil zu aktivieren, schreiben Sie in Ihr build.gradle:

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

Ein weiterer programmatischer Weg, dies zu tun:

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

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

Es funktioniert großartig.

Valtoni Boaventura
quelle
3

Sie können Ihre testspezifischen Eigenschaften eingeben src/test/resources/config/application.properties.

Die in dieser Datei definierten Eigenschaften überschreiben die src/main/resources/application.propertiesbeim Testen definierten Eigenschaften .

Weitere Informationen dazu, warum dies funktioniert, finden Sie in den Spring Boots-Dokumenten .

Matze
quelle
Viele gute Ideen hier nützlich für viele Fälle. Die IMHO @ Matze-Antwort ist die präziseste und einfachste Antwort auf diese Frage: Keine Profile erforderlich, kein Ändern des Testcodes erforderlich ... Auch die Protokollierung ist sauberer (in meinem Fall so verwirrend, dass Spring mit dem Dialekt protokolliert: org.hibernate.dialect.PostgreSQL93Dialect wenn mein Test zum Glück stattdessen die Test-H2-Datenbank verwendet).
Raymond Naseef
1

Wenn Sie zum Zeitpunkt der Erstellung durch Maven einfach das Standardprofil festlegen / verwenden möchten, übergeben Sie das Argument -Dspring.profiles.active=test Genau wie

mvn clean install -Dspring.profiles.active = dev

Rajan Mishra
quelle
0

Fügen Sie spring.profiles.active=testsin Ihrer Datei application.properties, können Sie mehrere Eigenschaften Datei im Frühjahr Boot - Anwendung wie hinzufügen application-stage.properties, application-prod.propertiesetc. Und Sie können in Ihrer Datei application.properties geben Sie bei der Datei zu beziehen , die durch das Hinzufügen spring.profiles.active=stageoderspring.profiles.active=prod

Sie können das Profil auch zum Zeitpunkt der Ausführung der Spring-Boot-Anwendung übergeben, indem Sie den folgenden Befehl eingeben:

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

Entsprechend dem Profilnamen wird die Eigenschaftendatei aufgenommen. Im obigen Fall wird beim Übergeben des Profils localdie application-local.propertiesDatei berücksichtigt

Bishal Jaiswal
quelle