web-dev-qa-db-ja.com

JUnitの@Parameterizedを使用する場合、いくつかのテストを1回だけ実行することはできますか

私が使う @Parameterized多くの場合、多くの順列でテストを実行します。これは非常にうまく機能し、テストコード自体をシンプルかつクリーンに保ちます。

ただし、パラメータを使用しないため、テストメソッドの一部を一度だけ実行したい場合があります。JUnitでテストメソッドを「シングルトン」または「1回限り」としてマークする方法はありますか。

注:これは、Eclipseでの単一のテストの実行には関係ありません。その方法は知っています:)

32
centic

スイートを使用して、任意の数のテストクラスを関連付けて一緒に実行できます。このようにして、クラスをテストするときにすべてのテストが実行され、異なるテストランナーを混在させることができます。

  1. テストするクラスに関連付けられたテストスイートを作成する
  2. パラメーター化されたテストクラスへの参照を追加する
  3. パラメータ化されていないテストを含む他のクラスを追加します。

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

囲まれたランナー でテストを構成できます。

@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() {
            ...
        }
    }
}
67
Stefan Birkner

「@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);
        }
    }
}
1
PFROLIM

パラメータ化されたテストに関して、より多くの機能/パワーを提供する多くのjunitプラグインがあります。 zohhak、junit-parames、junit-dataproviderを確認してください。パラメーター化されたテストと単純なjunitテストを混在させることができます

1
piotrek