web-dev-qa-db-fra.com

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

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 configuration séparée pour différents environnements. Une des manières que j'utilise cette fonctionnalité est de configurer la base de données de tests pour qu'elle soit utilisée par les tests d'intégration. Je me demande toutefois s'il est nécessaire de créer mon propre "test" de profil et de l'activer explicitement dans chaque fichier de test. En ce moment je le fais de la manière suivante:

  1. Créez application-test.properties dans src/main/resources
  2. Ecrivez là config spécifique au test (juste le nom de la base de données pour le moment)
  3. Dans chaque fichier de test incluent:

    @ActiveProfiles("test")
    

Y a-t-il un moyen plus intelligent/concis? Par exemple, un profil de test par défaut?

Edit 1: Cette question concerne Spring-Boot 1.4.1

59
Piotr Zakrzewski

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 @SpringBootTest et @ActiveProfiles("test"). Vous avez donc toujours besoin du profil dédié, mais évitez de disperser la définition du profil dans tous vos tests.

Cette annotation utilisera par défaut le profil test et vous pourrez 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"};
}
67
Mathias Dpunkt

Pour ce faire, vous pouvez également définir une classe de test (abstraite) de base que vos classes de test réelles étendront:

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

Test concret:

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’annotation @ActiveProfiles. 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 les spécialités fonctionnelles (méthodes @Before ou @After communes, etc.).

40
Pierre Henry

Vous pouvez placer un fichier application.properties dans votre dossier test/resources. Là vous définissez

spring.profiles.active=test

C'est un peu un profil de test par défaut lors de l'exécution de tests.

29
Compito

Dans mon cas, j'ai différentes application.properties selon 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 fichier application-test.properties à l'intérieur de test/resources et avec l'annotation @TestPropertySource({ "/application-test.properties" }), il s'agit du fichier chargé de sélectionner le fichier application.properties souhaité en fonction de mes besoins. pour ces tests

4
Eduardo

Une manière délarante de le faire (en fait, une petite contribution à la réponse originale de @ Compito):

  1. Définissez spring.profiles.active=test dans test/resources/application-default.properties.
  2. Ajoutez test/resources/application-test.properties pour les tests et remplacez uniquement les propriétés dont vous avez besoin.
4
JohnW

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

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

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.

2
Valtoni Boaventura

Si vous utilisez maven, vous pouvez ajouter ceci 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 doit exécuter vos tests d’intégration (* IT.Java) en utilisant cet argument, et IntelliJ commencera également avec ce profil activé - vous pourrez ainsi 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".

1
Bojan Vukasovic

Ajoutez _spring.profiles.active=tests_ dans votre fichier application.properties, vous pouvez ajouter plusieurs fichiers de propriétés dans votre application de démarrage telle que _application-stage.properties_, _application-prod.properties_, etc. Vous pouvez également spécifier dans votre fichier application.properties fichier à référencer en ajoutant _spring.profiles.active=stage_ ou _spring.profiles.active=prod_

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

_Java -jar_-Dspring.profiles.active=local _build/libs/turtle-rnr-0.0.1-SNAPSHOT.jar_

Selon le nom du profil, le fichier de propriétés est récupéré. Dans le cas ci-dessus, passez le profil local considérez le fichier _application-local.properties_.

0
Bishal Jaiswal