Respostas:
A diferença se manifesta quando você tem mais de um método de teste em sua classe. setUpClass
e tearDownClass
são executados uma vez para toda a classe; setUp
e tearDown
são executados antes e depois de cada método de teste.
Por exemplo:
class Example(unittest.TestCase):
@classmethod
def setUpClass(cls):
print("setUpClass")
def setUp(self):
print("setUp")
def test1(self):
print("test1")
def test2(self):
print("test2")
def tearDown(self):
print("tearDown")
@classmethod
def tearDownClass(cls):
print("tearDownClass")
Quando você executa este teste, ele imprime:
setUpClass
setUp
test1
tearDown
.setUp
test2
tearDown
.tearDownClass
(Os pontos ( .
) são unittest
a saída padrão quando um teste passa.) Observe que setUp
e tearDown
aparecem antes e depois de test1
e test2
, enquanto setUpClass
e tearDownClass
aparecem apenas uma vez, no início e no final de todo o caso de teste.
unittest
não considera um teste aprovado até que tearDown
seja concluído sem incidentes.
setUp
e tearDown
são executados uma vez para cada test
método (duas vezes no total neste exemplo), mas setUpClass
e tearDownClass
são executados apenas uma vez cada.
setUp()
e setUpClass()
na unittest
estrutura Python ?A principal diferença (conforme observado na resposta de Benjamin Hodgson) é que setUpClass
é chamado apenas uma vez e antes de todos os testes, enquanto setUp
é chamado imediatamente antes de cada teste. (NB: o mesmo se aplica aos métodos equivalentes em outras estruturas de teste xUnit, não apenas em Python unittest
.)
Da unittest
documentação :
setUpClass()
Um método de classe chamado antes que os testes em uma classe individual sejam executados. setUpClass é chamado com a classe como o único argumento e deve ser decorado como um método de classe ():
@classmethod
def setUpClass(cls):
...
e:
setUp()
Método chamado para preparar o dispositivo de teste. Isso é chamado imediatamente antes de chamar o método de teste; diferente de AssertionError ou SkipTest, qualquer exceção gerada por esse método será considerada um erro, e não uma falha de teste. A implementação padrão não faz nada.
Esta parte da pergunta ainda não foi respondida. De acordo com meu comentário em resposta à resposta de Gearon, o setUp
método se destina a elementos do fixture que são comuns a todos os testes (para evitar a duplicação desse código em cada teste). Acho isso geralmente útil, pois a remoção da duplicação (geralmente) melhora a legibilidade e reduz a carga de manutenção.
O setUpClass
método é para elementos caros que você prefere ter que fazer apenas uma vez, como abrir uma conexão de banco de dados, abrir um arquivo temporário no sistema de arquivos, carregar uma biblioteca compartilhada para teste, etc. Fazer essas coisas antes de cada teste tornaria o conjunto de testes demais, então fazemos isso apenas uma vez antes de todos os testes. Esta é uma pequena degradação na independência dos testes, mas uma otimização necessária em algumas situações. Indiscutivelmente, não se deve fazer tais coisas em testes de unidade, pois geralmente é possível simular o banco de dados / sistema de arquivos / biblioteca / qualquer coisa sem usar a coisa real. Como tal, acho que setUpClass
raramente é necessário. No entanto, é útil quando o teste dos exemplos acima (ou semelhantes) se torna necessário.