Przeglądam przepływ stosu od kilku dni, próbując znaleźć sposób na ponowne uruchomienie całej klasy testowej, a nie tylko @Test
krok. Wielu twierdzi, że nie jest to obsługiwane w TestNG i IRetryAnalyzer
chociaż niektórzy opublikowali obejścia, to tak naprawdę nie działa. Czy ktoś to zrobił? Aby wyjaśnić powody, aby uniknąć odpowiedzi, które mówią, że nie jest to celowo obsługiwane: TestNG to narzędzie nie tylko dla programistów. Znaczenie to jest również używane z testerów SW do testowania e2e. Testy E2e mogą zawierać kroki, które zależą od poprzedniego. Więc tak, należy ponownie uruchomić całą klasę testową, a nie proste @Test
, co można łatwo zrobić za pomocą IRetryAnalyzer
.
Przykładem tego, co chcę osiągnąć, jest:
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"));
}
}
Powiedzmy, że to się testStep_2
nie powiedzie, chcę ponownie uruchomić class DemoTest
i nie tylkotestStep_2
źródło
Odpowiedzi:
W porządku, wiem, że prawdopodobnie potrzebujesz prostej właściwości, którą możesz określić w swojej @BeforeClass lub coś w tym rodzaju, ale może być konieczne poczekanie na jej wdrożenie. Przynajmniej nie mogłem tego znaleźć.
Poniższe rzeczy są brzydkie jak diabli, ale myślę, że to działa, przynajmniej na małą skalę, pozostaje sprawdzić, jak się zachowuje w bardziej złożonych scenariuszach. Być może z czasem można to zmienić w coś lepszego.
Okej, więc stworzyłem klasę testową podobną do twojej:
Mam
Listener
klasę super w przypadku, gdybym chciał rozszerzyć ją na inne klasy, ale równie dobrze możesz ustawić słuchacza w klasie testowej.Trzy z 4 powyższych metod mają
RetryAnalyzer
. Zostawiłem totestStep_4
bez niego, aby upewnić się, że to, co robię dalej, nie zakłóci reszty egzekucji. Powiedział,RetryAnalyzer
że tak naprawdę nie spróbuje ponownie (zauważ, że metoda zwracafalse
), ale wykona następujące czynności:Spowoduje to utworzenie wykonania wewnątrz Twojego wykonania. Nie będzie bałaganu w raporcie, a jak tylko skończy, będzie kontynuował główne wykonanie. Ale „spróbuje” metod w tej grupie.
Tak, wiem, wiem. Oznacza to, że będziesz wykonywać swój zestaw testów na zawsze w wiecznej pętli. Właśnie dlatego
RetryAnnotationTransformer
. W nim usuniemy RetryAnalyzer z drugiego wykonania tych testów:Teraz mamy ostatni z naszych problemów. Nasz oryginalny zestaw testów nic nie wie o tamtym wykonaniu „ponawiania”. Tutaj robi się naprawdę brzydko. Musimy powiedzieć naszemu reporterowi, co się właśnie wydarzyło. I to jest część, którą zachęcam do poprawy. Brakuje mi czasu na zrobienie czegoś ładniejszego, ale jeśli będę mógł, w pewnym momencie będę go edytować.
Najpierw musimy wiedzieć, czy wykonanie ponownej próby TestNG zakończyło się powodzeniem. Prawdopodobnie istnieje milion sposobów na zrobienie tego lepiej, ale na razie to działa. Skonfigurowałem odbiornik tylko do ponownej realizacji. Możesz to zobaczyć
TestRetry
powyżej i składa się z następujących elementów:Teraz nasłuchujący pakietu głównego, ten, który widziałeś powyżej w superklasie
TestConfig
, sprawdzi, czy uruchomienie się odbyło i czy poszło dobrze, i zaktualizuje raport:Raport powinien pokazywać teraz 3 testy zakończone pomyślnie (podczas ponownej próby) i jeden nieudany, ponieważ nie był częścią pozostałych 3 testów:
Wiem, że nie jest to, czego szukasz, ale pomagam ci, dopóki nie dodadzą funkcjonalności do TestNG.
źródło