O unittest.py não funciona bem com o trace.py - por quê?
Uau. Eu descobri hoje à noite que testes de unidade Python escritos usando ounittest
módulo não funciona bem com a análise de cobertura sob otrace
módulo. Aqui está o teste de unidade mais simples possível, emfoobar.py
:
import unittest
class Tester(unittest.TestCase):
def test_true(self):
self.assertTrue(True)
if __name__ == "__main__":
unittest.main()
Se eu executar isso compython foobar.py
, Recebo esta saída:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Ótimo. Agora, também quero executar o teste de cobertura, então o executo novamente compython -m trace --count -C . foobar.py
, mas agora eu entendi:
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Não, Python, não está tudo bem - você não executou meu teste! Parece que funciona no contexto detrace
de alguma formaunittest
mecanismo de detecção de teste. Aqui está a solução (insana) que eu criei:
import unittest
class Tester(unittest.TestCase):
def test_true(self):
self.assertTrue(True)
class Insane(object):
pass
if __name__ == "__main__":
module = Insane()
for k, v in locals().items():
setattr(module, k, v)
unittest.main(module)
Essa é basicamente uma solução alternativa que reifica o nome abstrato e inominável do módulo de nível superior, falsificando uma cópia dele. Eu posso então passar esse nome paraunittest.main()
de modo a evitar qualquer efeitotrace
tem nele. Não há necessidade de mostrar a saída; parece exatamente com o exemplo de sucesso acima.
Então, eu tenho duas perguntas:
O que está acontecendo aqui? Porquetrace
estragar tudo porunittest
?
Existe uma maneira mais fácil e / ou menos insana de contornar esse problema?