web-dev-qa-db-fra.com

Lorsque j'utilise @Parameterized de JUnit, puis-je exécuter certains tests une seule fois

J'utilise @Parameterized dans de nombreux cas pour exécuter des tests sur un certain nombre de permutations. Cela fonctionne très bien et maintient le code de test lui-même simple et propre.

Cependant, parfois, j'aimerais que certaines des méthodes de test ne s'exécutent qu'une seule fois car elles n'utilisent pas les paramètres. Existe-t-il un moyen avec JUnit de marquer la méthode de test comme "singleton" ou "run-once"?

Remarque: cela ne concerne pas l'exécution de tests uniques dans Eclipse, je sais comment le faire :)

32
centic

Vous pouvez associer un nombre illimité de classes de test à exécuter ensemble à l'aide d'une suite. De cette façon, tous les tests sont exécutés lorsque vous testez votre classe et vous pouvez mélanger différents lanceurs de test.

  1. Créer une suite de tests associée à la classe que vous testez
  2. Ajouter une référence à la classe de test paramétrée
  3. Ajoutez la ou les autres classes contenant des tests non paramétrés.

    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...
    }
    
10
daver

Vous pouvez structurer votre test avec le coureur fermé .

@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() {
            ...
        }
    }
}
67
Stefan Birkner

Avant de connaître l'approche "@RunWith (Enclosed.class)", j'ai utilisé la solution (similaire) suivante, avec des classes internes étendant la classe externe. Je continue à utiliser cette structure parce que j'aime que les tests soient au même endroit et partagent certaines propriétés et méthodes et les choses me semblent plus claires. Ensuite, en utilisant Eclipse, dans ma configuration d'exécution, je choisis cette option "Exécuter tous les tests dans le projet, le package ou le dossier source sélectionné" et tous ces tests seront effectués en un seul clic.

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);
        }
    }
}
1
PFROLIM

il existe un certain nombre de plugins junit qui vous donnent plus de fonctionnalités/puissance concernant les tests paramétrés. vérifiez zohhak, junit-parames et junit-dataprovider. ils vous permettent de mélanger des tests junit paramétrés et simples

1
piotrek