あなたが言及しているプロセスはTest-Driven Developmentと呼ばれます。アイデアはシンプルで、あなたが説明したものに近いです。機能が与えられたら、この機能のテストを書くことからコードを書き始めます。add の例では、動作するコードを作成する前に、簡単なテスト (失敗するテスト) を行う必要があります。
失敗したテスト
[Test]
public void TestAdd()
{
var testedClass = new Addition();
var result = testedClass.Add(1, 2);
Assert.AreEqual(result, 3);
}
これはメソッドの簡単なテストで.Add
あり、すぐに機能するコードに対する期待を示しています。あなたはまだコードを持っていないので、このテストは当然失敗します (当然のことですが、これは良いことです)。
合格試験
次のステップは、テストに合格するための最も基本的なコードを書くことです (当然、最も基本的なコードですreturn 3;
が、この単純な例では、このレベルの詳細は必要ありません)。
public int Add(int num1, int num2)
{
return num1 + num2;
}
これは機能し、テストはパスします。この時点で得られたものは、仮定/期待 (テスト) で述べた方法でメソッドが機能するという基本的な証拠です。
ただし、このテストは適切ではないことに気付くかもしれません。多くの単純な入力データのうちの 1 つだけをテストします。言うまでもなく、場合によっては 1 つのテストでは不十分な場合があり、最初の要件があったとしても、さらにテストが必要であることが明らかになる場合があります (引数の検証やロギングなど)。これは、要件の確認とテストの作成に戻るときの部分であり、次のことにつながります...
リファクタリング
この時点で、作成したばかりのコードをリファクタリングする必要があります。そして、単体テスト メソッドのコードとテスト済みの実装の両方について話しています。Add
メソッドはかなり単純で、2 つの数値を加算するという点で改善できる点はあまりないため、テストの改善に集中できます。例えば:
- テスト ケースを追加する (またはデータ駆動型テストを検討する)
- テスト名をよりわかりやすいものにする
- 変数の命名を改善する
- マジックナンバーを定数に抽出する
このような:
[TestCase(0, 0, 0)]
[TestCase(1, 2, 3)]
[TestCase(1, 99, 100)]
public void Add_ReturnsSumOfTwoNumbers(int first, int second, int expectedSum)
{
var testedClass = new Addition();
var actualSum = testedClass.Add(first, second);
Assert.That(actualSum, Is.EqualTo(expectedSum));
}
リファクタリングは 1 冊の本にする価値のあるトピックなので (そしてたくさんあります)、詳細には触れません。ここで行ったプロセスは、多くの場合、Red-Green-Refactor (赤はテストの失敗、緑は合格を示す) と呼ばれ、TDD の一部です。リファクタリングによって誤って何かが壊れていないことを確認するために、もう一度テストを再実行することを忘れないでください。
これが基本的なサイクルの流れです。要件から始めて、失敗するテストを書き、テストに合格するコードを書き、コードとテストの両方をリファクタリングし、要件を確認し、次のタスクに進みます。
ここからどこへ行く?
TDD の背後にある考え方を理解すれば、自然にフォローアップできる有用なリソースはほとんどありません (この投稿で紹介されているような簡単な説明からでも)。