Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Как принудительно "успешно" завершить выполняемый тест в Java?

execution
webdriver
Теги: #<Tag:0x00007fedb7eb62c8> #<Tag:0x00007fedb7eb5fd0>

(Алексей Герасимов) #1

Проблема (Вопрос) заключается:
Столкнулся с необходимостью успешного завершения теста при выполнении условия, так чтобы все последующие методы не выполнялись и происходил переход к следующему тесту.

Это реально сделать на Java?


(Vladyslav Lopatynskyi) #2

Самый простой способ, завернуть все остальные методы в else.

или же просто выйти из метода по условию

if(true) {
            return;
        }


(Sergey Korol) #3

Если у вас возникла такая необходимость, то скорее всего вы что-то делаете не так.

Опишите ваш сценарий. Велика вероятность того, что сам тест “на всякий случай” по пути проверяет то, что не должен проверять. А следовательно, нуждается в декомпозиции. В тестах не должно быть логики в стиле:

do X
    if condition
        break
    else
        do Y

Проще и надежней написать 2 теста, которые проверяют X и Y.


(Алексей Герасимов) #4

Спасибо. Частично помогло. Подскажите, return; завершает текущий метод и переходит к следующему методу или завершает текущий тест?


(Alexandr D ) #5

return в методе завершает работу метода.
Соответственно если хотите, чтобы один return выходил из теста - оберните как писали выше все вызовы в другой метод или фанк

Типа такого:
TestRunner.Run ( () =>
{
//do stuff…
If (OHMYGOD) return;
});

Но это плохая практика. Даю гарантию, что какие-то ошибки в таких случаях будут пропускаться тестами, а тесты будут пасситься.

Лучше как, опять же, писали выше - разнести логику проверок на разные тесты.


(Алексей Герасимов) #6

Много повторяющихся подобных кусков

if (enterButton.isEnabled() & first.length() < 10 & second.length() >= 8 & autorizationerrorlogin.getText().equals(“Необходимо заполнить «Телефон».”)) {
System.out.println("Количество символов в логине = " + first.length());
System.out.println("Количество символов в пароле = " + second.length());
System.out.println("Вводимый логин: " + first + ", пароль: " + second);
System.out.println(“Проверочная фраза: " + autorizationerrorlogin.getText() + " = Необходимо заполнить «Телефон».”);
Assert.assertEquals(“неверная проверочная фраза”,“Необходимо заполнить «Телефон».”, autorizationerrorlogin.getText());
System.out.println(“Проверка на отсуствие пароля пройдена”);
return;
}


(Alexandr D ) #7

Я могу ошибаться, но по-моему в Java Assert работает так же, как в C# - если переданный в Assert метод вернул не ожидаемый результат, то у вас выкинется исключение.

Так что в текущей реализации если у вас будет ошибка, то код никогда не дойдёт до строчки
System.out.println(“Проверка на отсуствие пароля пройдена”);

А если ошибки не будет - то эта строчка не имеет смысла, т.к. проверка пройдена.

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

Многие относятся к такому подходу скептически, но я считаю что есть те проверки, которые можно выполнить в рамках одного запуска, если вы проверяете end-to-end, и фэйл которых не мешает дальнейшему выполнению кода.


(Алексей Герасимов) #8

Строчка нужна для красоты.


(Alexandr D ) #9

Ничего в этом красивого нет, это хлам в логе.
Зачем вам куча ненужной информации в логе?

Я могу понять, когда подобные строчки оформляются как шаг в репорте (например в аллюре), если не используется specflow, для читабельности репорта как story.


(Алексей Герасимов) #10

Мне так удобнее отлаживать тест.
Всем спасибо. Задача решена.


(Алексей Войнов) #11

лучше всего использовать testng там для этого существует метод dependsOnMethods = {“зависимый тест”}