2015-09-25 31 views
13

Używam w wielu przypadkach @Parameterized do uruchamiania testów na wielu permutacjach. Działa to bardzo dobrze i sprawia, że ​​kod testowy jest prosty i przejrzysty.Podczas korzystania z JUnits @Parameterized, czy mogę mieć pewne testy nadal działać tylko raz

Czasem jednak chciałbym, aby niektóre z metod testowych nadal działały tylko raz, ponieważ nie używają parametrów, czy istnieje sposób, aby JUnit oznaczyć metodę testową jako "singleton" lub "run" -pewnego razu"?

Uwaga: nie dotyczy pojedynczych testów uruchomiony w Eclipse, wiem jak to zrobić :)

+3

Wygląda na to, że te testy nie powinny być w tym samym pakiecie co sparametryzowane testy. – Makoto

+2

Tak, to jedyne rozwiązanie, które przyszło mi do głowy, ale bardzo lubię mieć "powiązane" testy w jednym pakiecie, np. wszystkie testy dla jednej klasy w jednej klasie testowej ... – centic

Odpowiedz

8

można skojarzyć dowolną liczbę klas testowych uruchomić razem przy użyciu pakietu. W ten sposób wszystkie testy są przeprowadzane, gdy testujesz swoją klasę i możesz mieszać różne biegacze testowe.

  1. Tworzenie zestawu testowego związanego z klasy testowanej
  2. Dodaj odwołanie do sparametryzowanej klasy testowej
  3. Dodaj drugą klasa (-y) zawierającą non testów parametrycznych.

    import org.junit.runners.Suite; 
    import org.junit.runner.RunWith; 
    
    @RunWith(Suite.class) 
    @Suite.SuiteClasses({ParameterizedTestClass.class, UnitTests.class, MoreUnitTests.class}) 
    public class SutTestSuite{ 
        //Empty... 
    } 
    
+1

Tak, to jest prawdopodobnie to, co otrzymam, miałem nadzieję, że będzie coś takiego jak adnotacja dla pojedynczych metod testowych ... – centic

1

istnieje szereg wtyczek JUnit, które daje kilka funkcji/Power dotyczących testów parametrycznych. sprawdź zohhak, junit-parames i junit-dataprovider. pozwalają na mieszanie sparametryzowanych i prostych testów jednoczasowych.

+0

Dzięki za sugestie, te spojrzenia ciekawy! – centic

24

Można skonstruować test za pomocą Enclosed runner.

@RunWith(Enclosed.class) 
public class TestClass { 

    @RunWith(Parameterized.class) 
    public static class TheParameterizedPart { 

     @Parameters 
     public static Object[][] data() { 
      ... 
     } 

     @Test 
     public void someTest() { 
      ... 
     } 

     @Test 
     public void anotherTest() { 
      ... 
     } 
    } 

    public static class NotParameterizedPart { 
     @Test 
     public void someTest() { 
      ... 
     } 
    } 
} 
0

Przed wiedział o „@RunWith (Enclosed.class)” podejście, to stosuje się następujące rozwiązania (podobnie), rozciągających się z wewnętrznymi klas klasy zewnętrzną. Nadal używam tej struktury, ponieważ podoba mi się, że testy są w tym samym miejscu i mają pewne właściwości i metody, a rzeczy wydają mi się bardziej przejrzyste. Następnie za pomocą środowiska Eclipse wybieram opcję "Uruchom wszystkie testy w wybranym projekcie, folderze lub folderze źródłowym", a wszystkie te testy zostaną wykonane za pomocą jednego kliknięcia.

public class TestBooksDAO { 

    private static BooksDAO dao; 

    @Parameter(0) 
    public String title; 
    @Parameter(1) 
    public String author; 

    @Before 
    public void init() { 
     dao = BooksDAO.getInstancia(); 
    } 

    /** Tests that run only once. */ 
    public static class SingleTests extends TestBooksDAO { 

     @Test(timeout=10000) 
     public void testGetAll() { 
      List<Book> books = dao.getBooks(); 
      assertNotNull(books); 
      assertTrue(books.size()>0); 
     } 

     @Test(timeout=10000) 
     public void testGetNone() { 
      List<Book> books = dao.getBooks(null); 
      assertNull(books); 
     } 
    } 

    /** Tests that run for each set of parameters. */ 
    @RunWith(Parameterized.class) 
    public static class ParameterizedTests1 extends TestBooksDAO { 

     @Parameters(name = "{index}: author=\"{2}\"; title=\"{0}\";") 
     public static Collection<Object[]> values() { 
      return Arrays.asList(new Object[][] { 
       {"title1", ""}, 
       {"title2", ""}, 
       {"title3", ""}, 
       {"title4", "author1"}, 
       {"title5", "author2"}, 
      }); 
     } 

     @Test(timeout=10000) 
     public void testGetOneBook() { 
      Book book = dao.getBook(author, title); 
      assertNotNull(book); 
     } 
    } 

    /** Other parameters for different tests. */ 
    @RunWith(Parameterized.class) 
    public static class ParameterizedTests2 extends TestBooksDAO { 

     @Parameters(name = "{index}: author=\"{2}\";") 
     public static Collection<Object[]> values() { 
      return Arrays.asList(new Object[][] { 
       {"", "author1"}, 
       {"", "author2"}, 
       {"", "author3"}, 
      }); 
     } 

     @Test(timeout=10000) 
     public void testGetBookList() { 
      List<Book> books = dao.getBookByAuthor(author); 
      assertNotNull(books); 
      assertTrue(books.size()>0); 
     } 
    } 
}