2012-12-09 14 views
6

Piszę zestaw testów dla aplikacji webowej przy użyciu TestNG i Selenium WebDriver.TestNG Przeprowadź wszystkie metody klas wiele razy wstępne wykonanie @BeforeClass z dostarczonymi danymi

To, czego potrzebuję, to wielokrotne uruchamianie wszystkich metod klasy testowej dla różnych uwierzytelnionych użytkowników (dane są wyciągane w środowisku wykonawczym: z bazy danych). Muszę więc przekazać dane do klasy z dostawcą danych, który dostarcza poświadczenia wszystkich użytkowników, następnie dla każdego użytkownika muszę utworzyć sterownik sieciowy (dla czystości eksperymentu) i uwierzytelnić za pomocą dostarczonych poświadczeń w metodzie @BeforeClass. wszystkie metody klasy i sprawiają, że @AfterClass odrywa sterownik sieciowy zamykający.

Jak mogę to zrobić?

Moje próby, aby to zrobić tutaj: https://gist.github.com/4246674

Attempt1 było umieścić @Test(dataProvider="getUsersIdAndName") na klasy. To nie działa, ponieważ jak się okazało @Test(dataProvider=) na klasie nie oznacza, że ​​wszystkie metody klasy powinny być wywoływane z dostarczonymi danymi. Wynikiem było, że ta metoda nie została w ogóle wywołana, ponieważ nie ma danych do przekazania argumentów. Dostaję dziwny raport z testu, w którym ta metoda jest oznaczona jako przekazana z czasem wykonania 0 sekund. (Jest to projekt Maven otwarty w NetBeans, jeśli ma to sens.)

Czy @Test(dataProvider=) na lekcji oznacza cokolwiek?

Próba2 polegała na dodaniu obiektu dataProvider do adnotacji metody z podpisem @Test. Nie działa, ponieważ oznacza to, że metoda testowa jest wywoływana dwukrotnie podczas pojedynczego uruchomienia klasy. Powodem było to, że po raz drugi nie powiedzie się, ponieważ próbuje powtórzyć test, gdy sterownik sieci nie został ponownie zainicjowany: przeglądarka renderuje kolejną stronę.

Istnieją również wady pierwszej i drugiej próby, że logowanie samo w sobie odbywa się w metodzie testowej raczej niż w metodzie @BeforeClass, ponieważ nie wiem, w jaki sposób dostarczyć jej dane od dostawcy danych.

Próba3 była desperacką próbą połączenia @BeforeClass i @Test w jednej metodzie. Nie działa, ponieważ @BeforeClass wymaga również @Parameters, jeśli metoda z adnotacjami zawiera listę parametrów. Powoduje to, że ta metoda jest wywoływana trzy razy: po raz pierwszy jako konfiguracja klasy, gdy nie powiedzie się z powodu powyższego powodu i dwa razy z powodu dostawcy danych, gdy się to uda.

Potem okazało się, że TestNG nie zapewnia sposobem wywołania wszystkich metod klasa wielokrotnie z różnymi danymi: http://comments.gmane.org/gmane.comp.java.testng.user/864

mam dwa inne pomysły jak mogę zarchiwizować ten sam efekt.

Idea4 polega na umieszczeniu @Test(dataProvider=) dla każdej metody testowania, każda metoda przeprowadzi samodzielnie test uwierzytelnienia i testu isAuthenticated(), a następnie wykona własny test. Nieefektywny i brzydki.

Idea5, który wygląda najlepiej w przystępnej cenie, to oznaczenie za pomocą jednej metody, która będzie agregować wszystkie inne metody testowania: odbiera dane od dostawcy danych, wykonuje uwierzytelnienie przez danego użytkownika, następnie uruchamia test uwierzytelniony i wszystkie inne niezbędne testy.W tym przypadku @BeforeClass i @AfterClass konfigurują i odrywają tylko sterownik sieciowy. Takie podejście ma tę wadę, że tracę możliwość używania @BeforeMethod i @AfterMethod, ale jest to dla mnie przystępne: wygląda na to, że ich nie potrzebuję.

Czy istnieje lepszy sposób archiwizacji tego samego efektu?

Przepraszamy za długa wiadomość.

Z góry dziękuję.

Odpowiedz

8

Możesz wypróbować eksplorację Fabryki dla swoich potrzeb. Fabryka pozwoliłaby na uruchomienie wszystkich metod z adnotacją @Test klasy o różnych danych. Możesz w tym przypadku zainicjować ur webdriver w ur przedklasie. Objaśnienie: here.

+0

Dzięki. Udało mi się zrobić dokładnie to, co chciałem. Umieścił adnotację '@ Factory' na konstruktorze i sprawił, że odbiera dane od dostawcy danych. Każda instancja klasy testowej reprezentuje teraz sterownik sieciowy zalogowany jako pewien użytkownik wykonujący szereg testów. Constructor ładuje właściwości i przechowuje określone poświadczenia użytkownika w polach klasy. Metoda '@ BeforeClass' tworzy sterownik sieciowy i loguje się z zapisanymi poświadczeniami. '@ AfterClass' zamyka sterownik sieciowy. Jeśli ktoś jest zainteresowany, pełny kod jest tutaj. – yaromir

2

Dobra, pozwól, że spróbuję odpowiedzieć na twoje pytania w oparciu o moje doświadczenia z testNG i webdriverem.

P. Czy @Test (dataProvider =) w klasie oznacza coś w ogóle?
A. Nr dataProvider to adnotacja poziomu metody, a nie poziom klasy. Jak wspomniano here. Powinna to być metoda dostarczająca dane dla metody Test w formacie Object [] [].

P. Jak osiągnąć wspomniany scenariusz? (Zakładając, że zrozumiałem twój scenariusz ..)
A. Powinieneś używać @BeforeMethod zamiast @BeforeClass do tworzenia obiektu webdriver. W ten sposób można utworzyć inny obiekt WD dla każdej metody. Ponadto dataProvider może przekazywać wiele danych do metody isAuthenticated(). Jeśli chcesz przekazać plik konfiguracyjny na poziomie klasy, możesz zachować @BeforeClass z samą logiką ładowania pliku właściwości. Tak więc plik właściwości zostanie załadowany raz dla całej klasy. Oczywiście, powinieneś również użyć @AfterMethod, aby zamknąć obiekt webdriver.

+0

Dzięki za odpowiedź. Myślałem również o tym rozwiązaniu (pomysł №4), ale zdecydowałem, że jest ono nieskuteczne, ponieważ jest zbyteczne, aby utworzyć sterownik sieciowy i zalogować się przed każdą metodą testową, ponieważ najlepiej wystarczy zrobić to raz na każdy test metody w klasie. Muszę wykonać wszystkie czynności kilka razy z różnymi instancjami sterownika sieciowego zalogowanymi jako różni użytkownicy. Dzięki i tak. Mam przydatne informacje. – yaromir