Найти в Дзене

Как настроить перезапуск упавших тестов в Intellij IDEA JAVA? Часть 2.

Оглавление

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

Метод перезапуска тестов

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

-2

Вспомним строку запуска тестов из командной строки, она выглядит следующим образом.

mvn test -Dtest="NameClass#NameMethod"

Теперь нам нужно точно такую же строку сохранить в файл, только добавив название класса и метода.

  • NameClass = ReadProp("src/test/resources/my.properties", "className")
  • NameMethod = ReadProp("src/test/resources/my.properties", "methodName")

Давайте же подставим эти переменные в нашу строку запуска теста.

String runTest = "mvn test -Dtest=\""+ReadProp("src/test/resources/my.properties", "className")+"#"+ReadProp("src/test/resources/my.properties", "methodName")+"\"";
-3

Создадим новый файл, в который мы и будем записывать нашу строку

bat - это расширение файлов для Windows, означает чтобы этот файл открывался в командной строке.
sh - такое расширение будет на Linux, но об этом чуть позже.

Из статьей по работе с файлами, мы уже умеем записывать разными способами наш текст.

Возьмём к примеру данный способ

Charset charset = StandardCharsets.UTF_8;
Path path = Paths.get("src/test/resources/RebaseTestLocal.bat");
byte[] bytes = runTest.getBytes(charset);
Files.write(path, bytes);
-4

Здесь мы берём путь, до нашего файла - src/test/resources/RebaseTestLocal.bat и сохраняем в него наш текст runTest.

На данном этапе мы можем уже добавить наш метод в тест листнер и запустить заведомо ошибочный тест.

-5

И как видим, всё работает!

-6

Перезапуск упавшего теста

Мы только записали строку запуска упавшего теста, нам его ещё нужно запустить. Для этого нам поможет следующая библиотека

Runtime.getRuntime().exec("src/test/resources/RebaseTestLocal.bat /C start");

Она запускает файл через командную строку.

На данном этапе казалось бы всё уже готово и тест действительно перезапустится, но у нас перезапустится опять тест, который упадёт и цикл будет продолжаться бесконечно.

Поэтому нам нужно задать какое то условие, которое позволит нам запустить тест всего лишь 1 раз.

Создадим пару переменных для нашего метода в абстрактном классе. эти переменные доступны во всем проекте, это важно.

-7

Логика будет следующая:

  • Мы запускаем тест
  • В это время у нас записывается название метода и класса
  • Мы перед запуском содержимого теста, запишем в созданную переменную StrRebase название метода теста. То есть не значение methodName, а именно чтобы название переменной было = названию метода.
  • Но так как у нас нет такой переменной, то StrRebase будет равняться null
  • Если StrRebase = null, то мы как раз создаём переменную - название метода со значением 0
  • Только здесь у нас происходит инициализация содержимого теста и наш тест падает
  • Запускаются действия после упавшего теста, в частности наш метод, Но наш метод запустится только в том случае, если переменная "название метода со значением 0" равняется 0.
  • Запускается метод и записывается значение "название метода со значением 1"
  • Когда наш тест запускается повторный раз у нас не запустится этот же метод.

Согласен звучит очень трудно и запутано, сейчас покажу на примере

Готовый пример

  • Мы перед запуском содержимого теста, запишем в созданную переменную StrRebase название метода теста. То есть не значение methodName, а именно чтобы название переменной было = названию метода.
StrRebase = ReadProp("src/test/resources/my.properties", ReadProp("src/test/resources/my.properties", "methodName"));

То есть StrRebase = (Путь до переменной, название переменной)

Название переменной = ReadProp("src/test/resources/my.properties", "methodName")

  • Если StrRebase = null, то мы как раз создаём переменную - название метода со значением 0
if (TextUtils.isEmpty(StrRebase)) {
InputProp("src/test/resources/my.properties", ReadProp("src/test/resources/my.properties", "methodName"), "0");
}
-8
  • Запускаются действия после упавшего теста, в частности наш метод, Но наш метод запустится только в том случае, если переменная "название метода со значением 0" равняется 0.
//Если тест упал то пробуем запустить его ещё раз
if (ReadProp("src/test/resources/my.properties", ReadProp("src/test/resources/my.properties", "methodName")).equals("0")) {
}
  • Запускается метод и записывается значение "название метода со значением 1"
InputProp("src/test/resources/my.properties", ReadProp("src/test/resources/my.properties", "methodName"), "1");
RebaseTests();
-9

Таким образом мы запустим наш тест 2 раза, и избавимся от бесконечного цикла.

В следующей статье расскажу как добавить ещё немного в наш проект, чтобы данный способ работал ещё и на Linux.

Если у вас есть вопросы или вы просто хотите стать частью команды тестировщиков, то переходи в ТГ канал, где можем пообщаться с единомышленниками и найти много интересных и полезных знаний!Также если вам нужна индивидуальная консультация, менторство и помощь в создании проекта пишите в ТГ канал!

Обучение тестированию