Perfil padrão do Spring-boot para testes de integração

97

Spring-boot utiliza perfis Spring ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ) que permitem, por exemplo, ter configurações separadas para ambientes diferentes. Uma maneira de usar esse recurso é configurar o banco de dados de teste a ser usado pelos testes de integração. Eu me pergunto, no entanto, é necessário criar meu próprio perfil de 'teste' e ativar explicitamente esse perfil em cada arquivo de teste? No momento, faço isso da seguinte maneira:

  1. Crie application-test.properties dentro de src / main / resources
  2. Grave a configuração específica do teste lá (apenas o nome do banco de dados por enquanto)
  3. Em cada arquivo de teste, inclua:

    @ActiveProfiles("test")
    

Existe uma maneira mais inteligente / mais concisa? Por exemplo, um perfil de teste padrão?

Edição 1: Esta questão pertence ao Spring-Boot 1.4.1

Piotr Zakrzewski
fonte

Respostas:

97

Pelo que eu sei, não há nada abordando diretamente sua solicitação - mas posso sugerir uma proposta que pode ajudar:

Você pode usar sua própria anotação de teste, que é uma metanotação que compreende @SpringBootTeste @ActiveProfiles("test"). Portanto, você ainda precisa do perfil dedicado, mas evite espalhar a definição do perfil por todo o teste.

Esta anotação será padronizada para o perfil teste você pode substituir o perfil usando a metanotação.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringBootTest
@ActiveProfiles
public @interface MyApplicationTest {
  @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
}
Mathias Dpunkt
fonte
1
Como alguém usa isso para declarar vários perfis ativos a serem usados ​​pela anotação?
payne de
Correção simples e limpa.
Vignesh
55

Outra maneira de fazer isso é definir uma classe de teste base (abstrata) que suas classes de teste reais irão estender:

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

Teste de concreto:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Isso permite que você extraia mais do que apenas a @ActiveProfilesanotação. Você também pode imaginar classes base mais especializadas para diferentes tipos de testes de integração, por exemplo, camada de acesso a dados versus camada de serviço, ou para especialidades funcionais (comuns @Beforeou @Aftermétodos, etc.).

Pierre Henry
fonte
44

Você pode colocar um arquivo application.properties em sua pasta de teste / recursos. Lá você define

spring.profiles.active=test

Este é um tipo de perfil de teste padrão durante a execução de testes.

Compito
fonte
Eu uso esta entrada em meus casos de teste se quiser evitar definir @ActiveProfiles ("teste"). Não funciona para você?
Compito
38
Se eu criar um src/test/resources/application.propertiesarquivo, o src/main/resources/application.propertiesconteúdo será ignorado durante a execução de testes.
ciastek
6
@ciastek Você pode adicionar application-test.propertiespara testes e substituir apenas as propriedades de que precisa.
Conselheiro de
4
@Advicer que não é selecionado a menos que as propriedades padrão especifiquem spring.profiles.active=testcomo a resposta diz.
OrangeDog
4
@OrangeDog exatamente - talvez você possa usar o perfil 'padrão' que está ativo por padrão. Portanto, você poderia adicionar essa linha em test / resources / application-default.properties (a menos que você já tenha um arquivo src / main / application-default.properties :-)
joensson
16

Uma maneira delarativa de fazer isso (na verdade, um pequeno ajuste na resposta original de @ Compito):

  1. Definir spring.profiles.active=testem test/resources/application-default.properties.
  2. Adicione test/resources/application-test.propertiespara testes e substitua apenas as propriedades necessárias.
JohnW
fonte
2
Isso significa que o padrão application.propertiesno caminho de classe também é analisado test/resources/application-default.propertiese, em seguida, como o "teste" do perfil é detectado, ele test/resources/application-test.propertiesé analisado? Caso contrário, isso não resolveria o problema de @ciastek, conforme comentado na resposta de @Compito .
Anddero
9

Se você usar o maven, poderá adicioná-lo em 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>
        ...

Então, maven deve executar seus testes de integração (* IT.java) usando este argumento, e também IntelliJ irá iniciar com este perfil ativado - então você pode especificar todas as propriedades dentro

application-test.yml

e você não deve precisar das propriedades "-default".

Bojan Vukasovic
fonte
Funcionou para mim, mas tive que adicionar configurações ao plug-in infalível também junto com à prova de falhas.
Mohammed Atif
6

Para ativar o perfil de "teste", escreva em seu build.gradle:

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

No meu caso, tenho diferentes application.properties dependendo do ambiente, algo como:

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

e application.properties contém uma propriedade spring.profiles.active para selecionar o arquivo apropriado.

Para meus testes de integração, criei um novo application-test.propertiesarquivo dentro test/resourcese com a @TestPropertySource({ "/application-test.properties" })anotação este é o arquivo que se encarrega de escolher o aplicativo.propriedades que desejo dependendo de minhas necessidades para esses testes

Eduardo
fonte
Você deve usar @ActiveProfiles, não @TestPropertySource.
OrangeDog
Acho que não se importa em usar @TestPropertiesSource. É também a maneira de carregar a configuração entre a configuração de teste do perfil.
soyphea
5

Você pode colocar suas propriedades específicas de teste em src/test/resources/config/application.properties.

As propriedades definidas neste arquivo substituirão aquelas definidas em src/main/resources/application.propertiesdurante o teste.

Para obter mais informações sobre por que isso funciona, dê uma olhada nos documentos do Spring Boots .

Matze
fonte
Muitas boas idéias aqui úteis para muitos casos. A resposta IMHO @Matze é a resposta mais concisa e direta para esta pergunta, Nenhum perfil necessário, nenhuma modificação de código de teste necessária ... Também o registro é mais limpo (tão confuso no meu caso que o Spring registra usando dialeto: org.hibernate.dialect.PostgreSQL93Dialect quando meu teste está, felizmente, usando o banco de dados H2 de teste).
Raymond Naseef
4

Outra maneira programada de fazer isso:

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

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

Funciona muito bem.

Valtoni Boaventura
fonte
1

Se você deseja simplesmente definir / usar o perfil padrão na hora de fazer a compilação através do maven, passe o argumento -Dspring.profiles.active=test Assim como

mvn clean install -Dspring.profiles.active = dev

Rajan Mishra
fonte
0

Adicione spring.profiles.active=testsem seu arquivo application.properties, você pode adicionar o arquivo de propriedades múltiplas em seu aplicativo de inicialização primavera como application-stage.properties, application-prod.properties, etc. E você pode especificar em seus application.properties arquivo enquanto arquivo para se referir ao adicionar spring.profiles.active=stageouspring.profiles.active=prod

você também pode passar o perfil no momento em que executa o aplicativo Spring Boot, fornecendo o comando:

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

De acordo com o nome do perfil, o arquivo de propriedades é coletado, no caso anterior, o perfil de passagem localconsidera o application-local.propertiesarquivo

Bishal Jaiswal
fonte