Автоматическое завершение всех интеграционных тестов при возникновении ошибки «Не удалось загрузить ApplicationContext»

#java #spring #spring-boot #integration-testing #spring-test

Вопрос:

У нас есть некоторые интеграционные тесты (написанные с использованием spring framework), которые терпят неудачу из-за исключения инициализации компонента, что в конечном итоге приводит к Failed to load ApplicationContext . Согласно моему пониманию из документов spring testing, загрузка ApplicationContext происходит на уровне класса, поэтому я сомневаюсь —

  1. После ApplicationContext сбоя (т. Е. Failed to load ApplicationContext ) Из-за исключения инициализации компонента во время запуска интеграционного тестового класса, выполняется ли ApplicationContext повторная попытка запуска (в конечном итоге будет сбой) для каждого отдельного интеграционного теста, присутствующего в этом конкретном классе интеграционных тестов?
    1. Задавая приведенный выше сценарий, поскольку мы наблюдаем огромный всплеск числа подключений к postgres при возникновении сбоя компонента, похоже, что для каждого присутствующего интеграционного теста (который в конечном итоге завершается неудачей Failed to load ApplicationContext ) в классе интеграционных тестов spring пытается создать новое соединение с postgres и не уничтожает его перед ApplicationContext сбоем. Как мы можем остановить это, пожалуйста, помогите с некоторыми предложениями.
  2. Кроме того, как только мы получим Failed to load ApplicationContext , есть ли способ программно завершить выполнение всех интеграционных тестов полностью автоматически? Если да, пожалуйста, помогите, как этого добиться? Спасибо.

Платформа тестирования — junit Spring

Обновление: используется упомянутая платформа тестирования.

Ответ №1:

В настоящее время нет способа прервать интеграционные тесты, если ApplicationContext повторно не удается загрузить.

Чтобы проголосовать за такую поддержку, пожалуйста, ознакомьтесь с этим выпуском Spring Framework .

Ответ №2:

  1. Если у вас есть несколько интеграционных тестов в тестовом классе, то он будет терпеть неудачу несколько раз.
  2. вы можете завершить все интеграционные тесты, используя свойство dependsOnGroups .



Например, у вас может быть метод для проверки наличия сбоя исключения компонента или нет, и объявить все остальные тесты зависимыми от этого метода. Но это можно сделать с помощью TestNG

 @Test(groups = { "isApplicationContextFailed" }) // you can run with simply @Test here if there is only one independent test.
public void isApplicationContextFailed() {}

@Test(dependsOnMethods = { "isApplicationContextFailed" })
public void queryTestOne() {}

@Test(dependsOnMethods = { "isApplicationContextFailed" })
public void queryTestTwo() {}
 

вы можете узнать больше из TestNG -> https://testng.org/doc/documentation-main.html#dependent-methods

Примечание: — если вы используете JUnit, есть несколько других способов сделать то же самое. Пожалуйста, обновите в этом случае.

Комментарии:

1. Привет, Нарасимха, я обновил вопрос, упомянул junit spring в качестве платформы тестирования. Пожалуйста, предложите. Спасибо.

2. Затем вы можете просто использовать аннотацию @BeforeClass в зависимом методе, который сначала проверяет сбой контекста приложения.

Ответ №3:

Если вы используете JUnit, добавьте ниже login в свои тестовые классы, он будет работать.

 public class BaseClass {

@BeforeClass
    public void isApplicationContextFailed() {
        //logic to check for application failure
    }


//continue with your test methods.
}
 

Чтобы предложить вам ознакомиться с приведенными ниже ссылками, чтобы получить подробную информацию.

https://junit.org/junit4/javadoc/4.13/org/junit/BeforeClass.html

https://howtodoinjava.com/testng/testng-before-and-after-annotations/