Entegrasyon testleri için yay önyükleme varsayılan profili


94

Spring-boot , örneğin farklı ortamlar için ayrı konfigürasyona sahip olmasına izin veren Spring profillerini ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ) kullanır . Bu özelliği kullanmamın bir yolu, test veritabanını entegrasyon testleri tarafından kullanılacak şekilde yapılandırmaktır. Bununla birlikte, kendi profilimi 'test' oluşturmam ve bu profili her test dosyasında açıkça etkinleştirmem gerektiğini merak ediyorum. Şu anda bunu şu şekilde yapıyorum:

  1. Src / main / resources içinde application-test.properties oluşturun
  2. Orada teste özel yapılandırma yazın (şimdilik yalnızca veritabanı adı)
  3. Her test dosyasında şunları içerir:

    @ActiveProfiles("test")
    

Daha akıllı / daha özlü bir yol var mı? Örneğin varsayılan bir test profili?

Düzenleme 1: Bu soru Spring-Boot 1.4.1 ile ilgilidir

Yanıtlar:


93

Bildiğim kadarıyla isteğinize doğrudan hitap eden bir şey yok - ancak yardımcı olabilecek bir teklif önerebilirim:

Ve içeren bir meta ek açıklama olan kendi test notunuzu kullanabilirsiniz . Dolayısıyla, yine de özel profile ihtiyacınız var, ancak profil tanımını tüm testinize dağıtmaktan kaçının.@SpringBootTest@ActiveProfiles("test")

Bu ek açıklama varsayılan olarak testprofil için olacaktır ve meta ek açıklamayı kullanarak profili geçersiz kılabilirsiniz.

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

1
Ek açıklama tarafından kullanılacak birden çok aktif profil bildirmek için bunu nasıl kullanırız?
payne

Basit ve düzgün düzeltme.
Vignesh

53

Bunu yapmanın başka bir yolu, gerçek test sınıflarınızın genişleteceği bir temel (soyut) test sınıfı tanımlamaktır:

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

Beton testi:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Bu, yalnızca @ActiveProfilesaçıklamadan daha fazlasını çıkarmanıza olanak tanır . Ayrıca, farklı türdeki entegrasyon testleri için daha özel temel sınıflar hayal edebilirsiniz, örneğin veri erişim katmanı ile hizmet katmanı veya işlevsel özellikler (ortak @Beforeveya @Afteryöntemler vb.).


43

Test / kaynaklar klasörünüze bir application.properties dosyası koyabilirsiniz. Orada ayarladın

spring.profiles.active=test

Bu, testleri çalıştırırken bir tür varsayılan test profilidir.


@ActiveProfiles ("test") ayarlamaktan kaçınmak istersem bu girişi test olaylarımda kullanırım. Senin için çalışmıyor mu?
Compito

36
src/test/resources/application.propertiesDosya oluşturursam , src/main/resources/application.propertiestestleri çalıştırırken içerik yok sayılır.
ciastek

6
@ciastek application-test.propertiesTestler için ekleyebilir ve yalnızca ihtiyacınız olan özellikleri geçersiz kılabilirsiniz.
Advicer

3
@Advicer spring.profiles.active=test, cevabın söylediği gibi varsayılan özellikler belirtmedikçe alınmaz .
OrangeDog

