4

単体テストの命名規則を決定しようとしています。Roy Osherove が推奨するものが気に入っています。

[MethodName_StateUnderTest_ExpectedBehavior]

http://osherove.com/blog/2005/4/3/naming-standards-for-unit-tests.html

アプリケーションが例外をスローして間違った動作を正しく処理しているかどうかをテストしているネガティブ テストのこの標​​準についてはよくわかりません。

したがって、この場合、ExpectedBehavior は常に「CorrectExceptionThrown」になります。ネガティブな単体テストごとに ExpectedBehavior を記述することは理にかなっていますか、それともオプションにしても問題ありませんか?

長所と短所があります。一方では、ネガティブ テストでも常に同じであるため、毎回記述するのは冗長であり、単体テスト メソッド名が長くなります。また、オプションにすると、必要な単体テストで期待される動作が追加されないというリスクもあります。また、プロジェクト全体で一貫性を保つ方が良いと思うので、どこでも同じように適用します。

4

4 に答える 4

5

操作の結果としてスローされる例外を指定することに冗長性はありません。これは、Roy の命名規則に実際に完全に適合します。

SomeMethod_ExpectionalState_ThrowsInvalidOperationException
SomeMethod_ExceptionalState_ThrowsArgumentNullException

コードに関する重要な情報 (スローされた例外のタイプ) を取得します。ただし、古典的なハッピー パス テストがある場合、名前の一部の有用性は主観的です。検討:

SomeMethod_DependencyReturnsCorrectResult_ReturnsResult
SomeMethod_WhenNothingSpecialHappens_ReturnsResult
SomeMethod_EverythingElseWorked_WorksToo

そのような名前にはどのような情報が含まれていますか? むしろ少ない。ReturnsResult本質的にそれが機能することを意味します。NothingSpecialHappensも曖昧な情報です。そのような場合、名前の一部を削除することが正当化される場合があります。

ただし、名前の一部を完全に削除するのではなく、名前を変更することを検討する価値があるかもしれません(たとえば、より曖昧でないやReturnsResultに置き換えることができます)。ReturnsEntityFromDatabaseReturnsSerializedValue

最後に、Roy をやみくもに従わないでください。規則ではなくガイドラインとして扱ってください。慣習が考えられるすべての状況に適合することはめったになく、これも例外ではありません。

于 2012-08-09T10:15:39.317 に答える
2

あなたは書くことができます:

[Test]
public void Foo_ExceptionalCaseX1_ExceptionY1Thrown()
{
}

[Test]
public void Foo_ExceptionalCaseX2_ExceptionY2Thrown()
{
}

...

例外的なケースが異なり、スローされる例外のタイプが同じである場合、冗長性はありません (サフィックスが同じであっても)。
次の 2 つのテストを作成するのと同じです。

[Test]
public void Foo_SomeCaseX1_42Returned()
{
}

[Test]
public void Foo_SomeCaseX2_42Returned()
{
}

...

あなたができること - 42 は 2 つのケースで返されますが、それは現実です - 例外についても同じです。

もう 1 つ: テストのリストを読むと (ほぼ) 同じように見えるかもしれませんが、そのうちの 1 つが失敗した場合、幸運な開発者は、予想される動作が何であったかをすぐに知ることができます。すべてのテストは、それ自体を表す必要があります。

于 2012-08-09T09:46:55.510 に答える
1

単一の単体テストが失敗する状況を想像してみてください。次に、CIから次のようなメッセージが表示されます。

Failed unit tests:

MethodName_NegativeTestParams1_CorrectExceptionThrown

そして、他のコンテキストはありません。そして、問題が発生します(誤った例外がスローされました)。これをオプションにするか、メソッド名を短くしようとすると、次のようになる可能性があります。

Failed unit tests:

MethodName_NegativeTestParams1

あなたがテストを調べるまで、何が悪かったのか手がかりなしで。

この場合、失敗した単体テストのリスト以外にコンテキストがない状況を計画する場合は、メソッド名をできるだけ詳細にし、CorrectExceptionThrown必要な回数だけ繰り返す必要があります。

さらに、テストごとに例外が異なる場合は、CorrectExceptionThrownメッセージの一般性が低くなる可能性があります。ArgumentExceptionThrown

したがって、不必要な繰り返しのように見えることもありますが、すべての場合に期待される動作を含めます。

于 2012-08-09T10:05:12.140 に答える
0

本当だと思います。ただし、これは単体テストの命名規則を決定する 1 つの方法にすぎません。このテストで例外がスローされることが明らかな場合は、.NET フレームワークの単体テストで JUnit のような簡単な方法が提供されると思います。

@Test (IOException.class) public void testIOException() {...}

于 2012-08-09T09:12:40.030 に答える