Sexta-feira Jul 17, 2009

Testes parte 2

Um pequeno refactoring do código anteriormente apresentado. Agora é mais fácil testar porque todo o código que conecta no banco fica em apenas uma função, e ao invés de criar stubs e mocks para o banco de dados, basta apenas refazer uma função dentro do código a ser testado

import psycopg2


def execute_query(query):
'Return a array of tuples' conn = psycopg2.connect('dbname=test')
cursor = conn.cursor()
cursor.execute(query)
ret = cursor.fetchall()
conn.close()
return ret


def func1():
ret = execute_query('select count(*) from tabela1')
return ret[0][0]


def func2():
ret = execute_query('select count(*) from tabela2')
return ret[0][0]
return row[0]

E os testes ficaram assim:

import unittest

import mox

import code_to_test

class MyTest(unittest.TestCase):

def setUp(self):
self.mox = mox.Mox()

def tearDown(self):
self.mox.UnsetStubs()

def _aux_exec(self, f, query, retval):
self.mox.StubOutWithMock(code_to_test, 'execute_query')
func = code_to_test.execute_query(query)
func.AndReturn(retval)
self.mox.ReplayAll()
ret = f()
self.mox.VerifyAll()
return ret

def test_func1(self):
f = code_to_test.func1
query = 'select count(*) from tabela1' retval = [(1,)] ret = self._aux_exec(f, query, retval) self.assertEquals(ret, 1) def test_func2(self):
f = code_to_test.func2
query = 'select count(*) from tabela2' retval = [(2,)] ret = self._aux_exec(f, query, retval) self.assertEquals(ret, 2)

Fiz uma função auxiliar nos testes para não repetir código, mas tenho minhas dúvidas se isso é bom. Pra mim, o código do teste deve ser bem simples, para ter a certeza que não tem bugs.

Comments:

Post a Comment:
  • HTML Syntax: Allowed