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

utilização de método para criação de cenários ao invés do setUp com parâmetros opcionais

Boa noite, Espero que esteja tudo bem com vocês. ( desculpe o "textão" rs mas fiquei com duvida sobre BP rsrs ) Para o caso de não utilizar o método setUp ( nao vi uma forma de passar o callstack por parametro rs )

e utilizar a abordagem de criar um método que receba uma lista de tuple para n novos cenários, instanciando sempre uma nova classe "Avaliador" seria uma pratica "code smell" ? digo conforme o exemplo abaixo:

from unittest import TestCase

from src.leilao.dominio import Usuario, Lance, Leilao, Avaliador


class TestAvaliador(TestCase):
    # outro padrao de nomenclatura:
    # test_quando_adicionados_em_orde_crescente_deve_retornar_o_maior_e_o_menor_valor_de_um_lance

    def list_cenarios(self,cenarios_adicionais: list = []):
        cenarios = [("Gui", 100.0), ("Yuri", 150.0)]
        cenarios.extend(cenarios_adicionais)
        return cenarios

    def criaCenario(self, must_reverse: bool = False, cenarios_adicionais: list = []):

        cenarios = self.list_cenarios(cenarios_adicionais)
        cenarios.sort(key=lambda tup: tup[1], reverse=must_reverse)
        leilao = Leilao("Celular")

        for key, value in cenarios:
            usuario = Usuario(key)
            lance = Lance(usuario, value)
            leilao.lances.append(lance)

        self.avaliador = Avaliador()
        self.avaliador.avalia(leilao)

    def test_deve_retornar_o_maior_e_o_menor_valor_de_um_lance_quando_adicionados_em_ordem_crescente(self):
        self.criaCenario()
        menor_valor_esperado = 100.0
        maior_valor_esperado = 150.0

        self.assertEqual(menor_valor_esperado, self.avaliador.menor_lance)
        self.assertEqual(maior_valor_esperado, self.avaliador.maior_lance)

    def test_deve_retornar_o_maior_e_o_menor_valor_de_um_lance_quando_adicionados_em_ordem_decrescente(self):
        self.criaCenario(True)

        menor_valor_esperado = 100.0
        maior_valor_esperado = 150.0

        self.assertEqual(menor_valor_esperado, self.avaliador.menor_lance)
        self.assertEqual(maior_valor_esperado, self.avaliador.maior_lance)

    def test_deve_retornar_o_mesmo_valor_para_maior_e_menor_lance_quando_leilao_tiver_um_lance(self):
        gui = Usuario("Gui")

        lance_do_gui = Lance(gui, 150.0)

        leilao = Leilao("Celular")
        leilao.lances.append(lance_do_gui)

        avaliador = Avaliador()
        avaliador.avalia(leilao)

        self.assertEqual(150.0, avaliador.menor_lance)
        self.assertEqual(150.0, avaliador.maior_lance)

    def test_deve_retornar_o_maior_e_menor_valor_quando_o_leilao_tiver_tres_lances(self):
        self.criaCenario(cenarios_adicionais=[("Vini", 200.0)])

        menor_valor_esperado = 100.0
        maior_valor_esperado = 200.0

        self.assertEqual(menor_valor_esperado, self.avaliador.menor_lance)
        self.assertEqual(maior_valor_esperado, self.avaliador.maior_lance)

desculpe postar a classe toda rs, mas desta forma consegui manter na maior parte dos métodos a mesma implementação do código para teste, mudando apenas no teste de um lance do leilão. A forma que pensei seria ruim ? obs: nao vi como fazer a mesma coisa utilizando o setUp ( me refiro a inverter a ordem e add novos lances e usuarios rs )

1 resposta
solução!

Faala Rodrigo, como você está? Espero que esteja bem!

Ótima pergunta! Realmente utilizar testes parametrizados com os métodos que a biblioteca unittest nos oferece é um tanto quanto complexo. E não tem problemas em definir o seu próprio método de configuração, a única restrição disso é que terá que invocá-lo manualmente antes de cada teste, o que não é preciso com o setUp. Ao decorrer do curso, o professor irá utilizar outra biblioteca, a Pytest e com ela você conseguirá passar parâmetros diretamente em cada teste e também, configurar um setUp/fixture inicial com parâmetros podem ou não variar ao logo do código.

Qualquer dúvida, fique à vontade. Abraços e bons estudos!