私が使う @Parameterized
多くの場合、多くの順列でテストを実行します。これは非常にうまく機能し、テストコード自体をシンプルかつクリーンに保ちます。
ただし、パラメータを使用しないため、テストメソッドの一部を一度だけ実行したい場合があります。JUnitでテストメソッドを「シングルトン」または「1回限り」としてマークする方法はありますか。
注:これは、Eclipseでの単一のテストの実行には関係ありません。その方法は知っています:)
スイートを使用して、任意の数のテストクラスを関連付けて一緒に実行できます。このようにして、クラスをテストするときにすべてのテストが実行され、異なるテストランナーを混在させることができます。
パラメータ化されていないテストを含む他のクラスを追加します。
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...
}
囲まれたランナー でテストを構成できます。
@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)」アプローチについて知る前に、次の(同様の)ソリューションを使用し、内部クラスが外部クラスを拡張していました。テストが同じ場所にあり、いくつかのプロパティとメソッドを共有していることが好きなので、この構造を使い続けています。次に、Eclipseを使用して、実行構成で「選択したプロジェクト、パッケージ、またはソースフォルダー内のすべてのテストを実行」オプションを選択すると、これらのテストはすべてクリック1つで実行されます。
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);
}
}
}
パラメータ化されたテストに関して、より多くの機能/パワーを提供する多くのjunitプラグインがあります。 zohhak、junit-parames、junit-dataproviderを確認してください。パラメーター化されたテストと単純なjunitテストを混在させることができます