logo

Não se esqueça dos casos extremos!

Uma introdução ao desenvolvimento de test drive (TDD)

Imagine um cenário onde você deseja escrever a seguinte função como parte de algum projeto maior:

EM rite uma função para retornar o tipo de triângulo com base no valor do comprimento de 3 lados de um triângulo. Vamos tornar isso um pouco mais fácil, assumindo que o teste para o tipo de dados de entrada já está em vigor, então você recebe apenas valores numéricos para trabalhar.



loop aprimorado em java

A situação parece fácil. Vá em frente e escreva a função que se parece com isto -

Algoritmo:   

    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

Depois de concluir a função, você receberá algumas asserções para executar. E para sua surpresa você descobre que apenas 50% dos casos foram aprovados. 

Vejamos as instruções de teste. Os que passam são:
1. Afirme se (String_toLowerCase(triangle_type(678))==triângulo escalar) = Correto 
2. Afirme se (String_toLowerCase(triangle_type(666))==triângulo equilátero) = Correto 
3. assert(String_toLowerCase(triangle_type(676))==triângulo isósceles) = Correto 
Bem, as coisas parecem boas até aqui. Mas os que falham são:
4. Afirme se (String_toLowerCase(triangle_type(000))==não é um triângulo) = Incorreto 
5. Afirme se (String_toLowerCase(triangle_type(-6-7-8))==não é um triângulo) = Incorreto 
6. Afirme se (String_toLowerCase(triangle_type(528))==não é um triângulo) = Incorreto 

  • No os valores de entrada da instrução são (000). Agora sabemos que (000) forma um ponto e não um triângulo. Na verdade, se qualquer valor de entrada for zero, o triângulo não é possível. Mas no nosso caso retornará um triângulo equilátero!
  • Também o declaração nos lembra que o comprimento nunca pode ser um valor negativo. Você vê uma escala com -30 cm de comprimento. Assim, se tivermos pelo menos um valor -ve de comprimento, o triângulo não é possível. Mas no nosso caso dependendo do valor pode retornar qualquer um dos 3 resultados. Aqui ele retorna um escalar.
  • Agora e quanto ao declaração. Todos os valores são >= 0 e certamente é um triângulo escalar. Ou é? Lembre-se da regra de que em um triângulo a soma de quaisquer 2 lados é sempre maior ou igual ao terceiro.

Aqui vemos para:  

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

Saída :  

contar sql distinto
True  
True
False

Ele falha no teste da triangularidade. Portanto, os comprimentos (258) não formam um triângulo.

Então, o que precisamos é de uma espécie de validação de triângulo que nos diga se o que temos é mesmo um triângulo ou não. Como parte da solução, você escreve outra função semelhante a:

Algoritmo:   

quantas semanas em um mês
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

Nossa função anterior agora inclui 2 linhas extras no início e wola! todos os testes estão passando agora.

Este é apenas um exemplo simples de cenário para nos lembrar que, ao escrever código em nível de produção, precisamos ter cuidado até mesmo com coisas simples. Mantendo em mente os casos extremos simples e verificando casos de string uniformes, aumentamos nossa cobertura de teste e fizemos nosso programa retornar resultados matematicamente mais corretos.

Abaixo está a implementação da abordagem acima:  

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

O programa acima, quando testado nas asserções discutidas anteriormente, agora passará nos casos de teste.

Na indústria, apresentar casos extremos e, em seguida, desenvolver funções para garantir que esses casos de teste sejam aprovados é denominado 'desenvolvimento orientado a testes'. Este blog é apenas um vislumbre do que TDD significa na prática.
 

Criar questionário