Explique os métodos Python “setUp” e “tearDown” usados ​​em casos de teste

93

Alguém pode explicar o uso de Python's setUpe tearDownmétodos ao escrever casos de teste, além de que setUpé chamado imediatamente antes de chamar o método de teste e tearDowné chamado imediatamente após ter sido chamado?

NOVATO
fonte

Respostas:

85

Em geral, você adiciona todas as etapas de pré-requisito para configurar e todas as etapas de limpeza para tearDown.

Você pode ler mais com exemplos aqui .

Quando um método setUp () é definido, o executor de teste executará esse método antes de cada teste. Da mesma forma, se um método tearDown () for definido, o executor de teste invocará esse método após cada teste.

Por exemplo, você tem um teste que requer a existência de itens, ou certo estado - então você coloca essas ações (criar instâncias de objeto, inicializar db, preparar regras e assim por diante) no setUp.

Além disso, como você sabe, cada teste deve parar no local onde foi iniciado - isso significa que temos que restaurar o estado do aplicativo ao seu estado inicial - por exemplo, fechar arquivos, conexões, remover itens recém-criados, chamar o retorno de chamada de transações e assim por diante - tudo isso etapas devem ser incluídas no tearDown.

Portanto, a ideia é que o teste em si deve conter apenas ações que devem ser realizadas no objeto de teste para obter o resultado, enquanto setUp e tearDown são os métodos para ajudá-lo a deixar seu código de teste limpo e flexível.

Você pode criar um setUp e tearDown para vários testes e defini-los em uma classe pai - portanto, seria fácil para você oferecer suporte a esses testes e atualizar preparações e limpezas comuns.

Se você está procurando um exemplo fácil, use o seguinte link com o exemplo

Artsiom Rudzenka
fonte
54

Você pode usá-los para fatorar o código comum a todos os testes no conjunto de testes.

Se você tiver muitos códigos repetidos em seus testes, poderá torná-los mais curtos movendo este código para setUp / tearDown.

Você pode usar isso para criar dados de teste (por exemplo, configurar fakes / mocks) ou remover funções com fakes.

Se você estiver fazendo um teste de integração, pode usar a verificação das pré-condições ambientais na configuração e pular o teste se algo não estiver configurado corretamente.

Por exemplo:

class TurretTest(unittest.TestCase):

    def setUp(self):
        self.turret_factory = TurretFactory()
        self.turret = self.turret_factory.CreateTurret()

    def test_turret_is_on_by_default(self):
        self.assertEquals(True, self.turret.is_on())

    def test_turret_turns_can_be_turned_off(self):
        self.turret.turn_off()
        self.assertEquals(False, self.turret.is_on())
Matt Curtis
fonte
16
+1 porque as 9 linhas de código são tudo que eu preciso para grocar 100%. Exemplo elegante e conciso. Para ser sincero, essas 9 linhas são a única coisa que li na página além da pergunta, que também era minha. Você disse algo em inglês antes do exemplo de código? Não foi necessário! O código disse tudo! Obrigado Matt.
Nathan C. Tresch
2
Não estou claro como "pule o teste se algo não estiver configurado corretamente" está sendo demonstrado aqui. Ou foi apenas um aparte?
user5359531
6

Suponha que você tenha uma suíte com 10 testes. 8 dos testes compartilham o mesmo código de configuração / desmontagem. Os outros 2 não.

a configuração e a desmontagem fornecem uma boa maneira de refatorar esses 8 testes. Agora o que você faz com os outros 2 testes? Você os moveria para outro testcase / suite. Portanto, usar configuração e desmontagem também ajuda a fornecer uma maneira natural de dividir os testes em casos / suítes

John La Rooy
fonte
1
Às vezes, não é desejável mover os testes para outro caso de teste. Nesse caso, você pode escrever um decorador com o código de configuração / desmontagem e apenas decorar as funções de teste desejadas.
Matthijs
2
Isso não é de forma alguma uma resposta à pergunta.
acelerado em