Anda di halaman 1dari 3

PyUnit & Test-driven development (TDD) na

prtica
jul 26 2009
Sempre bom ver um pouco de TDD na prtica. sempre muito chato ver um
exemplo de como fazer testes unitrios usando uma funo de soma. Parece que algo
no est conectando
Vamos ento criar uma funo chamada gerar_cpf, como o nome indica, esta funo
gera um CPF vlido. Ser necessrio mudar um pouco o paradigma. Lets TDD:
especificao do requisito, construo do test case e, ento, elaborao da(s)
funo(es).
Sabemos algumas coisas que devemos validar em relao a um CPF:
Um cpf deve conter 11 dgitos;
Os dois ltimos dgitos so dgitos verificadores, obtidos atravs de um
clculo.
Ento, basta tomar como base a descrio do algoritmo de gerao dos dgitos verificadores,
para chegarmos seguinte especificao:
1. Existir uma funo chamada gera_cpf que ser capaz de gerar um CPF vlido;
2. Esta funo chamar a funo gera_digito_verificador, que far os clculos
devidos e ser capaz de gerar tanto o primeiro quanto o segundo dgito
verificador.
E segue nosso test case:
#coding:utf-8
import unittest
from geracao import gera_cpf
from geracao import gera_digito_verificador

class CPFTestCase(unittest.TestCase):

def testTamanhoCpf(self):
'''Mtodo de teste responsvel por verificar se o CPF
gerado pela funo gera_cpf possui 11 dgitos.
'''

self.failUnlessEqual(len(gera_cpf()), 11, 'O CPF deve


conter 11 dgitos!')

def testDigitoVerificador(self):
'''Mtodo de teste responsvel por verificar se a funo
gera_digito_verificador capaz de gerar valores adequados para o
primeiro e segundo dgito.
'''
cpf = [ 7, 9, 6, 4, 2, 1, 0, 7, 8 ]
self.failUnlessEqual(gera_digito_verificador(cpf), 5,
'Erro na gerao do primeiro dgito verificador, verifique a
lgica da funo.')
cpf.append(5)
self.failUnlessEqual(gera_digito_verificador(cpf), 6,
'Erro na gerao do segundo dgito verificador, verifique a lgica
da funo.')

if __name__ == "__main__":
suite_cpf = unittest.makeSuite(CPFTestCase, 'test')
executor = unittest.TextTestRunner()
executor.run(suite_cpf)

Obviamente, se rodarmos ele agora, com as funes no prontas, vamos ver um erro
de import. Geremos ento as funes, porm sem nenhum cdigo, apenas assim:
def gera_digito_verificador(cpf):
pass
def gera_cpf():
pass

E se rodarmos ele agora, o que acontece?


De acordo com as normas TDD, com nossos testes prontos, podemos enfim
programar nosso requisito! ;) Vamos primeiro criar a funo gera_cpf, que gera nove
dgitos randmicos e depois chama a funo gera_digito_verificador duas vezes para
adicionar os dgitos verificadores ao CPF gerado. Segue a nossa funo gera_cpf:
def gera_cpf():
cpf = []
for x in xrange(9):
cpf.append(random.randint(0, 9))
cpf.append(gera_digito_verificador(cpf))

cpf.append(gera_digito_verificador(cpf))
return cpf

Agora s nos resta concluir nossa funo gera_digito_verificador e executar nosso


teste! ;) Primeiramente, vamos construir a funo de forma incorreta, capaz de gerar
apenas o primeiro:
def gera_digito_verificador(cpf):
multiplicador = 10
multiplos_cpf = []
for x in cpf:
multiplos_cpf.append(x * multiplicador)
multiplicador -= 1
valor_raiz = sum(multiplos_cpf) % 11
return 0 if (valor_raiz < 2) else (11 - valor_raiz)

Desta forma, o primeiro dgito ser encontrado corretamente, porm no segundo,


teremos uma mensagem de erro:
AssertionError: Erro na gerao do segundo dgito verificador, verifique a lgica da
funo.
Ran 2 tests in 0.003s
FAILED (failures=1)

Corrigimos ento a funo e fica assim:


def gera_digito_verificador(cpf):
multiplicador = len(cpf) + 1
multiplos_cpf = []
for x in cpf:
multiplos_cpf.append(x * multiplicador)
multiplicador -= 1
valor_raiz = sum(multiplos_cpf) % 11
return 0 if (valor_raiz < 2) else (11 - valor_raiz)

Feito, agora tudo ok e podemos gerar nossos CPF vontade! ^^

Anda mungkin juga menyukai