使用 JUnit 的 @Parameterized 时,我是否可以只进行一次 运行 一些测试
When using JUnit's @Parameterized, can I have some tests still run only once
我在很多情况下使用 @Parameterized
来 运行 测试一些排列。这非常有效,并使测试代码本身简单明了。
但是有时我希望某些测试方法仍然只 运行 一次,因为它们不使用参数,JUnit 有没有办法将测试方法标记为 "singleton" 或 "run-once"?
注意:这与 运行在 Eclipse 中进行单个测试无关,我知道该怎么做 :)
您可以使用套件将任意数量的测试 class 关联到 运行。这样当你测试你的 class 时所有的测试都是 运行 并且你可以混合不同的测试 运行ners.
- 创建与您正在测试的 class 关联的测试套件
- 添加对参数化测试的引用class
添加包含非参数化测试的其他 class(es)。
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 插件可为您提供更多 features/power 有关参数化测试的信息。检查 zohhak、junit-parames 和 junit-dataprovider。它们允许您混合参数化和简单的 junit 测试
您可以使用 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() {
...
}
}
}
在我知道“@RunWith(Enclosed.class)”方法之前,我使用了以下(类似的)解决方案,内部 classes 扩展外部 class。我一直在使用这种结构,因为我喜欢测试在同一个地方并共享一些属性和方法,而且事情对我来说似乎更清楚。然后,使用 Eclipse,在我的 运行 配置中,我选择该选项 "Run all tests in the selected project, package or source folder" 并且所有这些测试都将通过单击执行。
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);
}
}
}
我在很多情况下使用 @Parameterized
来 运行 测试一些排列。这非常有效,并使测试代码本身简单明了。
但是有时我希望某些测试方法仍然只 运行 一次,因为它们不使用参数,JUnit 有没有办法将测试方法标记为 "singleton" 或 "run-once"?
注意:这与 运行在 Eclipse 中进行单个测试无关,我知道该怎么做 :)
您可以使用套件将任意数量的测试 class 关联到 运行。这样当你测试你的 class 时所有的测试都是 运行 并且你可以混合不同的测试 运行ners.
- 创建与您正在测试的 class 关联的测试套件
- 添加对参数化测试的引用class
添加包含非参数化测试的其他 class(es)。
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 插件可为您提供更多 features/power 有关参数化测试的信息。检查 zohhak、junit-parames 和 junit-dataprovider。它们允许您混合参数化和简单的 junit 测试
您可以使用 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() {
...
}
}
}
在我知道“@RunWith(Enclosed.class)”方法之前,我使用了以下(类似的)解决方案,内部 classes 扩展外部 class。我一直在使用这种结构,因为我喜欢测试在同一个地方并共享一些属性和方法,而且事情对我来说似乎更清楚。然后,使用 Eclipse,在我的 运行 配置中,我选择该选项 "Run all tests in the selected project, package or source folder" 并且所有这些测试都将通过单击执行。
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);
}
}
}