Domyślny profil startowy do testów integracyjnych


97

Spring-boot wykorzystuje profile Spring ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ), które pozwalają na przykład na oddzielną konfigurację dla różnych środowisk. Jednym ze sposobów korzystania z tej funkcji jest skonfigurowanie testowej bazy danych do użycia przez testy integracyjne. Zastanawiam się jednak, czy konieczne jest utworzenie własnego profilu „test” i jawna aktywacja tego profilu w każdym pliku testowym? Teraz robię to w następujący sposób:

  1. Utwórz application-test.properties w src / main / resources
  2. Napisz tam konfigurację specyficzną dla testu (na razie tylko nazwa bazy danych)
  3. W każdym pliku testowym uwzględnij:

    @ActiveProfiles("test")
    

Czy istnieje mądrzejszy / bardziej zwięzły sposób? Na przykład domyślny profil testowy?

Edycja 1: To pytanie dotyczy Spring-Boot 1.4.1

Odpowiedzi:


97

O ile wiem, nic nie odpowiada bezpośrednio na Twoją prośbę - ale mogę zasugerować propozycję, która może pomóc:

Możesz użyć własnej adnotacji testowej, która jest meta adnotacją zawierającą @SpringBootTesti @ActiveProfiles("test"). Dlatego nadal potrzebujesz dedykowanego profilu, ale unikaj rozpraszania definicji profilu w całym teście.

Ta adnotacja będzie domyślnie przypisana do profilu testi możesz nadpisać profil, używając adnotacji meta.

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

1
W jaki sposób można to wykorzystać do zadeklarowania wielu aktywnych profili, które mają być używane przez adnotację?
payne

Prosta i zgrabna poprawka.
Vignesh

55

Innym sposobem, aby to zrobić, jest zdefiniowanie podstawowej (abstrakcyjnej) klasy testowej, którą rozszerzą rzeczywiste klasy testowe:

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

Test betonu:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Pozwala to wyodrębnić więcej niż tylko @ActiveProfilesadnotację. Można również wyobrazić sobie bardziej wyspecjalizowane klasy bazowe do różnego rodzaju testów integracyjnych, np. Warstwa dostępu do danych a warstwa usługowa lub do specjalizacji funkcjonalnych (typowe @Beforelub @Aftermetody itp.).


44

Możesz umieścić plik application.properties w folderze test / resources. Tam ustawiłeś

spring.profiles.active=test

Jest to rodzaj domyślnego profilu testowego podczas przeprowadzania testów.


Używam tego wpisu w moich przypadkach testowych, jeśli chcę uniknąć ustawienia @ActiveProfiles („test”). Czy to nie działa dla Ciebie?
Compito

38
Jeśli utworzę src/test/resources/application.propertiesplik, src/main/resources/application.propertieszawartość jest ignorowana podczas uruchamiania testów.
ciastek

6
@ciastek Możesz dodać application-test.propertiesdo testów i nadpisać tylko te właściwości, których potrzebujesz.
Advicer

4
@Advicer, który nie jest odbierany, chyba że domyślne właściwości określają, spring.profiles.active=testjak mówi odpowiedź.
OrangeDog

4
@OrangeDog dokładnie - może możesz użyć profilu „default”, który jest domyślnie aktywny. Możesz więc dodać taką linię w test / resources / application-default.properties (chyba że masz już plik src / main / application-default.properties :-)
joensson

16

Delarative sposób, aby to zrobić (w rzeczywistości drobna poprawka do oryginalnej odpowiedzi @ Compito):

  1. Ustaw spring.profiles.active=testw test/resources/application-default.properties.
  2. Dodaj test/resources/application-test.propertiesdo testów i nadpisz tylko te właściwości, których potrzebujesz.

2
Czy to oznacza, że ​​wartość domyślna application.propertiesw ścieżce klas jest również analizowana, test/resources/application-default.propertiesa następnie, po wykryciu profilu „test”, test/resources/application-test.propertieszostaje przeanalizowana? W przeciwnym razie nie rozwiązałoby to problemu @ ciastek, jak skomentowano w odpowiedzi @ Compito .
anddero

9

Jeśli używasz maven, możesz dodać to w 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>
        ...

Następnie maven powinien uruchomić testy integracji (* IT.java) przy użyciu tego arkusza, a także IntelliJ uruchomi się z aktywowanym profilem - możesz więc określić wszystkie właściwości w środku

application-test.yml

i nie powinieneś potrzebować właściwości „-default”.


Pracowało dla mnie, ale musiałem dodać konfiguracje do pewnej wtyczki, a także bezpiecznej.
Mohammed Atif

6

Aby aktywować profil „testowy”, napisz w swoim build.gradle:

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

5

W moim przypadku mam różne application.properties w zależności od środowiska, na przykład:

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

a application.properties zawiera właściwość spring.profiles.active umożliwiającą wybranie odpowiedniego pliku.

Do moich testów integracji utworzyłem nowy application-test.propertiesplik wewnątrz test/resourcesi z @TestPropertySource({ "/application-test.properties" })adnotacją jest to plik, który jest odpowiedzialny za wybieranie aplikacji. Właściwości, które chcę, w zależności od moich potrzeb do tych testów


Należy użyć @ActiveProfiles, nie @TestPropertySource.
OrangeDog

Myślę, że nie ma nic przeciwko używaniu @TestPropertiesSource. Jest to również sposób na załadowanie konfiguracji między konfiguracją testu profilu.
soja

5

Możesz umieścić właściwości specyficzne dla testu w src/test/resources/config/application.properties.

Właściwości zdefiniowane w tym pliku zastąpią właściwości zdefiniowane w src/main/resources/application.propertiespodczas testowania.

Więcej informacji na temat tego, dlaczego to działa, można znaleźć w dokumentacji Spring Boots .


Wiele dobrych pomysłów przydatnych w wielu przypadkach. Odpowiedź IMHO @Matze jest najbardziej zwięzłą i prostą odpowiedzią na to pytanie, nie potrzeba żadnych profili, nie wymaga modyfikowania kodu testowego ... Również logowanie jest czystsze (tak zagmatwane w moim przypadku, że Spring logs Using dialect: org.hibernate.dialect.PostgreSQL93Dialect kiedy na szczęście mój test używa testowej bazy danych H2).
Raymond Naseef

4

Inny programowy sposób na zrobienie tego:

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

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

Działa świetnie.


1

Jeśli chcesz po prostu ustawić / użyć domyślnego profilu w momencie tworzenia kompilacji przez maven, przekaż argument -Dspring.profiles.active=test Tak jak

mvn clean install -Dspring.profiles.active = dev


0

Dodaj spring.profiles.active=testsw pliku application.properties, można dodać wiele plików właściwości w aplikacji rozruchowej jak sprężyny application-stage.properties, application-prod.propertiesitp I można określić w swoim application.properties plik podczas plik odnieść poprzez dodanie spring.profiles.active=stagelubspring.profiles.active=prod

profil można również przekazać w czasie uruchamiania aplikacji Spring Boot, wydając polecenie:

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

Zgodnie z nazwą profilu pobierany jest plik właściwości, w powyższym przypadku przekazanie profilu localrozważ application-local.propertiesplik

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.