Интеграционное тестирование приложений DropWizard

Я только что прочитал документацию по тестированию DropWizard и влюбился в его встроенные интегрированные возможности тестирования. TL;DR: это позволяет вашим тестам JUnit запускать экземпляры Jetty в памяти и, по сути, обслуживать ваши конечные точки API (методы ресурсов), поскольку они будут существовать в дикой природе. Это позволяет вам фактически поразить ваши конечные точки API с клиентом (против localhost) и посмотреть, как они работают/работают. Потрясающий!

Мне интересно, можно ли использовать этот DropWizardAppRule (или что-то похожее на него) для запуска/завершения моего приложения DropWizard и проверки отсутствия исключений (тестирование дыма); и

Дымовое тестирование было бы полезно, потому что может быть какое-то исключение, связанное с инициализацией, которое препятствует запуску приложения (плохой файл конфигурации и т. д.), и было бы неплохо знать об этом заранее. Аналогичным образом, дымовое тестирование при завершении работы полезно, потому что у нас может быть что-то, что не закрывается/не закрывается изящно, и может быть зависший поток, который просто не умрет, и т. д.

Также было бы неплохо провести стресс-тестирование работающего сервера в памяти и посмотреть, где он выходит из строя (возможно, выдавая OOME?).

Итак, учитывая следующий фрагмент кода:

public class IntegrationTest {
    @ClassRule
    public static final DropwizardAppRule<TestConfiguration> RULE =
        new DropwizardAppRule<TestConfiguration>(MyApp.class, resourceFilePath("my-app-config.yaml"));

    @Test
    public void shouldStartWithNoExceptions() {
        // ???
    }

    @Test
    public void stressTest10kUsers() {
        // What exceptions could I check for to see if the server pushed over after
        // 10,000 random endpoints were hit?
    }

    @Test
    public void shouldShutdownGracefully() {
        // ???
    }
}

Я спрашиваю:

  1. Как проверить запуск сервера без исключения?
  2. Как проверить, отвечает ли сервер по-прежнему и не умер (из-за стресс-тестирования)?
  3. Как мне выключить сервер и убедиться, что исключения не были выброшены или ничто не помешало корректному завершению работы?

person IAmYourFaja    schedule 14.12.2014    source источник


Ответы (1)


1.) Я думаю, вы имеете в виду исключения, которые убивают приложение DW, потому что есть некоторые разыскиваемые исключения, такие как исключения WebAppExceptions. Так что вам просто нужно проверить, работает ли ваше приложение. Если возникнет серьезная проблема, ваше приложение DW не запустится и не сможет отвечать на запросы.

Вот несколько дополнительных идей: а.) Если вы хотите протестировать внешние зависимости, тесты в jenkins или на вашей локальной машине не очень хорошая идея. Для тестирования вашего приложения в среде LIVE вы можете создать HealthChecks и проверить его с помощью клиентских инструментов curl или http. Вы должны получить некоторый json, например:

{"deadlocks":{"healthy":true},"database":{"healthy":true}}

Проверьте это из внешнего источника, например, удалите этот экземпляр DW из вашего балансировщика нагрузки, если проверка работоспособности не работает. Добавьте для всех важных вещей один Healthcheck, чтобы вы могли быть уверены, что ваше приложение работоспособно или нет.

б.) Проведите несколько тестов ресурсов после запуска приложения. Если вы получите ответ, ваше приложение DW запущено. c.) Проверьте свой журнал. Найдите уровень журнала ERROR или WARN. Если записей ноль, можно считать, что ваше приложение запустилось без исключений.

2.) Просто сделайте HTTP-запрос к вашему ресурсу ;-) Ответ означает, что ваше приложение запущено.

3.) Я использую ShutdownHooks. Там я проверяю все важные вещи, например, закрыто ли соединение с БД... Обычно можно корректно закрыть приложение.

Вы можете добавить отрезанный код в свой конструктор службы.

public YourService(){
    ...
    // In case vm shutdown
    Runtime.getRuntime().addShutdownHook(new Thread() {
        @Override
        public void run()
        {
            // what should be closed if forced shudown
            // ....

            LOG.info(String.format("--- End of ShutDownHook (%s) ---", APPLICATION_NAME));
        }
    });
    ...
}

Если это не желаемый ответ, предоставьте дополнительную информацию.

person heaphach    schedule 18.12.2014
comment
Спасибо @heaphach (+1) - я ценю помощь, но вы упускаете из виду основные моменты моего вопроса: DropWizard предоставляет этот класс для запуска экземпляров вашего сервера в памяти для целей автоматического тестирования, т.е. , внутри тестов JUnit. Это то, чего я хочу добиться, а не найти способ мониторинга производственных сред. - person IAmYourFaja; 18.12.2014
comment
Вы хотите знать, как запустить полное приложение в junit? - person heaphach; 19.12.2014
comment
Да, @heaphach, это совершенно верно (!), и это точно то, что DropWizard DropWizardAppRule утверждает, что делает. Целью этого является использование JUnit в качестве автоматизированной системы тестирования для проведения реалистичных интеграционных тестов для полнофункциональной службы. Хотя я ценю вашу помощь / интерес к моему вопросу здесь, отсутствие у вас представителя заставляет меня поверить, что вы можете быть новичком в StackOverflow. Вам следует прочитать о DropWizard и его API тестирования интеграции, чтобы вы могли лучше понять контекст моего вопроса. - person IAmYourFaja; 19.12.2014
comment
Я бы дал тот же ответ, что и @heaphach. Вы не можете перехватывать исключения, генерируемые непосредственно с точки зрения интеграционных/дымовых тестов. Потому что это для вас черный ящик, и вы можете осмотреть его только снаружи. DropwizardAppRule существует только для того, чтобы автоматизировать для вас жизненный цикл между тестами. - person Natan; 19.12.2014