Profil default boot musim semi untuk pengujian integrasi

94

Spring-boot menggunakan profil Spring ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ) yang memungkinkan misalnya untuk memiliki konfigurasi terpisah untuk lingkungan yang berbeda. Salah satu cara saya menggunakan fitur ini adalah dengan mengkonfigurasi database pengujian yang akan digunakan oleh pengujian integrasi. Namun saya bertanya-tanya apakah perlu membuat 'tes' profil saya sendiri dan secara eksplisit mengaktifkan profil ini di setiap file pengujian? Sekarang saya melakukannya dengan cara berikut:

  1. Buat application-test.properties di dalam src / main / resources
  2. Tuliskan konfigurasi khusus pengujian di sana (hanya nama database untuk saat ini)
  3. Di setiap file pengujian meliputi:

    @ActiveProfiles("test")
    

Apakah ada cara yang lebih cerdas / lebih ringkas? Misalnya profil uji default?

Sunting 1: Pertanyaan ini berkaitan dengan Spring-Boot 1.4.1

Piotr Zakrzewski
sumber

Jawaban:

93

Sejauh yang saya tahu tidak ada yang secara langsung menangani permintaan Anda - tetapi saya dapat menyarankan proposal yang dapat membantu:

Anda dapat menggunakan anotasi pengujian Anda sendiri yang merupakan meta anotasi yang terdiri dari @SpringBootTestdan @ActiveProfiles("test"). Jadi, Anda masih memerlukan profil khusus tetapi hindari menyebarkan definisi profil di semua pengujian Anda.

Anotasi ini akan menjadi default untuk profil testdan Anda dapat mengganti profil menggunakan meta annotation.

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@SpringBootTest
@ActiveProfiles
public @interface MyApplicationTest {
  @AliasFor(annotation = ActiveProfiles.class, attribute = "profiles") String[] activeProfiles() default {"test"};
}
Mathias Dpunkt
sumber
1
Bagaimana seseorang menggunakan ini untuk menyatakan beberapa profil aktif yang akan digunakan oleh anotasi?
payne
Perbaikan sederhana dan rapi.
Vignesh
53

Cara lain untuk melakukannya adalah dengan menentukan kelas pengujian dasar (abstrak) yang akan diperluas oleh kelas pengujian Anda yang sebenarnya:

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

Uji beton:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Ini memungkinkan Anda mengekstrak lebih dari sekadar @ActiveProfilesanotasi. Anda juga dapat membayangkan kelas dasar yang lebih terspesialisasi untuk berbagai jenis pengujian integrasi, misalnya lapisan akses data vs lapisan layanan, atau untuk spesialisasi fungsional (umum @Beforeatau @Aftermetode, dll).

Pierre Henry
sumber
43

Anda bisa meletakkan file application.properties di folder test / resources Anda. Di sana Anda mengatur

spring.profiles.active=test

Ini adalah jenis profil pengujian default saat menjalankan pengujian.

Compito
sumber
Saya menggunakan entri ini dalam kasus pengujian saya jika saya ingin menghindari untuk menyetel @ActiveProfiles ("test"). Apakah itu tidak berhasil untuk Anda?
Compito
36
Jika saya membuat src/test/resources/application.propertiesfile, src/main/resources/application.propertieskonten diabaikan saat menjalankan pengujian.
ciastek
6
@ciastek Anda dapat menambahkan application-test.propertiesuntuk pengujian dan mengganti hanya properti yang Anda butuhkan.
Penasihat
3
@Advicer yang tidak diambil kecuali properti default ditentukan spring.profiles.active=testseperti jawaban yang dikatakan.
OrangeDog
4
@OrangeDog tepatnya - mungkin Anda dapat menggunakan profil 'default' yang aktif secara default. Jadi Anda dapat menambahkan baris seperti itu di test / resources / application-default.properties (kecuali tentu saja Anda sudah memiliki file src / main / application-default.properties :-)
joensson
16

