При использовании JUnits @Parameterized, могу ли я проверить, что некоторые тесты выполняются только один раз
Во многих случаях я использую @Parameterized
для запуска тестов по ряду перестановок. Это работает очень хорошо, и сам тестовый код прост и чист.
Однако иногда мне хотелось бы, чтобы некоторые из тестовых методов выполнялись только один раз, поскольку они не используют параметры, есть ли способ с JUnit пометить тестовый метод как "singleton" или "run- один раз"?
Примечание. Это не касается запуска одиночных тестов в Eclipse, я знаю, как это сделать:)
Ответы
Ответ 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);
}
}
}