Deaktivieren Sie einzelne Python-Komponententests vorübergehend

127

Wie können einzelne Komponententests vorübergehend deaktiviert werden, wenn das unittestModul in Python verwendet wird?

Coelhudo
quelle

Antworten:

228

Einzelne Testmethoden oder Klassen können beide mit dem unittest.skipDekorator deaktiviert werden .

@unittest.skip("reason for skipping")
def test_foo():
    print('This is foo test case.')


@unittest.skip  # no reason needed
def test_bar():
    print('This is bar test case.')

Weitere Optionen finden Sie in den Dokumenten zum Überspringen von Tests und erwarteten Fehlern .

Yoni
quelle
9
In Python 3 @unittest.SkipTestfunktioniert @unittest.skip
Akifs
7
Ich benutze Python 3.6.1 und @unittest.skipfunktioniert auch gut.
Pete
2
@Pete in Python 3.4.0 @unittest.skipfunktioniert nicht.
Lebensbalance
Wie kann verhindert werden, dass die Kinderklassen übersprungen werden?
Rubenjohn
Die Anmerkung würde nur auf eine einzelne Testmethode angewendet. Beabsichtigen Sie eine übergeordnete Klasse mit Testmethoden, und nur bei einigen untergeordneten Klassen ist die Methode deaktiviert? Ich stelle mir vor, dass dies möglich ist, obwohl Sie möglicherweise die Eltern- / Kinderklassen entsprechend gestalten müssen. Können Sie das Szenario, das Sie lösen möchten, anhand eines Spielzeugbeispiels erläutern?
Yoni
26

Sie können Dekoratoren verwenden, um den Test zu deaktivieren, mit dem die Funktion umbrochen werden kann, und um zu verhindern, dass der Googletest- oder Python-Komponententest den Testfall ausführt.

def disabled(f):
    def _decorator():
        print f.__name__ + ' has been disabled'
    return _decorator

@disabled
def testFoo():
    '''Foo test case'''
    print 'this is foo test case'

testFoo()

Ausgabe:

testFoo has been disabled
GTM
quelle
11

Die neueste Version (2.7 - unveröffentlicht) unterstützt das Überspringen / Deaktivieren von Tests auf diese Weise . Sie können dieses Modul einfach herunterladen und für Ihre vorhandene Python-Installation verwenden. Es wird wahrscheinlich funktionieren.

Vor diesem, habe ich die Tests umbenennen wollte ich übersprungen xtest_testnameaus test_testname.


Hier ist ein kurzes Elisp-Skript, um dies zu tun. Mein Elisp ist etwas rostig, deshalb entschuldige ich mich im Voraus für etwaige Probleme. Ungetestet.

  (defun disable_enable_test ()
  (interactive "")
  (save-excursion
    (beginning-of-line)
    (search-forward "def")
    (forward-char)
    (if (looking-at "disable_")
    (zap-to-char 1 ?_)
      (insert "disable_"))))
Noufal Ibrahim
quelle
+1, aber in dem gesamten Projekt, an dem ich arbeite, verwenden alle Python v2.6.2, und ich glaube nicht, dass sich dies ändern wird: /, aber es ist eine Lösung, danke
coelhudo
Sie könnten Ihren Editor ein wenig optimieren, um Ihnen ein Makro zum Aktivieren / Deaktivieren eines Testfalls zu geben, aber ich spreche als Emacs-Benutzer so ... :)
Noufal Ibrahim
Ich bin auch ein Emacs-Benutzer. Haben Sie ein Makro erstellt?
Coelhudo
Nee. Ich lasse sie einfach scheitern, aber es ist nicht so schwer. Ich habe die Antwort jedoch mit einem Quickie aktualisiert.
Noufal Ibrahim
Diese akzeptierte Antwort ist keine Antwort, sondern nur ein Link. Die wirkliche, aktuelle Antwort ist auch nicht die am besten gewählte. Zugegeben, es ist 4 Jahre alt. Das unentgeltliche Elisp verschleiert lediglich.
jwd630
10

Es reicht aus, den @unittest.SkipTestDekorateur einfach über dem Test zu platzieren.

Akif
quelle
Ich weiß nicht, wer es getan hat. Aber ich habe die Dokumentation gelesen und es heißt, dass SkipTest eine Ausnahme ist. Auf jeden Fall unterscheidet es sich von unittest.skip in dem Sinne, dass skip den Test niemals ausführt (wodurch er deaktiviert wird), während der Zweck von SkipTest ausgelöst werden soll, wenn während der Ausführung des Tests etwas Unerwartetes auftritt. Habe ich recht? Interessant hart.
Coelhudo
unittest.skip(ohne Grund) gibt mir Fehler in Python 2, aber nicht in Python 3.
Akif
5

Ich benenne gerade eine Testfallmethode mit einem Unterstrich um: test_myfunc wird zu _test_myfunc.

MattK
quelle
3

In den Dokumenten für 2.1 ist keine Ignorier- oder Überspringmethode angegeben.

Normalerweise blockiere ich jedoch Kommentare, wenn dies erforderlich ist.

Finglas
quelle
1

Wenn Sie sich auf den Teil der Frage "vorübergehend deaktiviert" konzentrieren, hängt die beste Antwort etwas vom Anwendungsfall ab. Der Anwendungsfall, der mich hierher gebracht hat, ist, dass ich eine testgetriebene Entwicklung für eine Funktion durchführe. In diesem Prozess schreibe ich nacheinander Tests und verwende häufig Haltepunkte in der Funktion zum Debuggen. Wenn ich jedes Mal, wenn ich den Testläufer ausführe, alle Tests durchführe, halte ich an Haltepunkten für Tests an, die bereits funktionieren. Das Hinzufügen von "Überspringen" oder das Munging des Testnamens oder ähnliches ist nicht das, was ich möchte, da ich nach dem Schreiben der Funktion möchte, dass alle Tests ausgeführt werden. Wenn ich "überspringen" verwenden würde, müsste ich zurückgehen und "überspringen".

Für meinen Anwendungsfall liegt die Lösung im Testläufer, nicht im Testcode. Ich benutze Pytest . Mit pytest ist es einfach, einen einzelnen Test über die Befehlszeile anzugeben:

pytest PYTHON_FILENAME.TEST_CLASS.TEST_NAME

(Ersetzen Sie die Kappen durch Ihre Werte).

Ich verstehe, dass diese Frage für Python-Unitest war. Ich habe das schon lange nicht mehr benutzt. Ich wäre nicht überrascht, wenn es etwas Ähnliches wie Pytest hätte. Wenn nicht, können Sie einfach zu pytest wechseln. Sie müssen Ihren Code nicht ändern. Installieren Sie es einfach und ändern Sie Ihren Testrunner-Befehl.

Außerdem benutze ich PyCharm Pro. Auf der Seite, auf der mein Testcode angezeigt wird, befindet sich für jeden Test neben dem Def ein kleines Symbol. Ich kann auf dieses Symbol klicken und diesen Test einzeln ausführen.

Futter
quelle