2009-04-09 6 views
22

In unserem Projekt betreiben wir sowohl junits als auch cobertura mit maven. Das Problem, dem ich gegenüberstehe, ist, dassläuft junits und cobertura mit maven

  1. junit Testfälle zweimal ausgeführt werden, einmal vor dem JAR-Erstellungsvorgang und dann noch einmal zum Generieren von Cobertura-Deckungsberichten. Wenn wir cobertura und junits mit Ameisen laufen lassen, betreiben wir junits nur einmal, da cobertura mit junits einhergeht. Gibt es eine Möglichkeit, den obigen Fall mit Maven zu konfigurieren. Ich weiß, dass wir die Eigenschaft "maven.test.skip" verwenden können, um Junits zu überspringen. Aber wenn ich das mache, kann ich keine junit xml & html Dateiberichte sehen.
  2. Auch in Maven, wie junits in Batch oder parallel ausgeführt werden?

danke!

+0

Ihre zweite Frage ist wirklich ein separates Problem, cna scheint hier erneut veröffentlicht werden: http://StackOverflow.com/Questions/423627/Running-Junit-Tests-in-Parallel –

Antwort

22

Während ich die genaue Seite nicht mehr finden kann, habe ich kürzlich eine Diskussion darüber gelesen, warum es zwei gute Gründe sind, die Tests zweimal durchzuführen. Die Hauptprobleme, die zitiert wurden, betrafen die Auswirkungen der Änderung des Cobertura-Bytecodes auf die Genauigkeit Ihrer Tests. In bestimmten Fällen kann das Timing Ihrer Codeausführung wichtig sein. Die Änderung des Bytecodes kann dazu führen, dass Tests, die in JUnit fehlschlagen, bestanden werden, wenn sie nur in Cobertura ausgeführt werden und umgekehrt. Aus diesem Grund wurde empfohlen, dass die Tests zweimal ausgeführt werden dürfen. Die meisten der genannten Beispiele beziehen sich auf Multi-Threaded-Verhalten, aber ich stelle mir vor, dass es andere Fälle geben könnte, in denen die Byte-Code-Änderung Probleme in Ihren Tests verursachen könnte. Wenn die Tests auf beide Arten durchgeführt werden, erhalten Sie Baseline-Ergebnisse und verringern auch die Chancen, Sie auf eine wilde Jagd zu schicken, wenn Cobertura tatsächlich den Test-Erfolg verändert.

+4

Das ist ein toller Punkt. Eine andere Sache, auf die ich einmal gestoßen bin, ist, dass aufgrund des Bytecode-Umschreibens, wenn Ihr Code viel Reflexion verwendet, dies Probleme verursachen kann. Wenn Sie beispielsweise über ein Dienstprogramm verfügen, das Felder aus einer Klasse extrahiert, und Ihr Komponententest bestätigt, dass eine Beispielklasse über drei Felder verfügt, schlägt dieser Test tatsächlich fehl, wenn Sie ihn mit Codeabdeckung ausführen. –

+0

Ganz zu schweigen von der Tatsache, dass Tests ohne Instrumentierung viel schneller laufen. –

+0

@DavidValeri: Könnten Sie bitte einen Link zu dem Diskussionsthread angeben, auf den Sie verweisen (bearbeiten Sie einfach unseren Beitrag)? –

1

Versuchen Sie, Cobertua als Kompilierbereichsreferenz hinzuzufügen. Und poste die relevanten Teile deines Poms.

+3

Wäre nicht als Abhängigkeit (mit kompilieren scope) nur hilfreich sein, wenn Ihr Projekt irgendwie versucht, etwas über cobertura zu bauen? Das ist wahrscheinlich nicht das, wonach Ajay gesucht hat. –

1

Dies passiert, weil die Berichtsausführung die Testausführung erfordert, damit die Berichte erstellt werden können. Wenn auf dem Website-Plug-in, das nicht über die @requiresDependencyResolution test-Annotation verfügt, ein "site-only" -Ziel vorhanden wäre, könnte es an die Phase prepare-package des Projekts gebunden sein und Ihre Berichte würden generiert, ohne dass die Tests zweimal ausgeführt werden.

Leider scheint es derzeit kein solches Ziel zu geben (siehe meine question zum Thema). Siehe meine Antwort auf die Frage für Details einer Problemumgehung.