Wie genau funktionieren MbUnits [Parallelizable] und DegreeOfParallelism?

9

Ich dachte, ich hätte verstanden, wie die parallele Testausführung von MbUnit funktioniert hat, aber das Verhalten, das ich sehe, unterscheidet sich ausreichend stark von meiner Erwartung, dass ich vermute, dass etwas fehlt!

Ich habe eine Reihe von UI-Tests, die ich gleichzeitig ausführen möchte. Alle Tests befinden sich in derselben Assembly, die auf drei verschiedene Namespaces aufgeteilt ist. Alle Tests sind völlig unabhängig voneinander, daher möchte ich, dass sie alle parallel ausgeführt werden können.

Zu diesem Zweck lege ich folgendes in die AssemblyInfo.cs:

%Vor%

Nach meinem Verständnis sollte diese Kombination von Assembly-Attributen dazu führen, dass alle Tests als [Parallelizable] betrachtet werden und dass der Test-Runner während der Ausführung acht Threads verwenden sollte. Meine einzelnen Tests sind mit dem Attribut [Test] und sonst nichts gekennzeichnet. Keiner von ihnen ist datengesteuert.

Was ich jedoch tatsächlich sehe, sind höchstens 5-6 Threads, was bedeutet, dass meine Testläufe länger dauern, als sie sein sollten.

Vermisse ich etwas? Muss ich irgendetwas anderes tun, um sicherzustellen, dass alle meine 8 Threads vom Läufer benutzt werden?

N.B. Das Verhalten ist unabhängig davon, welcher Läufer ich verwende, derselbe. Die GUI, die Befehlszeile und die TD.Net-Runner verhalten sich alle wie oben beschrieben, was wiederum dazu führt, dass ich denke, dass ich etwas verpasst habe.

BEARBEITEN: Wie bereits in den Kommentaren erwähnt, verwende ich v3.1 von MbUnit (Update 2 Build 397). Die Dokumentation weist darauf hin, dass das Attribut [parallelizable] der Zusammenstellungsstufe verfügbar ist, aber es scheint auch auf v3.2 zu verweisen obwohl der Rahmen noch nicht verfügbar ist.

BEARBEITEN 2: Zur weiteren Erläuterung ist die Struktur meiner Assembly wie folgt:

%Vor%

EDIT 3: OK, ich habe jetzt bemerkt, dass wenn ich immer nur ein Fixture gleichzeitig laufe, die maximale Anzahl gleichzeitig laufender Tests immer 8 ist. Sobald ich mehrere Fixtures auswähle , fällt es auf entweder 5 oder 6. Wenn ich den Inhalt von zwei Fixtures nehme (derzeit enthalten sie jeweils 12 Tests) und sie in dieselbe Fixture fallen lasse (für insgesamt 24 Tests in dieser Fixture), wird diese Fixture auch immer laufen 8 Tests gleichzeitig.

Dies scheint zu zeigen, dass dies in den einzelnen Tests kein Problem ist, sondern eher darin, wie die Attribute auf der Assembly-Ebene bis zur Fixture reichen oder wie der Test-Runner diese Attribute verwendet.

Zusätzlich beobachtete ich (wenn zwei Fixtures laufen), dass, sobald eine der beiden Fixtures in ihrer Gesamtheit ausgeführt wurde, der Runner mehr Tests gleichzeitig ausführt, wenn er wieder nur eine Fixture laufen lässt. Für mich wird das erste Gerät ausgeführt, wenn 7 Tests im zweiten Gerät laufen. Sobald dies der Fall ist, springt die Anzahl der Tests, die gleichzeitig ausgeführt werden, von den vorherigen 5 oder 6 auf das Maximum von 7.

    
BenA 03.06.2010, 13:13
quelle

3 Antworten

6

Laut Release-Note von < a href="http://gallio.org"> Gallio v3.0.6:

  

MbUnit hilft Ihnen, Ihre Multicore-CPU optimal zu nutzen. Markieren Sie einen beliebigen Test [Parallelizable] und es wird erlaubt, parallel mit anderen parallelisierbaren Tests in der gleichen Fixture zu laufen.

     

Fixtures können auch als parallelisierbar gekennzeichnet werden, damit sie parallel zu anderen parallelisierbaren Fixtures laufen können.

     

     

Bitte beachten Sie, dass Sie, wenn Sie möchten, dass alle Tests innerhalb eines Fixtures als parallelisierbar betrachtet werden, immer [Parallelizable] hinzufügen müssen. (Wir könnten ein Feature hinzufügen, um dies später auf der Fixture- oder Assembly-Ebene zu setzen, basierend auf Benutzer-Feedback.)

     

Beachten Sie auch, dass, nur weil ein Test oder ein Gerät als parallelisierbar gekennzeichnet ist, es nicht bedeutet, dass es parallel zu anderen Tests läuft. Aus Gründen der Effizienz begrenzen wir die Anzahl der aktiven Test-Threads basierend auf dem konfigurierten Parallelitätsgrad. Wenn Sie möchten, dass eine bestimmte Anzahl von Instanzen eines Tests parallel ausgeführt wird, sollten Sie in Erwägung ziehen, [ThreadedRepeat] zu verwenden.

     

Die Einstellung für den Grad der Parallelität steuert die maximale Anzahl von Tests, die MbUnit versuchen wird, parallel zu laufen. Standardmäßig entspricht der Grad der Parallelität der Anzahl der CPUs, die Sie haben, oder mindestens 2.

     

Wenn Sie den Standard nicht mögen, können Sie den Grad der Parallelität auf Assembly-Ebene folgendermaßen überschreiben:

     

Ich weiß nicht, ob es hilft. Vielleicht könnte Jeff mehr Details geben, als er diese Funktion implementiert hat.

    
Yann Trevin 03.06.2010 16:47
quelle
0

Ran in das gleiche Problem, meine Ergebnisse

  • [assembly: Parallelizable (...)] auf Assembly-Ebene überschreibt Fixture Parallelizable attributes und führt dazu, dass Fixture-Tests nacheinander, aber auf einer Fixture-Parallel-Ebene ausgeführt werden. Scheint ein Maximum zwischen 5-6 Fixtures parallel zu haben.
  • [Parallelizable (TestScope.Descendents)] auf Fixture-Ebene führt dazu, dass Fixtures einzeln nacheinander ausgeführt werden, die Tests jedoch parallel ausgeführt werden. Scheint bei Tests parallel keine Max. Zu haben.

Letztendlich ist die einzige Möglichkeit, die Fixture-Level-Attribute zu verwenden und Fixtures-Tests parallel laufen zu lassen, aufgrund der Einschränkung der Montageebene auf der Ebene der Montagevorrichtung.

Ich würde vorschlagen, weniger Fixture und mehr Tests pro Fixture zu schaffen, um dieses Problem zu umgehen. Sie könnten vielleicht immer mehrere Läufer pro Montagevorrichtung starten.

Schade das ist der Fall.

    
kernowcode 08.05.2014 11:58
quelle
-1

Override funktioniert nicht, wenn mehr als 5 Tests gleichzeitig ausgeführt werden. Wir haben 25 Systeme in Soße Labs zur Verfügung, um 25 Skripte gleichzeitig auszuführen, wir überfahren die DegreeOfParallelism auf 20 nur 5 ausgeführt zu einer Zeit. [Assembly: DegreeOfParallelism (20)] - Funktioniert nicht für Mbunit

    
sandeep 22.08.2014 07:55
quelle