我在许多情况下使用@Parameterized
来运行一些测试用例,这很有效并且可以使测试代码本身变得简单和清晰。
但是有时候我仍然希望有些测试方法只运行一次,因为它们没有使用参数,是否有一种方法可以在JUnit中将测试方法标记为“单例”或“只运行一次”?
注:这不涉及在Eclipse中运行单个测试的问题,我知道如何做到这一点 :)
我在许多情况下使用@Parameterized
来运行一些测试用例,这很有效并且可以使测试代码本身变得简单和清晰。
但是有时候我仍然希望有些测试方法只运行一次,因为它们没有使用参数,是否有一种方法可以在JUnit中将测试方法标记为“单例”或“只运行一次”?
注:这不涉及在Eclipse中运行单个测试的问题,我知道如何做到这一点 :)
您可以使用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() {
...
}
}
}
您可以使用测试套件将任意数量的测试类关联在一起以一起运行。这样当您测试您的类时,所有测试都会运行,并且您可以混合不同的测试运行器。
添加包含非参数化测试的其他类。
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...
}
有一些JUnit插件可以为参数化测试提供更多功能/能力。请查看zohhak、junit-parames和junit-dataprovider。它们允许您混合使用参数化测试和简单的JUnit测试。
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);
}
}
}