web-dev-qa-db-ja.com

testng tear downメソッドで実行されたテストメソッドの名前を取得するにはどうすればよいですか?

基本的に、テストが実行されたばかりのコンソールにログを記録するティアダウンメソッドがあります。その文字列を取得するにはどうすればよいですか?

クラス名は取得できますが、実行されたばかりの実際のメソッドが必要です。

public class TestSomething {

    @AfterMethod
    public void tearDown() {
        System.out.println("The test that just ran was: " + getTestThatJustRanMethodName());
    }

    @Test
    public void testCase() {
       assertTrue(1 == 1);
    }
}

...画面に出力する必要があります:「実行したテストはtestCaseでした」

しかし、私はgetTestThatJustRanMethodNameが実際に持つべき魔法を知りません。

30
Zee Spencer

@AfterMethodでITestResult型のパラメーターを宣言すると、TestNGがそれを注入します。

@AfterMethod
public void afterMethod(ITestResult result) {
  System.out.println("method name:" + result.getMethod().getMethodName());
}
41
Cedric Beust

メソッド名を取得したい場合  テストが実行されると、以下を使用できます。

import Java.lang.reflect.Method;

@BeforeMethod
public void nameBefore(Method method)
{
    System.out.println("Test name: " + method.getName());       
}
24
JacekM

Java.lang.reflect.Methodパラメータを宣言するだけです。

 @BeforeMethod
 public void beforeTestMethod(Method testMethod){
    System.out.println("Before Testmethod: " + testMethod.getName());       
 }

しかし、TestNGではinjectより多くのことができます;)

  • @ Beforeメソッドまたは@ Testメソッドは、タイプITestContextのパラメーターを宣言できます。
  • すべての@ AfterMethodメソッドは、タイプITestResultのパラメーターを宣言できます。これは、実行されたばかりのテストメソッドの結果を反映します。
  • すべての@ Beforeおよび@ Afterメソッドは、現在のタグを含むタイプXmlTestのパラメーターを宣言できます。
  • @ BeforeMethod(および@ AfterMethod)は、タイプJava.lang.reflect.Methodのパラメーターを宣言できます。このパラメーターは、この@BeforeMethodが終了すると(またはメソッドが@AfterMethodを実行した後に)呼び出されるテストメソッドを受け取ります。
  • @ BeforeMethodは、タイプObject[]のパラメーターを宣言できます。このパラメーターは、次のテストメソッドに渡されるパラメーターのリストを受け取ります。これは、Java.lang.reflect.MethodなどのTestNGによって注入されるか、または@DataProvider
  • @ DataProviderは、タイプITestContextまたはJava.lang.reflect.Methodのパラメーターを宣言できます。後者のパラメーターは、呼び出されようとしているテストメソッドを受け取ります。
4
René Link

私自身のプロジェクトでは、JUnit @Ruleのおかげでこのデータにアクセスしています。

String testName;
String className;

@Rule
public TestWatcher watcher = new TestWatcher() {
    public void starting(Description description) {
        testName = description.getMethodName();
        className = description.getClassName();
        logger.info("Starting test " + testName + " in class " + className);
    }
};
2
Y-B Cause

TestNGがこれをサポートするもう1つの方法( Cedricの回答 ほど単純ではありません)は リスナーを登録する です。

_@Listeners({MethodListener.class})
public class ListenerTest {

  @Test
  public void someTest() {
  }

}
_

リスナーは次のようになります。

_public class MethodListener implements IInvokedMethodListener {

  @Override
  public void beforeInvocation(IInvokedMethod method, ITestResult testResult) {

  }

  @Override
  public void afterInvocation(IInvokedMethod method, ITestResult testResult) {
    System.out.println(method.getTestMethod().getMethodName());
  }
}
_

この特定のリスナーは、メソッド名(つまりsomeTest)をコンソールに出力します。 every実行されたテストの後に実行されます。

プログラムでtestSuiteを生成している場合は、各テストクラスに@Listeners({MethodListener.class})を追加する代わりに、次のようにリスナーを追加できます。

_    List<String> listeners = new ArrayList<String>();
    listeners.add(MethodListener.class.getName());
    testSuite.setListeners(listeners);
_
2
Magnilex