logo

엣지 케이스를 잊지 마세요!

테스트 드라이브 개발(TDD) 소개

오라클이 뭐야?

더 큰 프로젝트의 일부로 다음 함수를 작성하려는 시나리오를 상상해 보세요.

안에 삼각형의 세 변의 길이 값을 기반으로 삼각형의 유형을 반환하는 함수를 작성하세요. 입력 데이터 유형에 대한 테스트가 이미 실행되어 작업할 숫자 값만 수신한다고 가정하여 좀 더 쉽게 만들어 보겠습니다.



상황은 쉬워 보입니다. 계속해서 다음과 같은 함수를 작성하세요.

알고리즘 :   

    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))==scalar Triangle) = 올바른지 확인합니다. 
2. (String_toLowerCase(triangle_type(666))==정삼각형) = 올바른지 확인합니다. 
3. 주장(String_toLowerCase(triangle_type(676))==이등변 삼각형) = 정확함 
여기까지는 괜찮아 보입니다. 그러나 실패한 것들은 다음과 같습니다.
4. (String_toLowerCase(triangle_type(000))==삼각형이 아님) = 잘못된 경우를 확인합니다. 
5. (String_toLowerCase(triangle_type(-6-7-8))==not a Triangle) = 잘못된 경우를 확인합니다. 
6. (String_toLowerCase(triangle_type(528))==삼각형이 아님) = 잘못된 경우를 확인합니다. 

  • 에서 4번째 명령문 입력 값은 (000)입니다. 이제 우리는 (000)이 삼각형이 아닌 점을 형성한다는 것을 알고 있습니다. 실제로 입력 값이 0이면 삼각형이 불가능합니다. 하지만 우리의 경우에는 정삼각형을 반환합니다!
  • 또한 5번째 명령문은 길이가 결코 음수 값이 될 수 없음을 상기시켜줍니다. 길이가 -30cm인 눈금이 보입니다. 따라서 길이의 -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

이전 기능에는 이제 시작 부분과 wola에 2개의 추가 줄이 포함됩니다! 지금은 모두 테스트를 통과하고 있습니다.

이것은 프로덕션 레벨 코드를 작성할 때 간단한 것에도 주의해야 한다는 점을 상기시키기 위한 간단한 예제 시나리오일 뿐입니다. 단순한 엣지 케이스를 염두에 두고 균일한 문자열 케이스로 검사함으로써 테스트 범위를 늘리고 프로그램이 수학적으로 더 정확한 결과를 반환하도록 만들었습니다.

다음은 위의 접근 방식을 구현한 것입니다.  

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가 무엇을 의미하는지 간략하게 보여줍니다.
 

퀴즈 만들기