logo

Nie zapomnij o obudowach Edge!

Wprowadzenie do programowania napędów testowych (TDD)

Wyobraź sobie scenariusz, w którym chcesz napisać następującą funkcję jako część większego projektu:

W przygotuj funkcję zwracającą typ trójkąta na podstawie wartości długości 3 boków trójkąta. Uprośćmy to nieco, zakładając, że test typu danych wejściowych już istnieje, więc otrzymujesz tylko wartości liczbowe do pracy.



baza danych Java jdbc

Sytuacja wygląda na łatwą. Śmiało, napisz funkcję, która wygląda mniej więcej tak -

Algorytm:   

    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

Po ukończeniu funkcji otrzymasz kilka asercji do wykonania. I ku twojemu zdziwieniu okazuje się, że tylko 50% spraw przeszło pomyślnie. 

Przyjrzyjmy się oświadczeniom testowym. Te które przechodzą to:
1. Potwierdź if (String_toLowerCase(triangle_type(678))==trójkąt skalarny) = Poprawnie 
2. Potwierdź if (String_toLowerCase(triangle_type(666))==trójkąt równoboczny) = Poprawnie 
3.twierdzenie(String_toLowerCase(triangle_type(676))==trójkąt równoramienny) = Poprawnie 
Cóż, aż do tego momentu wszystko wygląda dobrze. Ale te, które zawiodły to:
4. Potwierdź if (String_toLowerCase(triangle_type(000))==nie jest to trójkąt) = niepoprawnie 
5. Potwierdź if (String_toLowerCase(triangle_type(-6-7-8))==nie jest to trójkąt) = niepoprawnie 
6. Potwierdź if (String_toLowerCase(triangle_type(528))==nie jest to trójkąt) = niepoprawnie 

  • w 4 Wartości wejściowe instrukcji to (000). Teraz wiemy, że (000) tworzy punkt, a nie trójkąt. W rzeczywistości, jeśli jakakolwiek wartość wejściowa wynosi zero, trójkąt nie jest możliwy. Ale w naszym przypadku zwróci trójkąt równoboczny!
  • Również 5 stwierdzenie przypomina nam, że długość nigdy nie może być wartością ujemną. Widzisz skalę o długości -30 cm. Zatem jeśli mamy choćby jedną piątą wartość długości, trójkąt nie jest możliwy. Ale w naszym przypadku, w zależności od wartości, może zwrócić dowolny z 3 wyników. Tutaj zwraca skalar.
  • A co teraz z 6 oświadczenie. Wszystkie wartości są >= 0 i z pewnością jest to trójkąt skalarny. Czy tak jest? Pamiętaj o zasadzie, że w trójkącie suma dowolnych 2 boków jest zawsze większa lub równa trzeciemu.

Tutaj widzimy dla:  

8 + 2 > 5  
8 + 5 > 2
5 + 2 > 8

Wyjście :  

sen javascript
True  
True
False

Nie zdaje testu trójkątności. Stąd długości (258) nie tworzą trójkąta.

Zatem potrzebujemy pewnego rodzaju walidacji trójkąta, która powie nam, czy to, co mamy, jest w ogóle trójkątem, czy nie. W ramach rozwiązania piszesz kolejną funkcję, która wygląda następująco:

Algorytm:   

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

Nasza poprzednia funkcja zawiera teraz 2 dodatkowe linie na początku i wolę! wszystkie testy przechodzą teraz pomyślnie.

ciąg zastępczy Java

To tylko prosty przykładowy scenariusz, który ma nam przypomnieć, że pisząc kod na poziomie produkcyjnym, musimy zachować ostrożność nawet w przypadku prostych rzeczy. Mając na uwadze proste przypadki brzegowe i sprawdzając przypadki z jednolitymi ciągami znaków, zwiększyliśmy zasięg testów i sprawiliśmy, że nasz program zwracał bardziej poprawne matematycznie wyniki.

Poniżej znajduje się implementacja powyższego podejścia:  

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'); 

Powyższy program, przetestowany na podstawie omówionych wcześniej twierdzeń, przejdzie teraz pomyślnie przypadki testowe.

W branży tworzenie przypadków narożnych, a następnie opracowywanie funkcji zapewniających pomyślność tych przypadków testowych, określa się jako „rozwój oparty na testach”. Ten blog to tylko rzut oka na to, co TDD oznacza w praktyce.
 

Utwórz quiz