Профіль за замовчуванням Spring-boot для тестів інтеграції


94

Spring-boot використовує профілі Spring ( http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-profiles.html ), які дозволяють, наприклад, мати окремі конфігурації для різних середовищ. Одним із способів використання цієї функції є налаштування бази даних тестів для використання в рамках інтеграційних тестів. Цікаво, однак, чи потрібно створювати власний "тестовий" профіль і явно активувати цей профіль у кожному тестовому файлі? Зараз я роблю це наступним чином:

  1. Створіть application-test.properties всередині src / main / resources
  2. Напишіть там тестову конфігурацію тесту (поки що лише ім’я бази даних)
  3. У кожен тестовий файл включають:

    @ActiveProfiles("test")
    

Чи є розумніший / стисліший спосіб? Наприклад, тестовий профіль за замовчуванням?

Редагування 1: Це питання стосується Spring-Boot 1.4.1

Відповіді:


94

Наскільки я знаю, нічого безпосередньо не стосується вашого запиту, але я можу запропонувати пропозицію, яка могла б допомогти:

Ви можете використовувати власну тестову анотацію, яка є метанотацією, що містить @SpringBootTestта @ActiveProfiles("test"). Отже, вам все ще потрібен спеціальний профіль, але уникайте розподілу визначення профілю по всьому вашому тесту.

Ця анотація буде встановлена ​​за замовчуванням для профілю, testі ви можете замінити її за допомогою мета-анотації.

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

1
Як це використовувати, щоб оголосити кілька активних профілів, які будуть використовуватися анотацією?
Пейн

Просте та акуратне виправлення.
Віньєш

53

Інший спосіб зробити це - визначити базовий (абстрактний) клас тесту, який будуть розширені ваші фактичні класи тесту:

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

Випробування бетону:

public class SampleSearchServiceTest extends BaseIntegrationTest{

    @Inject
    private SampleSearchService service;

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

Це дозволяє витягти більше, ніж просто @ActiveProfilesанотацію. Ви також можете уявити собі більш спеціалізовані базові класи для різних видів тестів інтеграції, наприклад, рівень доступу до даних проти сервісного рівня, або для функціональних особливостей (загальних @Beforeчи @Afterметодів тощо).


43

Ви можете помістити файл application.properties у свою папку test / resources. Там ви встановили

spring.profiles.active=test

Це свого роду профіль тесту за замовчуванням під час запуску тестів.


Я використовую цей запис у своїх тестових випадках, якщо хочу уникнути встановлення @ActiveProfiles ("тест"). Чи не працює у вас?
Compito

36
Якщо я створюю src/test/resources/application.propertiesфайл, src/main/resources/application.propertiesвміст ігнорується під час запуску тестів.
ciastek 02.03.17

6
@ciastek Ви можете додати application-test.propertiesдля тестів і замінити лише ті властивості, які вам потрібні.
Advicer

3
@Advicer, який не отримують, якщо властивості за замовчуванням не вказані, spring.profiles.active=testяк сказано у відповіді.
OrangeDog

4
@OrangeDog точно - можливо, ви можете скористатися профілем "за замовчуванням", який активний за замовчуванням. Отже, ви можете додати такий рядок у test / resources / application-default.properties (якщо, звичайно, у вас вже немає файлу src / main / application-default.properties :-)
joensson,

16

Деларативний спосіб зробити це (насправді, незначний твік до оригінальної відповіді @ Compito):

  1. Встановити spring.profiles.active=testв test/resources/application-default.properties.
  2. Додайте test/resources/application-test.propertiesдля тестів і відмініть лише ті властивості, які вам потрібні.

2
Чи означає це, що за замовчуванням application.propertiesу класі шляху також проводиться синтаксичний аналіз, тоді а, test/resources/application-default.propertiesа потім, оскільки виявляється "тест" профілю, test/resources/application-test.propertiesаналізується? В іншому випадку це не вирішить проблему @ ciastek, як прокоментовано у відповіді @ Compito .
anddero

8

Якщо ви використовуєте maven, ви можете додати це в 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>
        ...

Потім, maven повинен запустити ваші тести інтеграції (* IT.java), використовуючи цей аргумент, а також IntelliJ почне роботу з цим активованим профілем - так ви зможете вказати всі властивості всередині

application-test.yml

і вам не повинні знадобитися властивості "-default".


Працював у мене, але мені також довелося додавати конфігурації для надійного плагіна разом із безпечним.
Мохаммед Атіф

5

У моєму випадку у мене різні застосунки. Властивості залежно від середовища, щось на зразок:

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

і application.properties містить властивість spring.profiles.active для вибору відповідного файлу.

Для моїх тестів інтеграції я створив новий application-test.propertiesфайл всередині, test/resourcesі з @TestPropertySource({ "/application-test.properties" })анотацією це файл, який відповідає за вибір програми. Властивості, які я хочу, залежно від моїх потреб у цих тестах


Вам слід використовувати @ActiveProfiles, ні @TestPropertySource.
OrangeDog

Я думаю, що він не проти використовувати @TestPropertiesSource. Це також спосіб завантаження конфігурації між тестовою конфігурацією профілю.
soyphea

5

Щоб активувати "тестовий" профіль, напишіть у своєму build.gradle:

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

4

Ще один програмний спосіб зробити це:

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

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

Це чудово працює.


4

Ви можете застосувати свої специфічні властивості для тесту src/test/resources/config/application.properties.

Властивості, визначені у цьому файлі, замінять властивості, визначені src/main/resources/application.propertiesпід час тестування.

Щоб отримати докладнішу інформацію про те, чому це працює, перегляньте документи на Spring Boots .


Тут багато корисних ідей, корисних для багатьох випадків. Відповідь IMHO @Matze є найбільш стислою і прямолінійною відповіддю на це запитання, не потрібні профілі, не потрібно модифікувати тестовий код ... Також ведення журналу є чистішим (настільки заплутаним у моєму випадку, що весняні журнали використовують діалект: org.hibernate.dialect.PostgreSQL93Dialect коли мій тест, на щастя, використовує замість цього тестову базу даних H2).
Реймонд Насіф

1

Якщо ви просто хочете встановити / використовувати профіль за замовчуванням під час створення build через maven, тоді передайте аргумент -Dspring.profiles.active=test Так само, як

mvn clean install -Dspring.profiles.active = dev


0

Додайте spring.profiles.active=testsв файл application.properties, ви можете додати кілька файлів властивостей у вашому весняному додатку завантаження , як application-stage.properties, application-prod.propertiesі т.д. І ви можете вказати в вашому application.properties файл , а файл для позначення шляхом додавання spring.profiles.active=stageабоspring.profiles.active=prod

Ви також можете передати профіль під час запуску програми весняного завантаження, ввівши команду:

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

Згідно з назвою профілю, файл властивостей підбирається, у наведеному вище випадку прохідний профіль localрозгляне application-local.propertiesфайл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.