Perfil predeterminado de Spring-boot para pruebas de integración


94

Spring-boot utiliza perfiles de Spring ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ) que permiten, por ejemplo, tener configuraciones separadas para diferentes entornos. Una de las formas en que uso esta función es configurar la base de datos de prueba para que la utilicen las pruebas de integración. Me pregunto, sin embargo, ¿es necesario crear mi propio perfil de 'prueba' y activar explícitamente este perfil en cada archivo de prueba? Ahora mismo lo hago de la siguiente manera:

  1. Cree application-test.properties dentro de src / main / resources
  2. Escriba la configuración específica de la prueba allí (solo el nombre de la base de datos por ahora)
  3. En cada archivo de prueba, incluya:

    @ActiveProfiles("test")
    

¿Existe una forma más inteligente / concisa? Por ejemplo, ¿un perfil de prueba predeterminado?

Edición 1: esta pregunta pertenece a Spring-Boot 1.4.1

Respuestas:


93

Hasta donde yo sé, no hay nada que responda directamente a su solicitud, pero puedo sugerir una propuesta que podría ayudar:

Puede utilizar su propia anotación de prueba, que es una metaanotación que comprende @SpringBootTesty@ActiveProfiles("test") . Por lo tanto, aún necesita el perfil dedicado, pero evite dispersar la definición del perfil en toda su prueba.

Esta anotación se testutilizará de forma predeterminada en el perfil y puede anular el perfil utilizando la meta anotación.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringBootTest
@ActiveProfiles
public @interface MyApplicationTest {
  @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
}

1
¿Cómo se usa esto para declarar múltiples perfiles activos para ser usados ​​por la anotación?
Payne

Arreglo simple y ordenado.
Vignesh

53

Otra forma de hacer esto es definir una clase de prueba base (abstracta) que extenderán sus clases de prueba reales:

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

Prueba de hormigón:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Esto le permite extraer algo más que la @ActiveProfilesanotación. También puede imaginar clases base más especializadas para diferentes tipos de pruebas de integración, por ejemplo, capa de acceso a datos frente a capa de servicio, o para especialidades funcionales (comunes @Beforeo @Aftermétodos, etc.).


43

Puede poner un archivo application.properties en su carpeta de prueba / recursos. Ahí te pones

spring.profiles.active=test

Esta es una especie de perfil de prueba predeterminado mientras se ejecutan pruebas.


Utilizo esta entrada en mis casos de prueba si quiero evitar establecer @ActiveProfiles ("prueba"). ¿No te funciona?
Compito

36
Si creo un src/test/resources/application.propertiesarchivo, el src/main/resources/application.propertiescontenido se ignora al ejecutar las pruebas.
ciastek

6
@ciastek Puede agregar application-test.propertiespara pruebas y anular solo las propiedades que necesita.
Advicer

3
@Advicer que no se recoge a menos que las propiedades predeterminadas especifiquen spring.profiles.active=testcomo dice la respuesta.
OrangeDog

4
@OrangeDog exactamente: tal vez pueda hacer uso del perfil 'predeterminado' que está activo por defecto. Por lo tanto, podría agregar una línea de este tipo en test / resources / application-default.properties (a menos que, por supuesto, ya tenga un archivo src / main / application-default.properties :-)
joensson

16

Una forma delarativa de hacer eso (de hecho, una pequeña modificación a la respuesta original de @ Compito):

  1. Establecer spring.profiles.active=testentest/resources/application-default.properties .
  2. Agregue test/resources/application-test.propertiespara pruebas y anule solo las propiedades que necesita.

2
¿Significa que el valor predeterminado application.propertiesen el classpath también se analiza, luego test/resources/application-default.propertiesy luego, debido a que se detecta la "prueba" del perfil, test/resources/application-test.propertiesse analiza? De lo contrario, no resolvería el problema de @ ciastek como se comentó en la respuesta de @ Compito .
anddero

8

Si usa maven, puede agregar esto en 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>
        ...

Luego, maven debe ejecutar sus pruebas de integración (* IT.java) usando este arugument, y también IntelliJ comenzará con este perfil activado, para que luego pueda especificar todas las propiedades dentro

application-test.yml

y no debería necesitar propiedades "-default".


Funcionó para mí, pero tuve que agregar configuraciones al complemento infalible también junto con a prueba de fallas.
Mohammed Atif

5

En mi caso tengo diferentes application.properties dependiendo del entorno, algo como:

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

y application.properties contiene una propiedad spring.profiles.active para elegir el archivo adecuado.

Para mis pruebas de integración, creé un nuevo application-test.propertiesarchivo dentro test/resourcesy con la @TestPropertySource({ "/application-test.properties" })anotación este es el archivo que se encarga de elegir la aplicación.propiedades que quiero dependiendo de mis necesidades para esas pruebas


Deberías usar @ActiveProfiles, no @TestPropertySource.
OrangeDog

Creo que no le importa usar @TestPropertiesSource. También es la forma de cargar la configuración entre la configuración de prueba de perfil.
soyphea

5

Para activar el perfil de "prueba", escriba en su build.gradle:

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

4

Otra forma programática de hacer eso:

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

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

Funciona muy bien.


4

Puede poner las propiedades específicas de su prueba en src/test/resources/config/application.properties.

Las propiedades definidas en este archivo anularán las definidas en src/main/resources/application.properties durante la prueba.

Para obtener más información sobre por qué esto funciona, consulte los documentos de Spring Boots .


Muchas buenas ideas aquí útiles para muchos casos. En mi humilde opinión, la respuesta de @Matze es la respuesta más concisa y sencilla para esta pregunta, no se necesitan perfiles, no se necesita modificar el código de prueba ... También el registro es más limpio (tan confuso en mi caso que Spring logs usando dialect: org.hibernate.dialect.PostgreSQL93Dialect cuando mi prueba es, afortunadamente, usando la base de datos de prueba H2).
Raymond Naseef

1

Si simplemente desea establecer / usar el perfil predeterminado en el momento de realizar la compilación a través de maven, pase el argumento -Dspring.profiles.active=test como

mvn clean install -Dspring.profiles.active = dev


0

Añadir spring.profiles.active=testsen su archivo application.properties, puede agregar múltiples archivos propiedades en su aplicación de arranque primaveral application-stage.properties, application-prod.properties, etc, y se puede especificar en sus application.properties archivo mientras el archivo para hacer referencia mediante la adición spring.profiles.active=stageospring.profiles.active=prod

también puede pasar el perfil en el momento de ejecutar la aplicación de arranque de primavera proporcionando el comando:

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

De acuerdo con el nombre del perfil, se recoge el archivo de propiedades, en el caso anterior, el perfil de paso localconsidera el application-local.propertiesarchivo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.