Найти в Дзене

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

Продолжаем настраивать наш контур для перезапуска упавших тестов. Для чего это нужно рассказываю в прошлой статье. Мы уже добавили в прошлой статье сохранение название класса и метода нашего теста. Теперь после падения теста нам нужно чтобы он запускался повторно. Для этого напишем следующий метод. Вспомним строку запуска тестов из командной строки, она выглядит следующим образом. mvn test -Dtest="NameClass#NameMethod" Теперь нам нужно точно такую же строку сохранить в файл, только добавив название класса и метода. Давайте же подставим эти переменные в нашу строку запуска теста. String runTest = "mvn test -Dtest=\""+ReadProp("src/test/resources/my.properties", "className")+"#"+ReadProp("src/test/resources/my.properties", "methodName")+"\""; Создадим новый файл, в который мы и будем записывать нашу строку bat - это расширение файлов для Windows, означает чтобы этот файл открывался в командной строке. sh - такое расширение будет на Linux, но об этом чуть позже. Из статьей по работе с фай
Оглавление

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

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

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

-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.

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

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