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

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"};
}

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.).


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.


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.

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".


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


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'
    }

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.


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 .


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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.