18

単体テストの名前が時間の経過とともに古くなる可能性があり、テスト自体が最も重要であると考える場合、賢明なテスト名を選択することが重要ですか?

すなわち

[Test]
public void ShouldValidateUserNameIsLessThan100Characters() {}

[Test]
public void UserNameTestValidation1() {}
4

13 に答える 13

18

メソッドの名前は、それが何をするのかを明確にする必要があります。

IMO、あなたの最初の提案は少し長く、2番目の提案は十分に有益ではありません。また、名前に「100」を付けるのはおそらく悪い考えです。これは変更される可能性が非常に高いためです。どうですか:

public void validateUserNameLength()

テストが変更された場合は、それに応じて名前を更新する必要があります。

于 2008-09-06T14:05:19.900 に答える
10

はい、特にコンソールまたは継続的インテグレーション サーバーでテストを実行している場合、名前は非常に重要です。Jay Fields はそれについての投稿を書きました。

さらに、テストごとに 1 つのアサーションを含む適切なテスト名を付けると、テストが失敗したときにスイートが優れたレポートを提供します。

于 2008-09-06T16:47:50.073 に答える
7

とても。適切なメソッド名と変数名を選択することと同様に重要です。
将来、新しい開発者がテスト スイートを参照する場合はなおさらです。

元の質問については、間違いなく Answer1. さらにいくつかの文字を入力することは、支払うべき小さな代償です

  • 読みやすさ。あなたと他の人のために。「ここで何を考えていたの?」を排除します。だけでなく、「この男はこのテストで何を得ているのですか?」
  • 他の人が書いたものを修正するために、あなたが入っているときにクイックズームイン
  • テスト スイートの訪問者の即時更新。正しく行われていれば、テスト ケースの名前を確認するだけで、ユニットの仕様を読者に知らせることができます。
于 2008-09-06T15:10:03.380 に答える
6

Clean Codeの 124 ページで、Robert C. Martinは次のように書いています。

この話の教訓は単純です。テスト コードは製品コードと同じくらい重要です。二級市民ではありません。思考、設計、ケアが必要です。本番コードと同じくらいクリーンに保つ必要があります。

于 2008-09-13T01:03:39.177 に答える
6

はい。

 [Test]
 public void UsernameValidator_LessThanLengthLimit_ShouldValidate() {}

被験者を最初に置き、テストステートメントを次に置き、期待される結果を最後にします。
そうすれば、それが何をしているかを明確に示すことができ、名前で簡単に並べ替えることができます:)

于 2008-09-06T15:20:32.763 に答える
2

テスト方法の簡潔な名前が見つからない場合は、このテストの設計が正しくないことを示していると思います。また、適切なメソッド名は、短時間で何が起こったかを知るのに役立ちます。

于 2008-09-06T14:06:20.133 に答える
2

はい、テスト名の要点は、テストが失敗したときに何が機能しないかを示すことです。

于 2008-09-06T15:51:22.847 に答える
1

条件は時間とともに変化する可能性があるため、テストが満たす必要のある条件を名前に入れません。あなたの例では、次のような名前を付けることをお勧めします

UserNameLengthValidate()

また

UserNameLengthTest()

または、テストの内容を説明するのに似ていますが、テスト/検証パラメーターを想定していません。

于 2008-09-06T14:04:58.450 に答える
1

非常にわかりやすい名前を付けると、何が正しく機能していないかをすぐに確認できるため、単体テスト コードを実際に確認する必要がありません。また、すべてのユニット テストのリストには、ユニットの意図した動作が記述されており、テスト対象のユニットの動作のドキュメントとして (多かれ少なかれ) 使用できます。

これは、単体テストが非常に具体的で、1 つの単体テスト内であまり検証されない場合にのみ機能することに注意してください。

たとえば、次のようになります。

[Test]
void TestThatExceptionIsRaisedWhenStringLengthLargerThen100()

[Test]
void TestThatStringLengthOf99IsAccepted()
于 2008-09-06T20:53:54.973 に答える
1

はい、テスト対象のコードの名前 (メソッド、プロパティなど) は変更できますが、期待値が変更された場合、既存のテストは失敗するはずです。これは、テスト名のリストを熟読するのではなく、適切に構築されたテストを持つことの真の価値です。そうは言っても、よく名付けられたテストメソッドは、新しい開発者を参加させるための優れたツールであり、既存のコードのタイヤを蹴ることができる「実行可能なドキュメント」を見つけるのに役立ちます.テストメソッドによって行われたアサーションを最新の状態に保つためです。

次のパターンを使用してテストに名前を付けます。各テスト フィクスチャは 1 つのクラスに集中しようとし、通常は {ClassUnderTest}Test という名前です。各テスト メソッドに {MemberUnderTest}_{Assertion} という名前を付けます。

[TestFixture]
public class IndexableFileTest
{
   [Test]
   public void Connect_InitializesReadOnlyProperties()
   {
     // ...
   }

   [Test,ExpectedException(typeof(NotInitializedException))]
   public void IsIndexable_ErrorWhenNotConnected()
   {
     // ...
   }

   [Test]
   public void IsIndexable_True()
   {
     // ...
   }

   [Test]
   public void IsIndexable_False()
   {
     // ...
   }
}
于 2008-09-06T14:41:29.080 に答える
0

名前は理にかなった範囲で重要である必要があります。テスト389fb2b5-28ad3が失敗したというビルドからの電子メールは必要ありませんが、それが他のテストではなくUserNameテストであることを知っているだけで、適切な人が診断を行うことができます。

于 2008-09-06T14:07:20.817 に答える
0
[RowTest]
[Row("GoodName")]
[Row("GoodName2")]
public void Should_validate_username()
{
}

[RowTest]
[Row("BadUserName")]
[Row("Bad%!Name")]
public void Should_invalidate_username()
{
}

これは、実際にはより複雑なタイプの検証に対してより理にかなっているかもしれません。

于 2008-09-06T16:24:45.760 に答える
0

はい、そうです。個人的には、単体テストを改善するために SSW のルールを確認することをお勧めします。これには、非常に役立つ命名ガイドラインが含まれています。

于 2008-09-06T16:42:15.983 に答える