Wow. Ich habe heute Nacht herausgefunden, dass Python-Unit-Tests, die mit dem unittest
-Modul geschrieben wurden, nicht gut mit der Coverage-Analyse unter dem trace
-Modul funktionieren. Hier ist die einfachste mögliche Unit-Test, in foobar.py
:unittest.py spielt nicht gut mit trace.py - warum?
import unittest
class Tester(unittest.TestCase):
def test_true(self):
self.assertTrue(True)
if __name__ == "__main__":
unittest.main()
Wenn ich diese laufen mit python foobar.py
, erhalte ich diese Ausgabe:
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
Großen. Jetzt möchte ich Deckung Tests so gut funktioniert, so dass ich laufen sie wieder mit python -m trace --count -C . foobar.py
, aber jetzt bekomme ich diese:
----------------------------------------------------------------------
Ran 0 tests in 0.000s
OK
Nein, Python, es ist nicht in Ordnung - du hast nicht mein Test laufen! Es scheint, als ob es im Rahmen von trace
läuft, gumt up unittest
's Test Erkennungsmechanismus. Hier ist die (verrückt) Lösung, die ich kam mit:
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)
Dies ist im Grunde eine Abhilfe, die die abstrakten, unnameable Namen des Top-Level-Modul verdinglicht durch eine Kopie davon vorgetäuscht werden. Ich kann dann diesen Namen an unittest.main()
übergeben, um so zu umgehen, was auch immer trace
auf es hat. Keine Notwendigkeit, Ihnen die Ausgabe zu zeigen; Es sieht genauso aus wie das erfolgreiche Beispiel oben.
Also, ich habe zwei Fragen:
Was ist hier los? Warum macht
trace
vermasseln fürunittest
?Gibt es eine einfachere und/oder weniger wahnsinnige Möglichkeit, dieses Problem zu umgehen?
Große Erklärung, danke. Ich muss dem Testmodul nur sagen, was sein eigener (Datei-) Name ist und es funktioniert wie ein Zauber, sowohl für sich selbst als auch unter trace.py. –
BTW: zu versuchen, cProfile und unittest mit 'python -m cProfile [some_test_file.py]' hat das gleiche Problem, und die gleiche Lösung: 'unittest.main (module = 'Tests')'. Suchmaschinen haben nichts gefunden, was für cProfile spezifisch ist, also fügen Sie einen Kommentar hinzu, um die Suche zu erleichtern. –