386 Stimmen

Einen einzelnen Test von unittest.TestCase über die Befehlszeile ausführen

In unserem Team definieren wir die meisten Testfälle wie folgt:

Eine "Framework" Klasse ourtcfw.py:

import unittest

class OurTcFw(unittest.TestCase):
    def setUp:
        # Etwas

    # Anderes Zeug, das wir überall verwenden wollen

Und viele Testfälle wie testMyCase.py:

import localweather

class MyCase(OurTcFw):

    def testItIsSunny(self):
        self.assertTrue(localweather.sunny)

    def testItIsHot(self):
        self.assertTrue(localweather.temperature > 20)

if __name__ == "__main__":
    unittest.main()

Wenn ich neuen Testcode schreibe und ihn oft ausführen und Zeit sparen möchte, füge ich "__" vor allen anderen Tests ein. Aber das ist umständlich, lenkt mich vom Code ab, den ich schreibe, und der Commit-Lärm, den dies verursacht, ist einfach nur nervig.

Also, wenn ich Änderungen an testItIsHot() vornehme, möchte ich in der Lage sein, dies zu tun:

$ python testMyCase.py testItIsHot

und lassen unittest nur testItIsHot() ausführen

Wie kann ich das erreichen?

Ich habe versucht, den if __name__ == "__main__": Teil umzuschreiben, aber da ich neu in Python bin, fühle ich mich verloren und stoße ständig auf alles andere als die Methoden.

450voto

phihag Punkte 261131

Dies funktioniert, wie von Ihnen vorgeschlagen - Sie müssen einfach auch den Klassennamen angeben:

python testMyCase.py MyCase.testItIsHot

211voto

Ajay M Punkte 2420

Wenn Sie Ihre Testfälle organisieren, d. h. die gleiche Organisation wie der tatsächliche Code befolgen und auch relative Imports für Module im selben Paket verwenden, können Sie auch das folgende Befehlsformat verwenden:

python -m unittest mypkg.tests.test_module.TestClass.test_method

# In Ihrem Fall wäre dies:
python -m unittest testMyCase.MyCase.testItIsHot

Python 3-Dokumentation dazu: Befehlszeilenschnittstelle

92voto

Yarkee Punkte 8394

Es kann gut funktionieren, wie du vermutest

python testMyCase.py MyCase.testItIsHot

Und es gibt einen anderen Weg, um testItIsHot einfach zu testen:

    suite = unittest.TestSuite()
    suite.addTest(MyCase("testItIsHot"))
    runner = unittest.TextTestRunner()
    runner.run(suite)

33voto

skqr Punkte 663

Wenn Sie die Hilfe des Unittest-Moduls überprüfen, werden Sie über verschiedene Kombinationen informiert, die es Ihnen ermöglichen, Testfallklassen aus einem Modul und Testmethoden aus einer Testfallklasse auszuführen.

python3 -m unittest -h

[...]

Beispiele:
  python3 -m unittest test_module               - Führt Tests aus test_module aus
  python3 -m unittest module.TestClass          - Führt Tests aus module.TestClass aus
  python3 -m unittest module.Class.test_method  - Führt den angegebenen Test aus

```lang-none
Es ist nicht erforderlich, eine `unittest.main()` zu definieren, da das Standardverhalten Ihres Moduls ist.

21voto

RayLuo Punkte 14410

TL;DR: Dies würde sehr wahrscheinlich funktionieren:

python mypkg/tests/test_module.py MyCase.testItIsHot

Die Erklärung:

  • Der bequeme Weg

      python mypkg/tests/test_module.py MyCase.testItIsHot

    würde funktionieren, aber die unausgesprochene Annahme ist, dass Sie diesen konventionellen Code-Schnipsel bereits in Ihrer Testdatei haben (typischerweise am Ende).

    if __name__ == "__main__":
        unittest.main()
  • Der unbequeme Weg

      python -m unittest mypkg.tests.test_module.TestClass.test_method

    würde immer funktionieren, ohne dass Sie diesen if __name__ == "__main__": unittest.main() Code-Schnipsel in Ihrer Testquelle haben müssen.

Warum wird also die zweite Methode als unbequem angesehen? Weil es eine Qual wäre, diesen langen, punktgetrennten Pfad von Hand einzugeben. Während bei der ersten Methode der mypkg/tests/test_module.py Teil entweder von einer modernen Shell oder Ihrem Editor automatisch vervollständigt werden kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X