Funçoes de teste
Funções de teste de funções
Vamos escrever funções de teste especiais para verificar outras funções:
def dobrar(x): #uma função qualquer
return 2*x
def test_dobrar(): #função de teste associada
"""Chama dobrar(x) para checar se ela funciona."""
x = 4 #alguns valores de x escolhidos
esperado = 8 #resultado esperado da função dobrar(x)
calculado = dobrar(x)
sucesso = calculado == esperado #valor condicional: o teste passou?
msg = 'calculado %s, esperado %s' % (calculado, esperado)
assert sucesso, msg
Regras para funções teste:
- o nome inicia em
test_
; - sem argumentos;
- deve ter uma declaração de sucesso
assert
, onde o sucesso éTrue
se o teste passou eFalse
se não. A linhaassert sucesso, msg
imprime a mensagemmsg
junto com o levantamento do erro quando o teste falha.
Funções teste com vários testes
def dobrar(x): #alguma função
return 2*x
def test_dobrar(): #função teste associada
tol = 1E-14 #tolerância para comparação de ponto flutuante
valores_x = [3, 7, -2, 0, 4.5]
valores_esperados = [6, 14, -4, 0, 9]
for x, esperado in zip(valores_x, valores_esperados):
calculado = dobrar(x)
msg = '%s != %s' % (calculado, esperado)
assert abs(esperado - calculado) < tol, msg
A função teste vai rodar silenciosamente se todos os testes passarem. Se um dos testes acima falhar, o assert
vai levantar um erro de afirmação (AssertionError
).
Porque escrever funções teste de acordo com essas regras?
- Fácil de reconhecer onde funções são verificadas;
- Bibliotecas de teste, como nose e pytest podem rodar automaticamente todas as suas funções teste (em uma árvore de diretórios) e reportar algum erro que tenha passado desapercebido.
- Essa é uma regra padrão muito bem estabelecida.
Recomenda-se o uso do pytest por ter uma saída melhor.
Unidades de teste
Funções de teste como test_dobrar()
é frequentemente referenciada como unidade de teste (test unit) pois testa uma pequena parte (função) do programa. Quando todas as unidades de teste funcionam, o programa supostamente deve funcionar.
Tarefa
A Integral
pode ser aproximada pela regra de Simpson:
Problema:
Faça uma função Simpson(f, a, b, n=500)
para calcular a integral de $f(x)$ pela regra de Simpson, sendo $f(x)$:
(valor exato: 2) para $ n=2,6,12,100,500 $.
Use funções de verificação (mais de uma) para verificar se a função Simpson(f, a, b, n=500)
está integrando corretamente.