Вступ до розробки тест-драйву (TDD)
Уявіть собі сценарій, де ви хочете написати наступну функцію як частину якогось більшого проекту:
IN rite функція для повернення типу трикутника на основі значення довжини 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 см. Таким чином, якщо ми маємо хоча б одне -ve значення довжини, трикутник неможливий. Але в нашому випадку залежно від значення він може повернути будь-який із 3 результатів. Тут він повертає скаляр.
- Тепер що з 6-й заява. Усі значення >= 0, і це точно скалярний трикутник. Або це так? Пам’ятайте правило, що в трикутнику сума будь-яких двох сторін завжди більша або дорівнює третій.
Тут ми бачимо для:
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 означає на практиці.
алфавіт пронумерованийСтворіть вікторину