2015-05-17 14 views
8

Ich habe ähnliche Fragen und ich konnte keine Antwort auf mein Problem finden.Reihenfolge der Tests in Python Unit Test

Ich schrieb Tests in einer Python-Klasse, die

class TestEffortFormula(unittest.TestCase) 

von unittest.TestCase leitet Ich brauche einen Auftrag zu den Prüfungen zu geben (bitte, nicht mir sagen, dass ich nicht auf-Test verlassen sollte bestellen, tue ich nur).

Bevor ich brauchte, um die Tests den Befehl I zum Ausführen der Tests verwendet zu geben war:

unittest.main(testRunner=TeamcityTestRunner()) 

Dann habe ich den Auftrag dissappear machen wollte, so habe ich versucht, die folgenden:

loader = unittest.TestLoader() 
loader.sortTestMethodsUsing(None) 
loader.loadTestsFromTestCase(TestEffortFormula) 
suite = loader.suiteClass() 

aber von hier aus weiß ich nicht, wie die Tests zu laufen, speziell mit testRunner=TeamcityTestRunner() wie ich vorher getan habe.

Schätzen Sie Ihre Hilfe

+4

"unittest" gibt keine Garantie über die Reihenfolge der Ausführung. Und wenn Ihre Tests von der Bestellung abhängen, dann führen Sie keine Unit-Tests durch!Der Anfangs- und Endzustand sollte von Setup und Teardown behandelt werden, nicht von anderen Testmethoden. – wim

+1

Ich lese einige Stellen rund um stackoverflow, dass es einen Weg gibt, dies zu tun, ich konnte es einfach nicht unter meinen Bedingungen verstehen. Außerdem habe ich darum gebeten, mir nicht zu sagen, warum ich nicht ... – slashms

+0

Benötigen Sie unittest, oder können Sie ein anderes Framework verwenden? AFAIR-Rüssel ermöglicht Testabhängigkeit. –

Antwort

5

Option 1.

Eine Lösung für dieses (als Behelfslösung) war given here - was darauf hindeutet, step1 die Tests in nummerierte Methoden schreiben, step2 usw., dann sammeln und zu speichern über dir(self) und ergebend sie eine test_ Methode, die try s jeder ist.

Nicht ideal, aber tut, was Sie erwarten. Jede Testsequenz muss eine einzelne TestClass sein (oder die dort angegebene Methode anpassen, um mehr als eine Sequenzgenerierungsmethode zu haben).

Option 2.

Eine andere Lösung, auch in der Frage verknüpft, ist Sie alphabetisch Ihre Tests nennen numerisch sortiert +, so dass sie in dieser Reihenfolge ausgeführt werden.

Aber schreiben Sie in beiden Fällen monolithische Tests, jeder in seiner eigenen Testklasse.

P.S. Ich stimme allen Kommentaren zu, die besagen, dass Komponententests nicht auf diese Weise durchgeführt werden sollten. Es gibt jedoch Situationen, in denen Unit-Test-Frameworks (wie unittest und pytest) sich für Integrationstests eignen, die modulare unabhängige Schritte benötigen, um nützlich zu sein. Auch wenn QA die Dev nicht beeinflussen kann, um modularen Code zu schreiben, müssen diese Dinge getan werden.

0

Ich habe lange gesucht, um dieses Problem selbst zu lösen.
Eine der Antworten in this question macht genau das, was Sie brauchen.

, um Ihren Code angewandt:

ln = lambda f: getattr(TestEffortFormula, f).im_func.func_code.co_firstlineno 
lncmp = lambda _, a, b: cmp(ln(a), ln(b)) 
unittest.TestLoader.sortTestMethodsUsing = lncmp 

suite = unittest.TestLoader().loadTestsFromTestCase(TestEffortFormula) 
unittest.TextTestRunner(failfast=True).run(suite) 

Leider funktioniert Einstellung unittest.TestLoader.sortTestMethodsUsing=None nicht funktioniert, obwohl es documented ist, dass diese in alphabetischer Reihenfolge die Tests Sortierung vermeiden sollten.

+0

Weil 'unittest'' dir() 'aufruft, um eine Liste von (möglichen) Testmethoden zu erhalten und diese sind bereits sortiert ... :-( – nodakai