Я просматривал stackoverflow в течение нескольких дней, пытаясь найти способ перезапустить целый тестовый класс, а не просто @Test
шаг. Многие говорят, что это не поддерживается с TestNG и IRetryAnalyzer
, хотя некоторые опубликовали обходные пути, которые на самом деле не работают. Кому-нибудь удалось это сделать? И просто чтобы выяснить причины этого, чтобы избежать ответов, которые говорят, что не поддерживается в целях: TestNG - инструмент не только для разработчиков. Это означает, что также используется тестерами SW для тестирования e2e. Тесты E2e могут иметь этапы, каждый из которых зависит от предыдущего. Так что да, допустимо перезапустить весь тестовый класс, а не простой @Test
, что легко сделать с помощью IRetryAnalyzer
.
Пример того, чего я хочу достичь:
public class DemoTest extends TestBase {
@Test(alwaysRun = true, description = "Do this")
public void testStep_1() {
driver.navigate().to("http://www.stackoverflow.com");
Assert.assertEquals(driver.getCurrentUrl().contains("stackoverflow)"));
}
@Test(alwaysRun = true, dependsOnMethods = "testStep_1", description = "Do that")
public void testStep_2() {
driver.press("button");
Assert.assertEquals(true, driver.elementIsVisible("button"));
}
@Test(alwaysRun = true, dependsOnMethods = "testStep_2", description = "Do something else")
public void testStep_3() {
driver.press("button2");
Assert.assertEquals(true, driver.elementIsVisible("button"));
}
}
Допустим, что testStep_2
не получается, я хочу перезапустить, class DemoTest
а не толькоtestStep_2
источник
Ответы:
Хорошо, я знаю, что вам, вероятно, нужно какое-то простое свойство, которое вы можете указать в своем @BeforeClass, или что-то подобное, но нам, возможно, придется подождать, пока это не будет реализовано. По крайней мере, я тоже не смог его найти.
Следующее ужасно ужасно, но я думаю, что оно делает свою работу, по крайней мере, в небольшом масштабе, осталось посмотреть, как оно ведет себя в более сложных сценариях. Может быть, со временем это может быть улучшено до чего-то лучшего.
Итак, я создал тестовый класс, похожий на ваш:
У меня есть
Listener
суперкласс на тот случай, если бы я хотел расширить его на другие классы, но вы также можете установить слушателя в своем тестовом классе.Три из 4 методов выше имеют
RetryAnalyzer
. Я оставилtestStep_4
без него, чтобы убедиться, что то, что я делаю дальше, не мешает остальной части исполнения. СказанныйRetryAnalyzer
не будет на самом деле повторять (обратите внимание, что метод возвращаетfalse
), но он сделает следующее:Это создаст исполнение внутри вашего исполнения. Он не будет связываться с отчетом, и как только он закончится, он продолжит ваше основное выполнение. Но он «попробует» методы в этой группе.
Да, я знаю, я знаю. Это означает, что вы будете выполнять свой набор тестов вечно в вечном цикле. Вот почему
RetryAnnotationTransformer
. В нем мы удалим RetryAnalyzer из второго выполнения этих тестов:Теперь у нас есть последние из наших проблем. Наш оригинальный набор тестов ничего не знает об этом «повторном» выполнении. Вот где это становится действительно ужасно. Нам нужно рассказать нашему репортеру, что только что произошло. И это та часть, которую я призываю вас улучшить. У меня не хватает времени, чтобы сделать что-то более приятное, но если я смогу, я отредактирую это в какой-то момент.
Во-первых, нам нужно знать, было ли выполнение retryTestNG успешным. Вероятно, есть миллион способов сделать это лучше, но пока это работает. Я настроил слушателя только для повторного выполнения. Вы можете видеть это
TestRetry
выше, и это состоит из следующего:Теперь слушатель основного набора, который вы видели выше в суперклассе
TestConfig
, увидит, произошел ли запуск, и прошел ли он успешно, и обновит отчет:Теперь в отчете должны быть показаны 3 теста (так как они были повторены) и один, который не прошел, потому что он не был частью 3 других тестов:
Я знаю, что это не то, что вы ищете, но помогу вам, пока они не добавят функциональность в TestNG.
источник