2017-03-14 3 views
1

Ich schreibe einen Testausführung Listener. Eine kleine Erweiterung für Junit5 Framework. Es ist notwendig zu wissen, welche Klasse verwendet wird, wenn ein bestimmter Test mit TestIdentifier und TestPlan ausgeführt wird.JUnit5 - gibt es eine zuverlässige Möglichkeit, die Klasse eines ausgeführten Tests zu erhalten

((MethodSource) id.getSource().get()).getClassName(); 

Gibt nur die Klasse, wo ein Test deklariert ist. Aber das bedeutet nicht, dass es von deklarierter Klasse ausgeführt wird.

Zum Beispiel kann ein Test von einer Unterklasse ausgeführt werden.

Parsing-Ergebnisse für TestIdentifier#getUniqueId() Können von Fall unterscheiden (Einzeltest für junit4, einzigen Test für junit5, dynamische Prüfung für junit5, parametrisierte Test für junit4 usw.)

In diesem Moment Fall ich nicht gefunden habe jede Möglichkeit, das zu tun.

Gibt es einen zuverlässigen Weg, die Klasse eines ausgeführten Tests zu erhalten?

+0

[TEST] (http://junit.org/junit5/docs/current/api/org/junit/jupiter/api/TestInfo.html) als Parameter verwendet wie beschrieben in [3.9. Dependency Injection] (http://junit.org/junit5/docs/current/user-guide/#writing-tests-dependency- injection) könnte helfen. Zumindest gibt es einen optionalen 'getTestClass()' -Accessor. – Sormuras

+0

Leider ist das nicht der Fall, den ich betrachte. Dem TestExecutionListener ist nicht bekannt, was als Parameter an Testmethoden übergeben wird. Zusätzlich bedeutet es, dass jede Testmethode TestInfo als Parameter haben muss - es ist nicht immer so –

+0

Ich habe Ihre Anforderung möglicherweise nicht genau befolgt. In JUnit4 (und ich nehme 5 an) verwenden wir einige '@ Rule'-Annotationen (eine ist ein TestWatcher(), die andere ist nur TestName()), um einen Teil Ihrer Frage zu beantworten. Wir haben auch Thread.currentThread(). GetStackTrace() verwendet und die richtigen Informationen aus dem Stack-Trace ausgegeben. – KevinO

Antwort

2

Speicher ein Verweis auf TestPlan in testPlanExecutionStarted und die TestSource der TestIdentifier ‚s Eltern inspizieren testPlan.getParent(testIdentifier) verwenden. Wenn es ein ClassSource ist, können Sie auf Class über classSource.getJavaClass() zugreifen.

+0

Die vorgeschlagene Entscheidung funktioniert nicht in allen Fällen, obwohl einige davon abgedeckt werden können.es funktioniert nicht für JUnit5 dynamische Tests Zum Beispiel -. wenn dynamische Test wird durchgeführt wird testPlan.getParent (Identifier) ​​.get() getSource() enthält keine ClassSource Im Fall, wenn junit4 parametrisiert Test run testPlan.getParent (Bezeichner) .get(). getSource() für diesen parametrisierten Test ist null. –

1

Ich fand temporäre Lösung für die beschriebene Situation. Die Idee ist, durch alle Eltern gehen und zuerst finden, die ClassSources enthält, dann verwenden Sie diese ClassSource.

private static String findTestMethodClassName(TestPlan testPlan, TestIdentifier identifier) { 
    identifier.getSource().orElseThrow(IllegalStateException::new); 
    identifier.getSource().ifPresent(source -> { 
     if (!(source instanceof MethodSource)) { 
      throw new IllegalStateException("identifier must contain MethodSource"); 
     } 
    }); 


    TestIdentifier current = identifier; 
    while (current != null) { 
     if (current.getSource().isPresent() && current.getSource().get() instanceof ClassSource) { 
      return ((ClassSource) current.getSource().get()).getClassName(); 
     } 
     current = testPlan.getParent(current).orElse(null); 
    } 
    throw new IllegalStateException("Class name not found"); 
} 

Obwohl diese Lösung meiner Bedürfnisse deckt es macht keine Gewähr, dass Rahmen Verhalten in Zukunft nicht mehr verändert und kann nicht zuverlässig in diesem Moment in Betracht gezogen werden.

Das Problem https://github.com/junit-team/junit5/issues/737 geschrieben

Verwandte Themen