2011-12-08 12 views
5

Jestem nowy na scenie automatyzacji testów, więc wybacz mi, jeśli to jest głupie pytanie, ale Google zawiodło mnie tym razem. A przynajmniej wszystko, co przeczytałem, jeszcze bardziej mnie zdezorientowało.Czy istnieje odpowiednik funkcji @BeforeSuite testNG w JUnit 4?

Używam JUnit 4 i Selenium Webdriver w środowisku Eclipse. Mam kilka testów, które muszę uruchomić jako pakiet, a także indywidualnie. W chwili obecnej testy te działają prawidłowo, gdy są uruchamiane samodzielnie. Na początku testu pole wejściowe jest prezentowane testerowi/użytkownikowi, pytając najpierw, na jakim serwerze chce się przetestować (jest to zmienna łańcuchowa, która staje się częścią adresu URL) i jakiej przeglądarki chcą przetestować. W momencie uruchamiania testów w pakiecie użytkownik jest o to pytany na początku każdego testu, ponieważ oczywiście jest to zakodowane w każdej z ich metod @Before.

Jak przyjmować te wartości jeden raz i przekazywać je do każdej z metod testowych?

Więc jeśli serwer = "serwer1" i przeglądarka = "firefox", to Firefox jest przeglądarką Chcę używać selenu, a adres URL, który chcę otworzyć to http://server1.blah.com/ dla wszystkich poniższych metod testowania. Powodem, dla którego korzystałem z oddzielnych metod @Before, jest to, że wymagany adres URL jest nieco inny dla każdej metody testowej. tj. każda metoda testuje inną stronę, na przykład server1.blah.com/something i server1.blah.com/somethingElse

Testy działają dobrze, po prostu nie chcę kontynuować wprowadzania wartości, ponieważ numer testu metody w końcu będą ciche, duże.

Mogę również przekonwertować moje testy na testNG, jeśli jest łatwiejszy sposób robienia tego w testNG. Myślałem, że adnotacja @BeforeSuite może działać, ale teraz nie jestem pewien.

Wszelkie sugestie i krytykę (konstruktywną rodzaju) są bardzo cenione

Odpowiedz

0

To może mieć sens do testów grupowych tak, że zestaw testowy będzie miał ten sam kod @Before metoda, więc masz zestaw testów dla każdej z osobna .

Inną opcją może być użycie tego samego adresu bazowego dla każdego testu, ale przejdź do konkretnej strony, przechodząc selen do kliknięcia w miejscu, w którym chcesz przeprowadzić test.

1

Możesz zaadaptować rozwiązanie do ustawiania zmiennej globalnej dla zestawu w tej odpowiedzi na JUnit 4 Test invocation.

Przede wszystkim rozszerzasz Suite, aby utworzyć MySuite. Tworzy to statyczną zmienną/metodę, która jest dostępna z twoich testów. Następnie w swoich testach sprawdzasz wartość tej zmiennej. Jeśli jest ustawiony, używasz wartości. Jeśli nie, to go zdobędziesz. Pozwala to na uruchomienie jednego testu i zestawu testów, ale użytkownik zostanie zapytany tylko raz.

Więc Twój pakiet będzie wyglądać następująco:

public class MySuite extends Suite { 
    public static String url; 

    /** 
    * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code> 
    * 
    * @param klass the root class 
    * @param builder builds runners for classes in the suite 
    * @throws InitializationError 
    */ 
    public MySuite(Class<?> klass, RunnerBuilder builder) throws InitializationError { 
     this(builder, klass, getAnnotatedClasses(klass)); 
     // put your global setup here 
     MySuite.url = getUrlFromUser(); 
    } 
} 

ten byłby stosowany w Apartamencie tak:

@RunWith(MySuite.class) 
@SuiteClasses({FooTest.class, BarTest.class, BazTest.class}); 

Następnie w klasach testowych, można zrobić coś w @Before/@After lub lepiej spójrz na TestRule lub jeśli chcesz zachować zachowanie przed i po, spójrz na ExternalResource. ExternalResource wygląda następująco:

public static class FooTest { 
    private String url; 

    @Rule 
    public ExternalResource resource= new ExternalResource() { 
     @Override 
     protected void before() throws Throwable { 
      url = (MySuite.url != null) ? MySuite.url : getUrlFromUser(); 
     }; 

     @Override 
     protected void after() { 
      // if necessary 
     }; 
    }; 

    @Test 
    public void testFoo() { 
     // something which uses resource.url 
    } 
} 

Można oczywiście uzewnętrznić klasę ExternalResource i używać go z wielu zestawów testowych.

+0

Dzięki Matthew, to pomaga. Obawiam się jednak, że będę musiał zadać ci kilka okropnych pytań noob :(Najpierw linia this(builder, klass, getAnnotatedClasses(klass)); nie będzie działać, ponieważ getAnnotatedClasses (klasa ) nie jest widoczna.Po drugie nie jestem pewien, gdzie zdefiniować getUrlFromUser() .. ... Zdaję sobie sprawę, że mogę być trochę nad głową i byłbym bardzo wdzięczny za twoją cierpliwość :) – user1088166

+0

Powiedziałeś w swoim pytaniu: "Zostanie wyświetlone pole wprowadzania dla użytkownika" To byłoby getUrlFromUser, to nie naprawdę ważne, gdzie jest, ale w MySuite prawdopodobnie będzie to dobre miejsce. Co do tej (...) której wersji JUnit używasz? –

+0

OK, teraz podążam za tobą. Używam JUnit 4. Może to nie być istotne, ale początkowo stworzyłem przypadki testowe przy użyciu selen IDE, a następnie wyeksportowałem je jako JUnit 4 (WebDriver), aby pracować z nimi w czasie zaćmienia. – user1088166

1

Myślę, że główną funkcjonalnością TestNG, która przyda się tutaj, jest nie tylko @BeforeSuite, ale @DataProviders, co czyni trywialnym uruchamianie tego samego testu z innym zestawem wartości (i nie wymaga użycia statyki , które zawsze stają się obowiązkiem na drodze).

Być może zainteresuje Cię również obsługa skryptów TestNG, co sprawia, że ​​próba uruchomienia przez użytkownika wymaga wprowadzenia pewnych danych wejściowych przed rozpoczęciem testów, here is an example of what you can do with BeanShell.

+0

ładne komentarze, ale nie odpowiadają na pytanie. –

0

przypadku korzystania @RunWith(Suite.class) można dodać metody statyczne z @BeforeClass (i @AfterClass), który będzie realizowany przed (i po) całego pakietu można zdefiniować. Zobacz this question.

To oczywiście nie pomoże, jeśli odnosisz się do całego zestawu klas znalezionych dynamicznie i nie używasz Suite runner.

Powiązane problemy