Cara delaratif untuk melakukan itu (Faktanya, sedikit perubahan pada jawaban asli @ Compito):

  1. Set spring.profiles.active=testdi test/resources/application-default.properties.
  2. Tambahkan test/resources/application-test.propertiesuntuk pengujian dan timpa hanya properti yang Anda butuhkan.
JohnW
sumber
2
Apakah ini berarti default application.propertiesdi classpath diurai juga, lalu test/resources/application-default.propertieskemudian, karena profil "test" terdeteksi, maka test/resources/application-test.propertiesdiurai? Jika tidak, itu tidak akan menyelesaikan masalah @ ciastek seperti yang dikomentari dalam jawaban @ Compito .
Anddero
8

Jika Anda menggunakan maven, Anda dapat menambahkan ini di 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>
        ...

Kemudian, maven harus menjalankan pengujian integrasi Anda (* IT.java) menggunakan arugument ini, dan IntelliJ juga akan mulai dengan profil ini diaktifkan - sehingga Anda dapat menentukan semua properti di dalamnya

application-test.yml

dan Anda tidak perlu properti "-default".

Bojan Vukasovic
sumber
Bekerja untuk saya, tetapi harus menambahkan konfigurasi ke plugin yang pasti juga bersama dengan failafe.
Mohammed Atif
5

Dalam kasus saya, saya memiliki application.properties yang berbeda tergantung pada lingkungan, seperti:

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

dan application.properties berisi properti spring.profiles.active untuk memilih file yang tepat.

Untuk tes integrasi saya, saya membuat application-test.propertiesfile baru di dalam test/resourcesdan dengan @TestPropertySource({ "/application-test.properties" })penjelasan ini adalah file yang bertanggung jawab untuk memilih aplikasi. Properti yang saya inginkan tergantung pada kebutuhan saya untuk tes tersebut

Eduardo
sumber
Anda harus menggunakan @ActiveProfiles, bukan @TestPropertySource.
OrangeDog
Saya pikir tidak masalah untuk menggunakan @TestPropertiesSource. Ini juga merupakan cara untuk memuat konfigurasi antara konfigurasi pengujian profil.
soyphea
5

Untuk mengaktifkan profil "test", tulis di build.gradle Anda:

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

Cara lain secara terprogram untuk melakukan itu:

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

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

Ini bekerja dengan baik.

Valtoni Boaventura
sumber
4

Anda dapat memasukkan properti khusus pengujian Anda src/test/resources/config/application.properties .

Properti yang ditentukan dalam file ini akan menggantikan properti yang ditentukan di src/main/resources/application.properties selama pengujian.

Untuk informasi lebih lanjut tentang mengapa ini berhasil, lihat dokumen Spring Boots .

Matze
sumber
Banyak ide bagus di sini berguna untuk banyak kasus. Jawaban IMHO @Matze adalah jawaban yang paling ringkas dan langsung untuk pertanyaan ini, Tidak Perlu Profil, Tidak Perlu Memodifikasi Kode Tes ... Juga pencatatan lebih bersih (sangat membingungkan dalam kasus saya bahwa Spring log Menggunakan dialek: org.hibernate.dialect.PostgreSQL93Dialect ketika pengujian saya, untungnya, menggunakan database pengujian H2 sebagai gantinya).
Raymond Naseef
1

Jika Anda hanya ingin menyetel / menggunakan profil default pada saat membuat build melalui maven, teruskan argumen -Dspring.profiles.active=test Just like

mvn clean install -Dspring.profiles.active = dev

Rajan Mishra
sumber
0

Menambahkan spring.profiles.active=testsdalam file application.properties Anda, Anda dapat menambahkan beberapa file properti dalam aplikasi booting musim semi Anda seperti application-stage.properties, application-prod.properties, dll Dan Anda dapat menentukan di application.properties Anda berkas sementara berkas untuk merujuk dengan menambahkan spring.profiles.active=stageatauspring.profiles.active=prod

Anda juga dapat meneruskan profil pada saat menjalankan aplikasi boot musim semi dengan memberikan perintah:

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

Menurut nama profil file properti diambil, dalam kasus di atas profil lewat localpertimbangkan application-local.propertiesfile tersebut

Bishal Jaiswal
sumber