そうです。
単体テストを行ったとしても、実際にテストされたコードよりも多くのコードがテスト内にあることは珍しいことではありません。それには何の問題もありません。
簡単なコードを考えてみましょう:
public void SayHello(string personName)
{
if (personName == null) throw new NullArgumentException("personName");
Console.WriteLine("Hello, {0}!", personName);
}
テストはどうなりますか?ここでテストする少なくとも4つの単純なケースがあります。
人の名前はnull
です。例外は実際にスローされますか?少なくとも3行のテストコードを記述します。
人の名前は"Jeff"
です。我々が得るか"Hello, Jeff!"
、応答して?これは4行のテストコードです。
個人名は空の文字列です。どのような出力が期待されますか?実際の出力は何ですか?副次的な質問:機能要件と一致していますか?つまり、単体テスト用のコードがさらに4行追加されます。
人名は文字列としては十分に短いですが"Hello, "
、感嘆符と組み合わせるには長すぎます。どうなりますか¹
これには多くのテストコードが必要です。さらに、コードの最も基本的な部分には、テスト対象のコードに必要なオブジェクトを初期化するセットアップコードが必要になることが多く、スタブやモックなどの記述にもつながります。
比率が非常に大きい場合は、いくつかのことを確認できます。
テスト全体でコードの重複はありますか?テストコードであるという事実は、同様のテスト間でコードを複製(コピーアンドペースト)する必要があることを意味しません。そのような複製は、それらのテストのメンテナンスを困難にします。
冗長テストはありますか?経験則として、単体テストを削除すると、ブランチカバレッジは減少するはずです。そうでない場合は、パスがすでに他のテストでカバーされているため、テストが不要であることを示している可能性があります。
テストする必要があるコードのみをテストしていますか?サードパーティライブラリの基礎となるフレームワークをテストすることは期待されていませんが、プロジェクト自体のコードのみをテストする必要があります。
スモークテスト、システムテストと統合テスト、機能テストと受け入れテスト、ストレステストと負荷テストでは、さらにテストコードを追加するため、実際のコードのLOCごとに4から5 LOCのテストを行うことは心配する必要はありません。
TDDに関する注意
コードのテストにかかる時間が心配な場合は、コードを最初に実行し、後でテストを実行するのが間違っている可能性があります。この場合、TDDを使用すると、コードとテストを切り替えながら、15〜45秒の繰り返しで作業するように奨励できます。TDDの支持者によると、実行する必要のあるテストの数と、さらに重要なこととして、特にテスト用に書き直すビジネスコードの量を減らすことで、開発プロセスを高速化します。
う¹ Nである文字列の最大長。SayHello
参照して、長さn -1の文字列を呼び出して渡すことができます。これで、Console.WriteLine
ステップで、フォーマットは長さn + 8のストリングで終わるはずです。これは例外になります。おそらく、メモリの制限により、n / 2 文字を含む文字列でさえ例外になります。質問する必要があるのは、この4番目のテストが単体テストであるか(1つのように見えますが、平均的な単体テストに比べてリソースの面ではるかに高い影響を与える可能性があります)、実際のコードまたは基礎となるフレームワークをテストするかどうかです。