テストされているメソッドの予想される結果がメソッドの公式ドキュメントに存在する場合、テスト名に期待される結果を示すことは冗長です。実際、メソッドを文書化する目的があれば、ドキュメントはIntellisense情報などを提供するメソッドのXMLドキュメントに記述する必要があります。C#ユニットテスト:テスト結果に期待される結果が含まれているのはなぜですか?
テストするメソッド以外のものは、実際にテスト名に含める必要があるのはなぜですか?
テストされているメソッドの予想される結果がメソッドの公式ドキュメントに存在する場合、テスト名に期待される結果を示すことは冗長です。実際、メソッドを文書化する目的があれば、ドキュメントはIntellisense情報などを提供するメソッドのXMLドキュメントに記述する必要があります。C#ユニットテスト:テスト結果に期待される結果が含まれているのはなぜですか?
テストするメソッド以外のものは、実際にテスト名に含める必要があるのはなぜですか?
よりテストランナーを見たときに理解することがはるかに簡単ですので、あなたがなど、すべての境界条件のために、少なくともテスト、異なるブランチ、
MyMethod_Zero()
MyMethod_MinValue()
MyMethod_MaxValue()
MyMethod_SomeBranchTest()
など
まあ、そうではありませんが、同じ方法に対してさまざまなシナリオを試して10回以上のテストを行っているとすれば、できるだけわかりやすいものにするのは本当に面倒です。
テストリストエディタでは、テストの名前を取得します。それだけです。私のプロジェクトでは現在600以上のテストがあるので、どのメソッドが本当に重要なのかを知っているので、実行中に特定のシナリオを試してみたいです。
私はいつも何かがあなたのニーズに合ったそれを使用したり修理したりする必要はないと思った。私が考えることができる唯一の論理的な説明は、テストメソッドを実行した後、合格/不合格のレコードをエクスポートしてマネージャーに渡すことができるので、彼らは本当になぜか分かりません。 BDDがゆっくりだが確かに勢いを増やしているもう一つの理由。
実際にテストメソッドに名前を付けることができます。あなた/あなたのチームに適した命名規則を選んでください。
しかし、ほとんどのテストランナーはXMLドキュメントを表示せず、メソッド名のみを表示します。メソッド名が十分説明的であれば、テストを失敗させる原因となった(または起こらなかった)アイデアを得るために、テストコードを調べる必要はありません。
テスト名には、テストするメソッドとテストするバリアントが含まれている必要があります。通常、テストするメソッドよりも多くのテストが必要です。 PoppingEmptyStackThrowsInvalidOperationException()
がStackPopTest_1()
をしたいそれはですコンベンションと開発の実践の問題。 TDDを使用して実装している場合は、テスト名に期待される結果を文書化することで、目標に集中できます。まだクラスを実装していないので、期待される結果を指定するXMLドキュメントはありません。テストで期待される結果を文書化することは、仕様(別名テスト)を実行し、それが正しいことを検証できることを意味します。 XML文書は実行できません。テストの名前とテストコードが一致していることを確認する必要があります。これは、別のファイルのテストコードとXMLドキュメントが一致していることを確認するよりも簡単です)。
これ以外にも、 HTMLであなたのための仕様書を生成します。これにより、すべてのステークホルダーがレビューできるレポートを簡単に生成できます。 「チェックアウト時に10%の単一項目の割引コードが適用された場合、ショッピングカートで最も高価な商品は10%割引されます」などのハイレベルなテスト/スペックに対しては、これを実行することをお勧めします。これにより、ステークホルダーは、システムが特定のビジネス関連機能を実装していることを(スペックが実行/通過しているため)検証することができます。
私は知らないし、最も一般的な命名規則が嫌いです。私は彼らが読んで理解することが難しいと思う。 (私は今1を伝えることができない)他のいくつかの命名規則に基づいて、私は私自身を開発し、ここでは次のようになります。このため
public class ColorParser {
public static bool TryParseHex(string value, out Color color) {
// Code to parse the hex color value.
}
}
私のユニットテスト:
はのは、私がテストするには、次のクラスがあるとしましょう特定の方法は、以下のようになります。
public class ColorParserTests
{
public class TryParseHexTests
{
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void TestNullValue()
{
Color color = Color.Empty;
ColorParser.TryParseHex(null, out color);
}
[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void TestEmptyValue()
{
Color color = Color.Empty;
ColorParser.TryParseHex(string.Empty, out color);
}
[TestMethod]
public void TestInvalidValues()
{
string[] invalidValues = new string[]
{
"#",
"FF",
"#FF",
"#FFAA",
"asdf"
};
foreach (var invalidValue in invalidValues)
{
Color color = Color.Empty;
bool result = ColorParser.TryParseHex(invalidValue, out color);
Assert.IsFalse(result, string.Format("Value '{0}' must not pass the test!", invalidValue));
}
}
[TestMethod]
public void TestValidValues()
{
// Spaces are intended and a part of the test!
Dictionary<string, Color> validValues = new Dictionary<string, Color>()
{
{" #000000", Color.FromArgb(0,0,0)},
{" #010203 ", Color.FromArgb(1,2,3)},
{"#00FFFF", Color.FromArgb(0,255,255)},
{"#FF00FFFF", Color.FromArgb(255,0,255,255)},
};
foreach (var validValue in validValues)
{
Color color = Color.Empty;
bool result = ColorParser.TryParseHex(validValue.Key, out color);
Assert.IsTrue(result, string.Format("Value '{0}' must pass the test!", validValue.Key));
Assert.AreEqual(validValue.Value, color, "Parsed color must be the same.");
}
}
}
}
この背後にある考え方は、particualrのテストは、私はそれらを個別にテストすることができた(クラスで)grouppedされていることです。毎回テストされているメソッド名を繰り返す必要はありません。テストメソッドは、メソッド名のような動詞で始まり、それは単にexaclyがテストされているかについての短い情報を含んでいます。他のすべてはテストの中にあります。
このようにして、私は非常に迅速に私がテストしていることを知り、テスト自体の中で結果を定義する必要があります。私がテストしているのは正しいか正しくない値の振る舞いです。
例外をスローするヌルとEmptysなどの特殊なケースでは、テストが必要です。
TestValuesWithSpaces
またはTestNegativeDeposit
またはTestUserNameWithInvalidCharacters
などのようなテストを書き直すことができます。テストする度合いと正確さを決めることができます。この場合、私はそれが十分だと思った。とにかく、これは非常に説明的だと思います。