Написание системных тестов в JUnit - PullRequest
1 голос
/ 13 января 2020

Предисловие

Я специально говорю о системных тестах. У нас есть довольно исчерпывающий набор юнит-тестов, некоторые из которых используют насмешки, и никуда не денутся. Предполагается, что системные тесты дополняют модульные тесты, и, таким образом, имитация не возможна.

Проблема

У меня довольно сложная система, которая взаимодействует только через события REST и события websocket. У моей команды довольно большая коллекция (исторически сложившихся) системных тестов на основе JUnit. В настоящее время я перевожу эту кодовую базу на JUnit5.

Тесты обычно состоят из @BeforeAll, в котором система запускается с указанием конфигурации c, в класс тестирования, что занимает около минуты. Тогда есть ряд независимых тестов на этой системе.

Проблема, с которой мы обычно сталкиваемся, заключается в том, что загрузка системы занимает значительное количество времени и может даже дать сбой. Можно сказать, что сама загрузка может рассматриваться как контрольный пример. JUnit обрабатывает методы жизненного цикла довольно странно - время, которое они занимают, не указано в отчете; если они терпят неудачу, это портит количество тестов; это не описательно; et c.

В настоящее время я ищу обходной путь, но то, что моя команда сделала за последние несколько лет, отчасти ортогонально основной идее JUnit (потому что это среда модульного тестирования).

Эти проблемы исчезли бы go, если бы я заменил @BeforeAll тестовым методом (назовем его @Test public void boot(){...}) и ввел бы зависимость от порядка (что довольно просто с помощью JUnit 5), которая обеспечивает boot до запуска любого другого теста.

Пока все хорошо! Это выглядит и прекрасно работает. Фактическая проблема начинается, когда тесты выполняются не сервером CI, а разработчиками, которые пытаются устранить неполадки. Когда я пытаюсь запустить один тест, boot отфильтровывается от выполнения теста, и тест не проходит.

Есть ли какое-либо решение в JUnit5? Или я должен использовать совершенно другой подход?

Я подозреваю, что может быть решение при использовании @TestTemplate, но я действительно не уверен, как действовать дальше. Также afaik, который позволил бы мне только генерировать новые именованные тесты, которые также будут отфильтрованы. Должен ли я написать собственный тестовый движок? Это не кажется убедительным.

1 Ответ

0 голосов
/ 13 января 2020

Эта более общая проблема тестирования, чем связанная с Junit5. Чтобы пропустить очень долгую загрузку, вы можете смоделировать некоторые компоненты, если это возможно. Использование загрузочной системы в качестве теста не имеет смысла, поскольку в зависимости от этого существуют другие тесты. Лучше использовать @beforeAll в этом случае, как это было раньше. Для тестирования загрузки вы можете создать отдельный тестовый класс для того, который будет работать совершенно независимо от других тестов. Другой вариант - сгруппировать этот вид теста и отделить его от простого модульного теста и запускать его только при необходимости (например, перед развертыванием на сервере CI). Это действительно зависит от конкретного варианта использования c и должен ли этот тест быть частью обычной сборки на вашем локальном компьютере.

Третий вариант - попытаться сократить время загрузки, если это возможно. Это вариант, если вы не можете использовать макеты / заглушки или исключить эти тесты из обычной сборки.

...