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 formaunittestmecanismo 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?

questionAnswers(2)

yourAnswerToTheQuestion