Escrevendo um código com TDD
Vamos escrever o nosso mesmo código utilizando o TDD. No exemplo anterior escrevemos primeiro nossa função e depois a testamos, vamos fazer o inverso agora.
No TDD devemos escrever primeiro nosso Teste, então vamos começar:
Crie um novo arquivo chamado tdd_soma.py
# coding: utf-8
import unittest
class TestSoma(unittest.TestCase):
# criamos somente uma função de teste
def test_soma_numeros_positivos(self):
resultado = soma(1, 1)
self.assertEqual(resultado, 2)
if __name__ == '__main__':
unittest.main()
Como principio do TDD, escrevemos um teste que irá falhar (RED Cicle), ao executar esse código, recebmos o erro:
E
======================================================================
ERROR: test_soma_numeros_positivos (__main__.TestSoma)
----------------------------------------------------------------------
Traceback (most recent call last):
File "tdd_soma.py", line 9, in test_soma_numeros_positivos
resultado = soma(1, 1)
NameError: global name 'soma' is not defined
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
`
Isso mesmo! Nosso teste falhou porque a função nem foi criada ainda. Vamos criá-la e fazê-la passar no nosso teste (Green cicle).
# coding: utf-8
def soma(a, b):
return a + b
class TestSoma(unittest.TestCase):
# [...]
Agora nossa função soma
está funcionando e passando no nossos testes. Queremos que nossa função retorne um erro quando os valores passados não forem inteiros, vamos escrever um teste para isso.
# coding: utf-8
def soma(a, b):
return a + b
class TestSoma(unittest.TestCase):
def test_soma_numeros_positivos(self):
# [...]
def test_soma_com_letras(self):
with self.assertRaises(ValueError) as error:
soma('a', 'b')
self.assertEqual(error.msg, u'Somente números são permitidos')
Pronto! Escrevemos um teste que falha, agora vamos refatorar nossa função para passar no nosso teste. Deixamos assim:
# coding: utf-8
def soma(a, b):
if isinstance(a, basestring) or isinstance(b, basestring):
raise ValueError(u'Somente números são permitidos')
return a + b
# [...]
Se executarmos nosso código agora, veremos que todos os testes estão passando. Devemos continuar no ciclo até que todos nossos requisitos para a função tenham sido atingidos.
O código final ficou assim:
# coding: utf-8
import unittest
def soma(a, b):
if isinstance(a, basestring) or isinstance(b, basestring):
raise ValueError(u'Somente números são permitidos')
return a + b
class TestSoma(unittest.TestCase):
# criamos somente uma função de teste
def test_soma_numeros_positivos(self):
resultado = soma(1, 1)
self.assertEqual(resultado, 2)
def test_soma_com_letras(self):
with self.assertRaises(ValueError) as error:
soma('a', 'b')
self.assertEqual(error.msg, u'Somente números são permitidos')
if __name__ == '__main__':
unittest.main()