Подтвердить что ты не робот

При использовании JUnits @Parameterized, могу ли я проверить, что некоторые тесты выполняются только один раз

Во многих случаях я использую @Parameterized для запуска тестов по ряду перестановок. Это работает очень хорошо, и сам тестовый код прост и чист.

Однако иногда мне хотелось бы, чтобы некоторые из тестовых методов выполнялись только один раз, поскольку они не используют параметры, есть ли способ с JUnit пометить тестовый метод как "singleton" или "run- один раз"?

Примечание. Это не касается запуска одиночных тестов в Eclipse, я знаю, как это сделать:)

4b9b3361

Ответ 1

Вы можете связать любое количество тестовых классов для совместной работы с помощью набора. Таким образом, все тесты выполняются при тестировании вашего класса, и вы можете смешивать различные тестовые ролики.

  • Создайте тестовый пакет, связанный с тестируемым классом
  • Добавить ссылку на параметризованный тестовый класс
  • Добавить другой класс (ы), содержащий непараметризированные тесты.

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

Ответ 2

Вы можете структурировать свой тест с помощью 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() {
            ...
        }
    }
}

Ответ 3

существует несколько плагинов junit, которые дают вам еще несколько возможностей/мощности в отношении параметризованных тестов. проверьте zohhak, junit-parames и junit-dataprovider. они позволяют смешивать параметризованные и простые тесты junit

Ответ 4

До того, как я узнал об "подходе @RunWith (Enclosed.class)", я использовал следующее (подобное) решение с внутренними классами, расширяющими внешний класс. Я продолжаю использовать эту структуру, потому что мне нравится, что тесты находятся в одном месте и имеют некоторые свойства и методы, и мне кажется, что мне кажется яснее. Затем, используя Eclipse, в моей конфигурации выполнения я выбираю этот параметр "Запускать все тесты в выбранном проекте, пакете или исходной папке", и все эти тесты будут выполняться одним щелчком мыши.

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