1

私は単体テストを初めて使用するので、jUnit フレームワークに慣れるための実践的な演習を行いたいと考えていました。

文字列乗算器を実装するプログラムを作成しました

public String multiply(String number1, String number2)

乗数法をテストするために、次のテスト ケースで構成されるテスト スイートを作成しました (必要なすべての整数解析などを含む)。

public class MultiplierTest {
    @Test
    public void testMultiply() {
      Multiplier multiplier = new Multiplier();
      // Test for 2 positive integers
      assertEquals("Result", 5, multiplier.multiply("5", "1"));

      // Test for 1 positive integer and 0
      assertEquals("Result", 0, multiplier.multiply("5", "0"));

      // Test for 1 positive and 1 negative integer
      assertEquals("Result", -1, multiplier.multiply("-1", "1"));

      // Test for 2 negative integers
      assertEquals("Result", 10, multiplier.multiply("-5", "-2"));

      // Test for 1 positive integer and 1 non number
      assertEquals("Result", , multiplier.multiply("x", "1"));

      // Test for 1 positive integer and 1 empty field
      assertEquals("Result", , multiplier.multiply("5", ""));

      // Test for 2 empty fields
      assertEquals("Result", , multiplier.multiply("", ""));
    } 
}

同様の方法で、境界ケース (数値は int 値と見なす) または虚数を含むテスト ケースを作成できます。

1) しかし、上記の最後の 3 つのテスト ケースの期待値はどうなるでしょうか? (エラーを示す特別な番号?)

2) 見逃した追加のテスト ケースは?

3) assertEquals() メソッドは乗数メソッドをテストするのに十分ですか、それとも assertTrue()、assertFalse()、assertSame() などの他のメソッドが必要ですか?

4) これは、テスト ケースを作成する正しい方法ですか? このエクササイズから「正確に」どのように恩恵を受けていますか?

5)乗数法をテストする理想的な方法は何ですか?

私はここでかなり無知です。誰かがこれらの質問に答えるのを助けることができれば、私はそれを大いに感謝します. ありがとうございました。

4

4 に答える 4

4

まず、クラスはあるが関数がないため、コードに誤りがあります。これらすべてのテストが 1 つの関数にあると思いますか? もしそうなら、私はそれに反対することをお勧めします。通常、1 つのテストで 1 つのことをテストする必要があるため、次のようにします。

public class MultiplierTests {
  @Test
  public void testSimpleMultiple() {
    assertEquals(...);
  }

  ...
}

次に、ここで結果として int を渡しています。

assertEquals("Result", 5, multiplier.multiply("5", "1"));

しかし、 ?Multiplier.multiply()を返します。String

したがって、これをどのようにテストするかは、結果によって異なります。空の文字列を渡した場合、例外がスローされますか? @Testその場合、例外がスローされることを期待するように注釈を定義できます。

@Test(expected = IllegalArgumentException.class)
public void test() {
  multiplier.multiply("", "5");
}
于 2010-04-24T01:48:03.497 に答える
3

1) しかし、上記の最後の 3 つのテスト ケースの期待値はどうなるでしょうか? (エラーを示す特別な番号?)

他の回答者が説明したように、それは乗数のインターフェース契約に依存します。あなた (または一般的にそのクライアント) がそれをどのように使用することになっているのか、特定のエラーや極端なケースが発生した場合にどうするべきかなどを検討する必要があります。Java では、そのような場合に例外をスローするのが慣例です。

2) 見逃した追加のテスト ケースは?

私の頭に浮かぶいくつかのケース:

// test commutativity
assertEquals("0", multiplier.multiply("0", "5"));
assertEquals("-1", multiplier.multiply("1", "-1"));
assertEquals("149645", multiplier.multiply("173", "865"));
assertEquals("149645", multiplier.multiply("865", "173"));

// test some more unusual cases of multiplying with 0
assertEquals("0", multiplier.multiply("-5", "0"));
assertEquals("0", multiplier.multiply("0", "-0"));
// test with numbers starting with '+'
assertEquals("368", multiplier.multiply("+23", "+16"));
assertEquals("-368", multiplier.multiply("-23", "+16"));

// test multiplying huge values without overflow
assertEquals("18446744073709551616", multiplier.multiply("4294967296", "4294967296"));
assertEquals("18446744073709551616", multiplier.multiply("-4294967296", "-4294967296"));

3) assertEquals() メソッドは乗数メソッドをテストするのに十分ですか、それとも assertTrue()、assertFalse()、assertSame() などの他のメソッドが必要ですか?

この場合、必要なのは 2 つの値が等しいかどうかを比較することだけです。他のテストでは、さまざまな種類のアサートが必要になる場合があります。

4) これは、テスト ケースを作成する正しい方法ですか? このエクササイズから「正確に」どのように恩恵を受けていますか?

単体テストの「正しい」方法は 1 つではありません。最も近いのはおそらくテスト駆動開発です。これは、コードをゼロから作成する場合に多くの人 (私を含む) が推奨するものです。

この演習の利点は、おそらく、JUnit に慣れ、「テスター ハット」をしばらく試したことです。

5)乗数法をテストする理想的な方法は何ですか?

この質問は前の質問とどう違うのですか?

于 2010-04-24T22:35:31.200 に答える
2

@Expected アノテーションを使用して、例外が正常に機能していることを確認するテスト ケースを追加することを検討する必要があります。基本的に、例外を生成する必要があることがわかっているケースを作成し、テストが成功することを確認します。

複雑なメソッドでケースを見落としていないかどうかを判断する良い方法は、コード カバレッジ ツールを使用してそれらを実行することです。すべてのテストを実行してから、コード カバレッジの結果を確認します。テスト ケースでアクセスされないコードの部分がある場合は、おそらく一部が欠落しています。

ここで良いガイドを見つけることができます。

于 2010-04-24T01:49:34.337 に答える
1

エッジ条件を実際にテストしていて、数値の文字列表現を期待している場合は、テスト対象の関数メソッドに文字列を渡すことをテストできます。

@Test(expected= NumberFormatException.class)
public void test() {
   multiplier.multiply("a", "b");
}

cletus の実装については同意しません。彼のテスト ケースはすべてを包含する IllegalArgumentException を想定しているため、親例外を使用するよりも特定のサブクラスをテストする方がよいと思います。

于 2010-04-24T02:00:33.133 に答える