60

現在、いくつかの異なる入力でテストするすべてのメソッドに対して、パラメーター化されたテストクラスを作成する必要があります。これを1つのファイルにまとめる方法はありますか?

現在、関数が正しく機能CalculatorTestAdd.javaするかどうかを確認するために使用される一連のパラメーターがあります。Add()このセットを関数に「接続」して、メソッドAdd()用の追加セットを作成し、Subtract()このメソッドを同じテストクラスに追加して、1つのファイルを作成する可能性はありますCalculatorTest.javaか?

4

8 に答える 8

28

もう 1 つの純粋な JUnit でありながら洗練された解決策は、パラメーター化された各テストを独自の内部静的クラスにカプセル化し、最上位のテスト クラスでEnclosedテスト ランナーを使用することです。これにより、テストごとに異なるパラメーター値を互いに独立して使用できるだけでなく、完全に異なるパラメーターを使用してメソッドをテストすることもできます。

これは次のようになります。

@RunWith(Enclosed.class)
public class CalculatorTest {

  @RunWith(Parameterized.class)
  public static class AddTest {

    @Parameters
    public static Collection<Object[]> data() {
      return Arrays.asList(new Object[][] {
          { 23.0, 5.0, 28.0 }
      });
    }

    private Double a, b, expected;

    public AddTest(Double a, Double b, Double expected) {
      this.a = a;
      this.b = b;
      this.expected = expected;
    }

    @Test
    public void testAdd() {
      assertEquals(expected, Calculator.add(a, b));
    }
  }

  @RunWith(Parameterized.class)
  public static class SubstractTest {

    @Parameters
    public static Collection<Object[]> data() {
      return Arrays.asList(new Object[][] {
          { 3.0, 2.0, 1.0 }
      });
    }

    @Parameter(0)
    private Double a;
    @Parameter(1)
    private Double b;
    @Parameter(2)
    private Double expected;

    @Test
    public void testSubstract() {
      assertEquals(expected, Calculator.substract(a, b));
    }
  }

  @RunWith(Parameterized.class)
  public static class MethodWithOtherParametersTest {

    @Parameters
    public static Collection<Object[]> data() {
      return Arrays.asList(new Object[][] {
          { 3.0, 2.0, "OTHER", 1.0 }
      });
    }

    private Double a;
    private BigDecimal b;
    private String other;
    private Double expected;

    public MethodWithOtherParametersTest(Double a, BigDecimal b, String other, Double expected) {
      this.a = a;
      this.b = b;
      this.other = other;
      this.expected = expected;
    }

    @Test
    public void testMethodWithOtherParametersTest() {
      assertEquals(expected, Calculator.methodWithOtherParametersTest(a, b, other));
    }
  }

  public static class OtherNonParameterizedTests {

    // here you can add any other test which is not parameterized

    @Test
    public void otherTest() {
      // test something else
    }
  }
}

@Parameterでの注釈の使用法に注意してくださいSubstractTest。これは、より読みやすいと考えています。しかし、これは好みの問題です。

于 2018-02-02T13:35:53.630 に答える
12

https://github.com/piotrturski/zohhakでパラメーターを使用できます。

@TestWith({
   "1, 7, 8",
   "2, 9, 11"
})
public void addTest(int number1, int number2, int expectedResult) {
    BigDecimal result = calculator.add(number1, number2);
    assertThat(result).isEqualTo...
}

ファイルからパラメーターをロードする場合は、 http://code.google.com/p/fuzztester/またはhttp://code.google.com/p/junitparams/を使用できます。

真の柔軟性が必要な場合は、junit の @Parameterized を使用できますが、コードが乱雑になります。junit の Theories を使用することもできますが、電卓のテストにはやり過ぎのようです

于 2012-12-29T13:40:08.603 に答える
9

はい。あなたがしなければならない特別なことは何もありません。パラメータの値のセットごとに、各 @Test メソッドが 1 回実行されるため、1 つのメソッド test add() と別のメソッド testsubtract() だけを使用します。

また、この要件を指示している人は見当違いであることも付け加えておきます。「すべてのケースに対して」特定の設計パターンを指示することにはほとんど価値がありません。訓練されたサルを雇った方がよいかもしれません。

于 2012-12-29T13:22:45.047 に答える