4
@OrangeDog tam olarak - belki de varsayılan olarak aktif olan 'varsayılan' profilini kullanabilirsiniz. Böylece test / resources / application-default.properties içine böyle bir satır ekleyebilirsiniz (tabii ki zaten bir src / main / application-default.properties dosyanız
yoksa

16

Bunu yapmanın hassas bir yolu (Aslında, @ Compito'nun orijinal cevabına küçük bir tweek):

  1. Set spring.profiles.active=testiçinde test/resources/application-default.properties.
  2. test/resources/application-test.propertiesTestler için ekleyin ve yalnızca ihtiyacınız olan özellikleri geçersiz kılın.

2
Bu application.properties, sınıf yolundaki varsayılanın da ayrıştırıldığı anlamına mı geliyor , sonra test/resources/application-default.propertiesve sonra, profil "test" algılandığı için test/resources/application-test.propertiesayrıştırılıyor mu? Altında yorumladı olarak Aksi takdirde ciastek sorununun @ çözmek olmaz Compito cevabı @ .
anddero

8

Maven kullanıyorsanız, bunu pom.xml'ye ekleyebilirsiniz:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-failsafe-plugin</artifactId>
            <configuration>
                <argLine>-Dspring.profiles.active=test</argLine>
            </configuration>
        </plugin>
        ...

Daha sonra maven, entegrasyon testlerinizi (* IT.java) bu belgeyi kullanarak çalıştırmalıdır ve ayrıca IntelliJ bu profil etkinleştirilerek başlayacaktır - böylece içindeki tüm özellikleri belirtebilirsiniz

application-test.yml

ve "-varsayılan" özelliklere ihtiyacınız olmamalıdır.


Benim için çalıştı, ancak kesin ateşleme eklentisine başarısızlık ile birlikte konfigürasyonlar eklemek zorunda kaldı.
Muhammed Atif

5

Benim durumumda, ortama bağlı olarak farklı uygulama özelliklerine sahibim, şöyle bir şey:

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

ve application.properties, uygun dosyayı seçmek için spring.profiles.active özelliğini içerir.

Entegrasyon testlerim için application-test.propertiesiçeride yeni bir dosya oluşturdum test/resourcesve @TestPropertySource({ "/application-test.properties" })ek açıklama ile bu, bu testler için ihtiyaçlarıma bağlı olarak istediğim uygulamayı seçmekle görevli dosya.


Kullanmalısın @ActiveProfiles, değil @TestPropertySource.
OrangeDog

@TestPropertiesSource kullanmanın bir sakıncası olmadığını düşünüyorum. Bu aynı zamanda konfigürasyonu profil testi konfigürasyonu arasında yüklemenin bir yoludur.
soyphea

5

"Test" profilini etkinleştirmek için build.gradle dosyanıza yazın:

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

4

Bunu yapmanın başka bir programlı yolu:

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

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

Harika çalışıyor.


4

Teste özel özelliklerinizi src/test/resources/config/application.properties .

Bu dosyada tanımlanan özellikler, içinde tanımlananları geçersiz kılacaktır. src/main/resources/application.properties test sırasında .

Bunun neden işe yaradığı hakkında daha fazla bilgi için Spring Boots belgelerine göz atın .


Buradaki birçok iyi fikir, birçok durumda yararlıdır. IMHO @Matze yanıtı, bu soru için en kısa ve açık cevaptır, Profil Gerekmiyor, Değiştirici Test Kodu Gerekmiyor ... Ayrıca günlüğe kaydetme daha temizdir (benim durumumda Spring'in diyalekt kullanarak günlüğe kaydetmesi kafa karıştırıcı: org.hibernate.dialect.PostgreSQL93Dialect testim, şükür ki bunun yerine test H2 veritabanını kullanmak olduğunda).
Raymond Naseef

1

Yalnızca maven aracılığıyla derleme sırasında varsayılan profili ayarlamak / kullanmak istiyorsanız, argümanı -Dspring.profiles.active=test aynen iletin

mvn temiz kurulum -Dspring.profiles.active = dev


0

Ekle spring.profiles.active=testssizin application.properties dosyasında, sizin gibi bahar çizme uygulaması birden fazla özellikler dosyasını ekleyebilir application-stage.properties, application-prod.propertiesvb Ve dosya ekleyerek başvurmak için ise size application.properties dosyayı belirtebilirsiniz spring.profiles.active=stageveyaspring.profiles.active=prod

profili yaylı önyükleme uygulamasını çalıştırırken şu komutu vererek de geçebilirsiniz:

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

Profil adına göre özellikler dosyası alınır, yukarıdaki durumda profil geçişi dosyayı localdikkate alır.application-local.properties

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.