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 4º 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 5º 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 6º 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.