4

アサーションでは「テストごとに1つのアサーション」が認識されます。以下のようにアサーションを書くのは良くありません:</ p>

  Assert((foo != null) && (bar != null));

より良い選択は次のとおりです。

  Assert(foo != null);
  Assert(bar != null);

問題は、アサーションが次の場合はどうなるかです。

  Assert((foo == null) || (foo.length == 0));

関係はANDではなくORです。

ロジックを維持しながら「テストごとに1つのアサーション」を作成する方法はありますか?

4

3 に答える 3

4

問題はアサーションではなく、テストケースのアレンジまたはアクトの部分で発生する可能性があります。単体テストを行うときは、制御された環境で[小さな]コードを呼び出します。つまり、テスト対象のソフトウェアがどのように動作するかを知っておく必要があります。したがって、それがnullポインタを返すのか、空の文字列を返すのかを知る必要があります。すべてのテストには、1つの期待される結果があります。

...動作が異なるいくつかの関数/メソッド、または異なる状況で動作が異なるように見えるサードパーティのコードに対してテストを使用している場合を除きます。この場合、「ルールごとに1つのアサーション」は単なるガイドラインであり、示されているようにアサーションを使用できます。このテストが失敗した場合は、返されたfooが空でない文字列であることを意味します。

または、文字列ポインタがnullでないかどうかもテストする、空の文字列をテストする関数を作成できます。

Assert(is_empty_string(foo));

言語文字列クラスがこのメソッドを提供する場合があります。

于 2009-06-03T05:54:36.903 に答える
4

ガイドラインの背後にある考え方は、1 つのテストで 1 つの論理的なもの (場合によってはいくつのアサートに要約される可能性があります) のみをテストするということです。したがって、テストが失敗した場合、失敗した正確な理由がわかり、すぐに特定のコード ブロックにゾーンインできます。このページから例を借りると、次のテストが失敗した場合、住所タイプで国が抽出/決定される方法に問題があることがわかります。

public void testCountry() throws Exception {
        assertEquals("COUNTRY",  anAddress.getCountry());
    }

これを複数のアサートを含むバージョンのテストと比較すると、複数の理由で失敗する可能性があります (有用なアサート メッセージを使用しない限り) 、テストをデバッグする必要があります(うん!)。

私はあなたの完全なテストを見る必要があります。見たところ、何かが見つからないシナリオについてコレクションをチェックしているようです。その場合、クライアントが null をチェックする必要がないように、空のコレクションを返すことをお勧めします。あなたのテストはクライアントでもあるので、人生もよりシンプルになります:Assert.AreEqual (0, foo.length)

于 2009-06-03T05:45:14.047 に答える
1

確かに、1つのテストはnull fooがアサートされることを確認し、1つは長さが0の非null fooも失敗することを確認します(他のテストはfooがnullではなく長さが!= 0の場合をチェックします。ANDをチェックするよりも便利ですか?

編集:要求に応じた擬似コード...:

  should_assert(themethod(foo=null))
  fakefoo = fakewhatever(length=0)
  should_assert(themethod(foo=fakefoo))
  ...rest of tests w/foo not null, w/length != 0

たとえば、Pythonユニットテストとまだ擬似コードmockの場合、これは次のようになります。

  self.assertRaises(AssertionError, theobj.themethod, null)
  fakefoo = mock.makeObj(length=0)
  self.assertRaises(AssertionError, theobj.themethod, fakefoo))
  ...rest of tests w/foo not null, w/length != 0
于 2009-06-03T05:30:52.993 に答える