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()

results matching ""

    No results matching ""