web-dev-qa-db-ja.com

クラスレベルでのJUnit5パラメーター化テスト

JUnit5のパラメーター化された新機能を使用して、メソッドレベルで実行する代わりに、テストクラスを実行してテストパラメーターを受け取ることは可能ですか?

JUnit 4では、@RunWith(Parameterized::class) plus継承などのランナーを使用して、パラメーターの配列をサブクラスに渡すことができますが、新しいJUnit 5apiを使用して同等の何かを実現できるかどうかはわかりません。

19
IS1_SO

JUnit 5には、パラメーター化されたテストを行うための独自のアプローチがあり、もちろん、JUnit 4とは異なります。新しいアプローチでは、クラスレベルで、つまりすべてのテストメソッドを介してパラメータ化されたフィクスチャを使用することはできません。したがって、パラメータ化されたすべてのテストメソッドには、パラメータへのリンクを明示的に注釈として付ける必要があります。

JUnit 5は、 ドキュメント および ガイド にある多くのパラメータソースタイプを提供します。

あなたの場合、Junit 4@Parametersから移行する最も簡単な方法は、@MethodSource@ArgumentsSourceまたはorg.junit.jupiter.params.provider.*を使用することです。

JUnit 4

@RunWith(Parameterized.class)
public class MyTestWithJunit4 {
    @Parameters
    public static Collection<Object[]> data() {
        return Arrays.asList(new Object[][] {     
                 { 0, 0, 0 },
                 { 1, 2, 3 }, 
                 { 5, 3, 8 } 
        });
    }

    int first;
    int second;
    int sum;

    public MyTestWithJunit4(int first, int second, int sum) {
        this.first = first;
        this.second = second;
        this.sum = sum;
    }

    @Test
    public void test() {
        assertEquals(sum, first + second));
    }
}

JUnit 5(with @MethodSource

class MyTestWithJunit5
{
  @DisplayName( "Test with @MethodSource" )
  @ParameterizedTest( name = "{index}: ({0} + {1}) => {2})" )
  @MethodSource( "localParameters" )
  void test( int first, int second, int sum )
  {
    assertEquals( sum, first + second );
  }

  static Stream< Arguments > localParameters()
  {
    return Stream.of(
        Arguments.of( 0, 0, 0 ),
        Arguments.of( 1, 2, 3 ),
        Arguments.of( 5, 3, 8 )
    );
  }
}

JUnit 5(with @ArgumentsSource

class MyTestWithJunit5
{
  @DisplayName( "Test with @ArgumentsSource" )
  @ParameterizedTest( name = "{index}: ({0} + {1}) => {2})" )
  @ArgumentsSource( Params.class )
  void test( int first, int second, int sum )
  {
    assertEquals( sum, first + second );
  }

  static class Params implements ArgumentsProvider
  {
    @Override
    public Stream< ? extends Arguments > provideArguments( ExtensionContext context )
    {
      return Stream.of(
          Arguments.of( 0, 0, 0 ),
          Arguments.of( 1, 2, 3 ),
          Arguments.of( 5, 3, 8 )
      );
    }
  }
}

@MethodSourceのメソッドと@ArgumentsSourceのクラスは、同じクラス内だけでなく、それらを使用するテストメソッドを含むどこにでも配置できると考えてください。また、@MethodSourcevalueString[]であるため、複数のソースメソッドを提供できます。

いくつかの意見と比較

JUnit 4では、パラメーターを提供するファクトリメソッドは1つしかなく、テストはそれらのパラメーターを中心に構築されることになっています。それどころか、JUnit 5は、パラメーターのバインドにおいてより抽象化と柔軟性を提供し、テストロジックをセカンダリであるパラメーターから切り離します。これにより、パラメーターソースから独立してテストを構築し、必要に応じて簡単に変更できます。

依存関係の要件

パラメータ化されたテスト機能はコアjunit-jupiter-engineには含まれていませんが、別の依存関係にあります junit-jupiter-params

1
diziaq