Profil par défaut Spring-boot pour les tests d'intégration

94

Spring-boot utilise des profils Spring ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ) qui permettent par exemple d'avoir une configuration séparée pour différents environnements. Une façon d'utiliser cette fonctionnalité est de configurer la base de données de test à utiliser par les tests d'intégration. Je me demande cependant est-il nécessaire de créer mon propre profil «test» et d'activer explicitement ce profil dans chaque fichier test? En ce moment, je le fais de la manière suivante:

  1. Créez application-test.properties dans src / main / resources
  2. Écrivez la configuration spécifique au test ici (juste le nom de la base de données pour le moment)
  3. Dans chaque fichier de test, incluez:

    @ActiveProfiles("test")
    

Existe-t-il une manière plus intelligente / plus concise? Par exemple, un profil de test par défaut?

Edit 1: Cette question concerne Spring-Boot 1.4.1

Piotr Zakrzewski
la source

Réponses:

93

Pour autant que je sache, rien ne répond directement à votre demande - mais je peux suggérer une proposition qui pourrait aider:

Vous pouvez utiliser votre propre annotation de test qui est une méta-annotation comprenant @SpringBootTestet @ActiveProfiles("test"). Vous avez donc toujours besoin du profil dédié, mais évitez de disperser la définition du profil sur tous vos tests.

Cette annotation sera par défaut le profil testet vous pouvez remplacer le profil à l'aide de la méta-annotation.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringBootTest
@ActiveProfiles
public @interface MyApplicationTest {
  @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
}
Mathias Dpunkt
la source
1
Comment l'utilise-t-on pour déclarer plusieurs profils actifs à utiliser par l'annotation?
payne le
Solution simple et soignée.
Vignesh
53

Une autre façon de faire est de définir une classe de test de base (abstraite) que vos classes de test réelles étendront:

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

Test de béton:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Cela vous permet d'extraire plus que l' @ActiveProfilesannotation. Vous pouvez également imaginer des classes de base plus spécialisées pour différents types de tests d'intégration, par exemple couche d'accès aux données vs couche de service, ou pour des spécialités fonctionnelles (communes @Beforeou @Afterméthodes, etc.).

Pierre Henry
la source
43

Vous pouvez placer un fichier application.properties dans votre dossier test / resources. Là tu as mis

spring.profiles.active=test

C'est une sorte de profil de test par défaut lors de l'exécution des tests.

Compito
la source
J'utilise cette entrée dans mes tests si je veux éviter de définir @ActiveProfiles ("test"). Cela ne fonctionne pas pour vous?
Compito
36
Si je crée un src/test/resources/application.propertiesfichier, le src/main/resources/application.propertiescontenu est ignoré lors de l'exécution des tests.
ciastek
6
@ciastek Vous pouvez ajouter application-test.propertiesdes tests et remplacer uniquement les propriétés dont vous avez besoin.
Advicer
3
@Advicer qui n'est pas détecté à moins que les propriétés par défaut ne spécifient spring.profiles.active=testcomme le dit la réponse.
OrangeDog
4
@OrangeDog exactement - peut-être que vous pouvez utiliser le profil «default» qui est actif par défaut. Vous pouvez donc ajouter une telle ligne dans test / resources / application-default.properties (à moins bien sûr que vous n'ayez déjà un fichier src / main / application-default.properties :-)
joensson
16

Une manière délirante de faire cela (en fait, une petite modification à la réponse originale de @ Compito):

  1. Mettre spring.profiles.active=testen test/resources/application-default.properties.
  2. Ajoutez test/resources/application-test.propertiespour les tests et remplacez uniquement les propriétés dont vous avez besoin.
JohnW
la source
2
Cela signifie-t-il que la valeur application.propertiespar défaut dans le chemin de classe est également analysée, puis test/resources/application-default.properties, puis, parce que le profil "test" est détecté, test/resources/application-test.propertiesest analysé? Sinon, cela ne résoudrait pas le problème de @ ciastek comme indiqué dans la réponse de @ Compito .
anddero le
8

Si vous utilisez maven, vous pouvez l'ajouter dans 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>
        ...

Ensuite, maven devrait exécuter vos tests d'intégration (* IT.java) en utilisant cet argument, et IntelliJ commencera également avec ce profil activé - vous pourrez alors spécifier toutes les propriétés à l'intérieur

application-test.yml

et vous ne devriez pas avoir besoin des propriétés "-default".

Bojan Vukasovic
la source
Cela a fonctionné pour moi, mais j'ai également dû ajouter des configurations au plugin infaillible avec la sécurité intégrée.
Mohammed Atif
5

Dans mon cas, j'ai différentes applications.properties en fonction de l'environnement, quelque chose comme:

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

et application.properties contient une propriété spring.profiles.active pour sélectionner le fichier approprié.

Pour mes tests d'intégration, j'ai créé un nouveau application-test.propertiesfichier à l'intérieur test/resourceset avec l' @TestPropertySource({ "/application-test.properties" })annotation c'est le fichier qui se charge de choisir l'application.properties que je veux en fonction de mes besoins pour ces tests

Eduardo
la source
Vous devriez utiliser @ActiveProfiles, non @TestPropertySource.
OrangeDog
Je pense que cela ne me dérange pas d'utiliser @TestPropertiesSource. C'est aussi le moyen de charger la configuration entre la configuration de test de profil.
soyphea
5

Pour activer le profil "test", écrivez dans votre build.gradle:

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

Une autre façon de le faire par programme:

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

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

Cela fonctionne très bien.

Valtoni Boaventura
la source
4

Vous pouvez insérer les propriétés spécifiques de votre test dans src/test/resources/config/application.properties.

Les propriétés définies dans ce fichier remplaceront celles définies dans src/main/resources/application.propertieslors du test.

Pour plus d'informations sur les raisons pour lesquelles cela fonctionne, consultez la documentation de Spring Boots .

Matze
la source
Beaucoup de bonnes idées ici utiles dans de nombreux cas. La réponse IMHO @Matze est la réponse la plus concise et la plus simple à cette question, aucun profil nécessaire, aucune modification du code de test nécessaire ... La journalisation est également plus propre (si déroutante dans mon cas que Spring logs Utilisation du dialecte: org.hibernate.dialect.PostgreSQL93Dialect quand mon test utilise, heureusement, la base de données test H2 à la place).
Raymond Naseef
1

Si vous souhaitez simplement définir / utiliser le profil par défaut au moment de la construction via maven, passez l'argument -Dspring.profiles.active=test comme

mvn clean install -Dspring.profiles.active = dev

Rajan Mishra
la source
0

Ajouter spring.profiles.active=testsdans votre fichier application.properties, vous pouvez ajouter plusieurs fichiers de propriétés dans votre application de démarrage au printemps comme application-stage.properties, application-prod.properties, etc. Et vous pouvez spécifier dans votre fichier application.properties tout fichier pour désigner en ajoutant spring.profiles.active=stageouspring.profiles.active=prod

vous pouvez également transmettre le profil au moment de l'exécution de l'application Spring Boot en fournissant la commande:

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

Selon le nom du profil, le fichier de propriétés est sélectionné, dans le cas ci-dessus, le passage du profil localconsidère le application-local.propertiesfichier

Bishal Jaiswal
la source