Ir para o conteúdo

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 e False se não. A linha assert sucesso, msg imprime a mensagem msg 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.