2011-01-17 13 views
33

Pythons NOSE-Testframework hat das Konzept running multiple tests in parallel.Kann Python's Unittest parallel testen, wie Nase?

Der Zweck dies ist nicht, Parallelität im Code zu testen, sondern Tests für Code, die "keine Nebenwirkungen, keine Probleme bei der Bestellung und keine externen Abhängigkeiten" schneller ausgeführt werden. Der Leistungszuwachs ergibt sich aus gleichzeitigen E/A-Wartevorgängen beim Zugriff auf verschiedene Geräte, der besseren Verwendung von mehreren CPUs/Kernen und dem parallelen Ausführen von time.sleep() - Anweisungen.

Ich glaube, das gleiche könnte mit Python Unittest Testrahmen getan werden, mit einem Plugin Test Runner.

Hat jemand irgendeine Erfahrung mit solch einem Biest gehabt, und können sie irgendwelche Empfehlungen machen?

+1

Ähnlich wie http: // stackoverflow.com/questions/2074074/how-to-speedup-python-unittest-auf-muticore-maschinen – Macke

Antwort

17

Der eingebaute Tester von Python unittest führt keine Tests parallel durch. Es wäre wahrscheinlich nicht schwer, einen zu schreiben, der das tat. Ich habe mein eigenes geschrieben, um die Ausgabe und die Zeit für jeden Test neu zu formatieren. Das dauerte vielleicht einen halben Tag. Ich denke, dass Sie die TestSuite-Klasse, die mit einer abgeleiteten verwendet wird, die Multiprozess verwendet, ohne viel Mühe austauschen können.

+1

Ich habe diese Antwort akzeptiert, weil die Implikation ist, dass es keine Standardversion gibt, die jetzt verfügbar ist. – Oddthinking

+0

@Oddthinking hast du das jemals gemacht? – wkschwartz

+0

@wkschwartz: Nicht so. Ich habe mit einem Multi-Prozess-Test-Running-Code gespielt, der völlig unabhängig vom Unittest-Framework ist. Es erforderte die Untersuchung jedes Testfalls, um zu bestätigen, dass es völlig unabhängig von jedem anderen Test war - viele Tests hatten unvorhergesehene Interaktionen. – Oddthinking

15

Das Paket testtools ist eine Erweiterung von unittest, die das gleichzeitige Ausführen von Tests unterstützt. Es kann mit Ihren alten Testklassen verwendet werden, die unittest.TestCase erben.

Zum Beispiel:

import unittest 
import testtools 

class MyTester(unittest.TestCase): 
    # Tests... 

suite = unittest.TestLoader().loadTestsFromTestCase(MyTester) 
concurrent_suite = testtools.ConcurrentStreamTestSuite(lambda: ((case, None) for case in suite)) 
concurrent_suite.run(testtools.StreamResult()) 
+2

Habe das heute getestet und meine Tests laufen immer noch in der Reihenfolge :-( –

0

Wenn das ist, was Sie
runner = unittest.TextTestRunner() 
runner.run(suite) 

zunächst

tat ---------------------- -------------------

ersetzen sie es mit

from concurrencytest import ConcurrentTestSuite, fork_for_tests 

concurrent_suite = ConcurrentTestSuite(suite, fork_for_tests(4)) 
runner.run(concurrent_suite) 
+0

Woher kam dieses Modul? Ist es dieses: https://github.com/cgoldberg/concurrencytest? – Oddthinking

2

Bitte verwenden pytest-xdist, wenn Sie parallel laufen wollen.

Der pytest-XDIST Plugin erweitert py.test mit einigen einzigartigen Testausführungsart:

  • Testlauf Parallelisierung: Wenn Sie mehrere CPUs oder Hosts haben Sie die für einen kombinierten Testlauf nutzen können. Dies ermöglicht es, die Entwicklung zu beschleunigen oder spezielle Ressourcen von entfernten Maschinen zu verwenden.

[...]

Weitere Informationen: Rohan Dunham's blog

+0

Wenn du auch einen junitxml-Bericht erstellen willst, Dann ist dies deine einzige Wahl –

1

Wenn Sie nur Python3 suport benötigen, sollten Sie meine fastunit verwenden.

Ich ändere nur ein paar Code von unittest, so dass Testfall als Korutinen ausgeführt werden.

Es hat wirklich meine Zeit gerettet.

Ich habe es gerade letzte Woche fertig, und vielleicht nicht genug testen, wenn irgendein Fehler passiert, lass es mich wissen, damit ich es besser machen kann, danke!

Verwandte Themen