__init__ para unittest.TestCase

122

Eu gostaria de acrescentar algumas coisas ao que a unittest.TestCaseclasse faz ao ser inicializada, mas não consigo descobrir como fazer isso.

Agora estou fazendo isso:

#filename test.py

class TestingClass(unittest.TestCase):

    def __init__(self):
        self.gen_stubs()

    def gen_stubs(self):
        # Create a couple of tempfiles/dirs etc etc.
        self.tempdir = tempfile.mkdtemp()
        # more stuff here

Gostaria que todos os stubs fossem gerados apenas uma vez para todo este conjunto de testes. Não posso usar setUpClass()porque estou trabalhando no Python 2.4 (também não consegui fazer isso funcionar no Python 2.7).

O que eu estou fazendo errado aqui?

Eu recebo este erro:

 `TypeError: __init__() takes 1 argument (2 given)` 

... e outros erros quando movo todo o código stub para __init__quando o executo com o comando python -m unittest -v test.

saltitante
fonte
@Neeraj Acho que minha pergunta é anterior a essa?
início de
@Abhijeet Esta pergunta foi feita em 2013, a pergunta para a qual você linkou foi feita em 2016 e tem menos respostas e discurso, talvez você deva marcar a outra pergunta como duplicada? A resposta está relacionada ao Python 3 e esta pergunta fala sobre o Python 2.
início de
desculpe por isso meu mal.
Abhijeet

Respostas:

166

Experimente isto:

class TestingClass(unittest.TestCase):

    def __init__(self, *args, **kwargs):
        super(TestingClass, self).__init__(*args, **kwargs)
        self.gen_stubs()

Você está sobrescrevendo o TestCasede __init__, então você pode deixar a classe base lidar com os argumentos para você.

Karthikr
fonte
1 Eu inicializaria a classe base antes de chamar qualquer método de objeto.
Joachim Isaksson
Isso não está funcionando para mim. O material dentro de gen_stub não está sendo executado. De fato, parece que gen_stub não está sendo chamado de forma alguma ... Posso dizer porque o self.tempdir que supostamente existe, não pode ser acessado pelos outros métodos da classe. Recebo um AttributeError: o objeto 'TestingClass' não tem atributo 'tempdir'
encerrado em
22
você não deveria estar chamando isso em setUpvez de substituir __init__?
karthikr
2
@karthikr Quero gerar os stubs uma vez para todos os testes, em vez de recriá-los para todos os testes todas as vezes. Alguns dos stubs nem serão usados ​​por alguns dos testes. Eu usaria setUpClass, mas não acho que python 2.4 seja compatível.
vencido em
2
Você também pode ser um pouco mais explícito neste caso (o que ajuda na legibilidade, na minha opinião) e usar: em unittest.TestCase.__init__(self,*args,**kwargs)vez desuper(TestingClass, self).__init__(*args, **kwargs)
Onyooo
22

Só queria adicionar alguns esclarecimentos sobre como substituir a função init do

unittest.TestCase

A função será chamada antes de cada método em sua classe de teste. Por favor, note que se você quiser adicionar alguns cálculos caros que devem ser realizadas uma vez antes de executar todos os métodos de teste Utilize a SetUpClass classmethod

@classmethod
def setUpClass(cls):
    cls.attribute1 = some_expensive_computation()

Esta função será chamada uma vez antes de todos os métodos de teste da classe. Consulte Recursos setUppara obter um método chamado antes de cada método de teste.

Thomas Vetterli
fonte
4

Instale unittest2 e use o unittest desse pacote.

import unittest2 

e usar a classe setupModule / tearDownModule ou setupClass / tearDown para lógica de inicialização especial

Mais informações: http://www.voidspace.org.uk/python/articles/unittest2.shtml

Também é muito provável que você esteja criando mais um teste de integração do que um teste de unidade. Escolha um bom nome para os testes para diferenciá-los ou coloque em um módulo de contêiner diferente.

fabrizioM
fonte
Obrigado pelo link de documentação.
Chris