Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

[Dúvida] For dentro no test.

Pode / faz sentindo em alguma situação usar um for dentro do teste ? Por exemplo :

def test_quando_calcular_bonus_recebe_1000_deve_retornar_100(self):
        for x in range(0, 10001):
            entrada = x
            esperado = x*0.1

            funcionario_teste = Funcionario('teste', '11/11/2000', entrada)
            resultado = funcionario_teste.calcular_bonus()

            assert resultado == esperado
1 resposta
solução!

Olá, Anderson. Belezinha?

Nesse exemplo que você apresentou não é interessante utilizar um laço for para testar diferentes valores. Isso porque quanto mais testes você tiver em um único método de teste, mais difícil será identificar qual teste falhou em caso de erro. Portanto, é recomendável que você crie um método de teste separado para cada cenário que deseja testar.

Para evitar escrever várias vezes um mesmo teste que possua a mesma lógica, alterando apenas os valores testados no método, é possível utilizar testes parametrizados. Isso permite com que você escreva um único teste e realize o teste para uma lista de valores que será passado como parâmetros do método de teste.

Para entender melhor como os testes parametrizados funcionam, vamos para um exemplo bem simples. Suponha que você queira testar um método de soma de um projeto de calculadora. Assim, teremos um arquivo calculadora.py com o seguinte método soma:

def soma(self, primeiro_valor, segundo_valor):
    return self.primeiro_valor + self.segundo_valor

Para realizar o teste parametrizado, no arquivo de teste, primeiro criamos uma lista de valores que serão testados. Chamaremos essa lista de PARAMETROS_SOMA. Ela possuirá tuplas onde os valores representam respectivamente, o primeiro e segundo valor da soma, e por fim o resultado dessa soma.

import pytest
from calculadora import soma

PARAMETROS_SOMA = [
        (2, 3, 5),
        (10, -5, 5),
        (-5, -2, -7)
    ]

Agora, utilizamos o marcadorparametrize, e passamos para ele como paramentos uma string que possui os nomes das nossas variáveis de teste separados por vírgula, e o vetor que possui nossos valores. Isso indicará que o método escrito a seguir é um teste parametrizado. Por fim, escrevemos o método do teste que recebe essas variáveis que definimos anteriormente.

@pytest.mark.parametrize("primeiro_valor, segundo_valor, resultado_esperado", PARAMETROS_SOMA)
def test_calcula_soma(self,  primeiro_valor, segundo_valor, resultado_esperado):
        resultado = soma(primeiro_valor, segundo_valor)
        assert resultado == resultado_esperado

Desse modo, quando os testes forem executados, vai ser como se tivéssemos definido três funções de teste. Assim, fica fácil identificar aonde está o erro, caso algum teste falhe.

Não é necessário testar todas as situações possíveis em um teste. No exemplo acima, escolhemos testar três situações de soma: a primeira com números positivos, a segunda com um número positivo e outro negativo, e por último a soma entre dois números negativos.

Quando escrevemos nossos testes, o importante é pensar nos diferentes cenários possíveis. Especialmente aqueles que podem gerar algum erro. Garantindo assim, que cada cenário está sendo testado pelo menos uma vez.

Deixo como recomendação de leitura a documentação oficial do Pytest sobre testes parametrizados, para que você possa se aprofundar mais no assunto:

Espero ter ajudado. Qualquer outra dúvida estou a disposição.

Abraços. Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software