2012-08-17 10 views
13

Ich arbeite an Tests für eine Web-Anwendung in Python geschrieben.Python-Nasetests überspringen bestimmte Tests

Angenommen, ich habe 5 Tests in meinem Modul test_login.py.

Jeder einzelne Test ist eine Klasse.

Es gibt oft einen Basistest, der die TestFlow-Klasse erweitert, die unsere vordefinierte Testklasse ist.

Und dann erweitern andere Tests in diesem Modul diesen Basistest.

Zum Beispiel:

#The base test 

TestLogin(TestFlow): 
    #do login_test_stuff_here 

#Another test in the same module 

TestAccountDetails(TestLogin) 
    #do account_details_test_stuff_here 

... 

Es ist eigentlich ganz praktisch, denn um zum Beispiel zu testen AccountDetails Benutzer werden muss angemeldet, so kann ich nur von TESTLOGIN Test erben, und ich bin bereit, andere Funktionalität zu testen als angemeldeter Benutzer.

Alle Tests befinden sich im Ordner Projekt/Projekt/Tests.

Wir verwenden Nasetests mit Option - mit-Pylonen, um Tests durchzuführen.

Und meine Frage ist, wenn es eine Möglichkeit gibt, bestimmte TestClass als "nicht testen Sie dieses" zu markieren.

Weil ich keine Zeit verschwenden möchte, um diese "Basistests" direkt auszuführen, weil sie durch andere Tests ausgeführt werden, die iherit von ihnen sind.

Es wird wahrscheinlich Töne dieser Tests geben und ich möchte jede einzelne Sekunde dort speichern, wo es möglich ist.

Ich habe bereits festgestellt, so etwas wie überspringen, SkipTest oder @nottest, aber diese nur Arbeit für test_methods innerhalb eines ceratin Testclass, so dass ich glaube nicht, dass es hier arbeitet, wurde Ich habe eine einzige Klasse für jeden Testfall.

Antwort

2

http://nose.readthedocs.org/en/latest/writing_tests.html

Writing Tests

Wie bei py.test, Nase Tests müssen nicht Subklassen von unittest.TestCase. Jede Funktion oder Klasse, die dem konfigurierten regulären TestMatch-Ausdruck entspricht ((?:^| [\ B _ \ .-]) [Tt] est) standardmäßig - dh Test oder Test an einer Wortgrenze oder nach einem - oder _) und Leben in einem Modul, das auch diesen Ausdruck entspricht, wird als ein Test ausgeführt. Aus Kompatibilitätsgründen zu älteren Unittest-Testfällen lädt nose auch Tests von unittest.TestCase-Unterklassen wie unittest. Wie py.test führt nose Funktionstests in der Reihenfolge durch, in der sie in der Moduldatei erscheinen. TestCase-abgeleitete Tests und andere Testklassen werden in alphabetischer Reihenfolge ausgeführt.

beachten Sie die Regex und Regel oben. Benennen Sie Ihre Funktionen/Methoden/Klassen so, dass sie nicht mit der Regex übereinstimmen, und sie werden nicht ausgeführt.

das gesagt wird, empfehle ich nicht Ihren Vorschlag Verkettung Vererbung für Tests. Es ist ein Rezept für Frustration und Chaos.

wäre es wahrscheinlich besser, eine Mixinklasse zu erstellen oder eine Basisklasse zu definieren, die keine eigentlichen Tests enthält - aber viele Hilfsfunktionen, die erbende Klassen aufrufen und als eigene verwenden können.

Wenn Sie die Tests der populäreren Pakete betrachten, verwenden sie fast alle diesen Ansatz.

+0

Beachten Sie, dass die Übereinstimmung Regex ist nicht das einzige Tor für die Aufnahme - * Nase wird auch Tests von unittest.TestCase-Unterklassen * laden. Es scheint dies für alles zu tun, was es auch importiert. Ich habe einen Test namens 'FooMixin' in einem Modul namens' foo_helpers.py', das als Test behandelt wird, einfach weil es von 'unittest.TestCase' abgeleitet ist. –

12

Formular nosetests kann es durch die Angabe der Attribute wie unten erfolgen http://nose.readthedocs.org/en/latest/plugins/attrib.html

Oft beim Testen Sie Tests auf Basis von Kriterien wählen wollen, anstatt einfach nach Dateinamen. Beispielsweise möchten Sie möglicherweise alle Tests außer den langsamen ausführen. Sie können dies mit dem Attributauswahl-Plugin tun, indem Sie Attribute für Ihre Testmethoden festlegen. Hier ein Beispiel:

def test_big_download(): 
    import urllib 
    # commence slowness... 

test_big_download.slow = 1 

Sobald Sie ein Attribut zugewiesen haben langsam = 1 Sie diesen Test und alle anderen Tests ausschließen kann durch das langsame Attribut Lauf

$ nosetests -a '!slow' 
2

Sie verwenden können, tatsächlich der Skipptest für Klassen auch.

import unittest 

@unittest.skip("Class disabled") 
class TestLogin(TestFlow): 
    ... 
+0

Beachten Sie, dass Sie für Python <= 2.6 unittest2 installieren müssen, damit dies funktioniert. – gaborous

+1

Das funktioniert nicht für den mitgelieferten Anwendungsfall. Das Hinzufügen des Überspringen-Dekorators zur Basisklasse führt dazu, dass alle Unterklassen ebenfalls übersprungen werden. Selbst wenn Sie '@ unittest.skipIf (True," Basisklasse ")' für die Basisklasse und '@ unittest.skipIf (False," ") für die Unterklassen verwenden, werden die Unterklassen immer noch übersprungen –

Verwandte Themen