テストドライブ開発 (TDD) の概要
より大きなプロジェクトの一部として次の関数を作成するシナリオを想像してください。
で 三角形の 3 辺の長さの値に基づいて三角形の種類を返す関数を作成します。入力データ型のテストがすでに設定されているため、処理する数値のみを受け取ると仮定して、作業を少し簡単にしましょう。
状況は簡単に見えます。次のような関数を書いてみましょう -
アルゴリズム:
Input : 3 numeric values
Output : 1 string stating type of triangle
Function : triangleType (side1 side2 side3)
Start :
1. If side1 == side2 == side3
Then Return Equilateral Triangle
2. Else if side1 == side2 or side1 == side3 or side2 == side3
Then Return Isosceles Triangle
3. Else
Return Scalar Triangle
Stop
関数を完了すると、実行するアサーションがいくつか与えられます。そして驚いたことに、合格したケースはわずか 50% でした。
テストステートメントを見てみましょう。合格するものは次のとおりです。
1. (String_toLowerCase(triangle_type(678))==スカラー三角形) = 正しいかどうかをアサートします。
2. (String_toLowerCase(triangle_type(666))==正三角形) = 正しいかどうかをアサートします。
3.assert(String_toLowerCase(triangle_type(676))==二等辺三角形) = 正しい
まあ、ここまでは順調に見えます。しかし、失敗するものは次のとおりです。
4. (String_toLowerCase(triangle_type(000))==三角形ではない) = 不正であるかどうかをアサートします。
5. (String_toLowerCase(triangle_type(-6-7-8))==三角形ではない) = 不正解であるかどうかをアサートします。
6. (String_toLowerCase(triangle_type(528))==三角形ではない) = 不正であるかどうかをアサートします。
- で 4位 ステートメントの入力値は (000) です。これで、(000) が三角形ではなく点を形成することがわかりました。実際、入力値がゼロの場合、三角形は作成できません。ただし、この場合は正三角形が返されます。
- また、 5位 このステートメントは、長さを負の値にすることはできないことを思い出させます。長さ -30 cm のスケールが表示されます。したがって、長さの -ve 値が 1 つでもある場合、三角形は作成できません。ただし、この場合は、値に応じて 3 つの結果のいずれかを返す可能性があります。ここではスカラーを返します。
- さて、どうですか 6位 声明。すべての値は >= 0 であり、それは確かにスカラー三角形です。それともそうですか?三角形の 2 辺の和は常に 3 辺以上になるという規則を思い出してください。
ここで次のことを確認します。
ラドヤード・キプリングによる要約の場合
8 + 2 > 5
8 + 5 > 2
5 + 2 > 8
出力:
True
True
False
三角形性のテストに失敗します。したがって、長さ (258) は三角形を形成しません。
したがって、必要なのは、私たちが持っているものが三角形であるかどうかを示す、一種の三角形検証を適切に実行することです。解決策の一部として、次のような別の関数を作成します。
アルゴリズム:
Input : 3 sides of the triangle
Output : Boolean value: True if 3 sides form a triangle false otherwise
Function : triangleValidator(side1 side2 side3)
Start
1. If (side1 <= 0 or side2 <= 0 or side3 <= 0) and
(side2 + side3 >= side1) and
(side3 + side1 >= side2) and (side1 + side2 >= side3)
then return True
3. Return False
Stop
以前の関数には、先頭に 2 行の追加行と wola! が含まれるようになりました。現在、すべてのテストが合格しています。
これは、運用レベルのコードを作成する際には、たとえ単純な事柄であっても注意する必要があることを思い出させるための、単なるサンプル シナリオです。単純なエッジ ケースを念頭に置き、統一された文字列ケースでチェックすることで、テスト カバレッジを高め、プログラムがより数学的に正しい結果を返すようにしました。
以下は上記のアプローチの実装です。
Python3# Check if given sides form a triangle or not def triangleValidator(side1 side2 side3): if side1 <= 0 or side2 <= 0 or side3 <= 0: return False elif (side1 + side2 >= side3) and (side2 + side3 >= side1) and (side3 + side1 >= side2): return True return False # Return the type of triangle def triangleType(side1 side2 side3): # If not a triangle return 'Not a triangle' if triangleValidator(side1 side2 side3) == False: return 'Not A Triangle' # Else perform type checking if side1 == side2 == side3: return 'Equilateral Triangle' elif (side1 == side2) or (side2 == side3) or (side3 == side1): return 'Isosceles Triangle' return 'Scalar Triangle' def call(): print(triangleType(678)) print(triangleType(666)) print(triangleType(676)) print(triangleType(000)) print(triangleType(-6-7-8)) print(triangleType(528)) if __name__=='__main__': call()
JavaScript // Check if given sides form a triangle or not function triangleValidator(side1 side2 side3) { if (side1 <= 0 || side2 <= 0 || side3 <= 0) { return false; } else if (side1 + side2 > side3 && side2 + side3 > side1 && side3 + side1 > side2) { return true; } return false; } // Return the type of triangle function triangleType(side1 side2 side3) { // If not a triangle return 'Not a triangle' if (triangleValidator(side1 side2 side3) === false) { return 'Not A Triangle'; } // Else perform type checking if (side1 === side2 && side2 === side3) { return 'Equilateral Triangle'; } else if (side1 === side2 || side2 === side3 || side3 === side1) { return 'Isosceles Triangle'; } return 'Scalar Triangle'; } // Assertions console.assert(triangleType(6 7 8).toLowerCase() === 'scalar triangle'); console.assert(triangleType(6 6 6).toLowerCase() === 'equilateral triangle'); console.assert(triangleType(6 7 6).toLowerCase() === 'isosceles triangle'); console.assert(triangleType(0 0 0).toLowerCase() === 'not a triangle'); console.assert(triangleType(-6 -7 -8).toLowerCase() === 'not a triangle'); console.assert(triangleType(5 3 8).toLowerCase() === 'not a triangle');
上記のプログラムは、前に説明したアサーションでテストすると、テスト ケースに合格します。
業界では、コーナーケースを考え出し、それらのテストケースが確実に合格するように機能を開発することを「テスト駆動開発」と呼んでいます。このブログは、TDD が実際に何を意味するのかを垣間見ただけです。