如何获取TestNG的监听者所采取行动的类的名称?

时间:2013-09-04 09:41:48

标签: java class listener testng

你好,我有一个简单的 testNG 项目,它有一个SampleTest.java类文件,里面有2个测试用例,我已经添加了一个名为MyListener的监听器。为此,我有一个MyListener.java类文件,它扩展了TestNG的 TestListener ,我在打印时传递或失败或跳过,具体取决于测试用例的执行情况。因此,每次运行SampleTest时,我都可以在控制台中看到Pass / fail ..但我希望它与classname

我的问题陈述是,如何在MyListener类中获取测试用例文件名(即Sampletest)??? 我尝试使用stacktrace但没有帮助..因为我猜它不是被调用,但它只是在文件中对测试用例进行操作。请让我知道如何在听众中获得该类的名称????

SampleTest.java:

package com.abc;

import org.testng.annotations.Listeners;
import org.testng.annotations.Test;
@Listeners({ com.mindtree.MyListener.class})
public class SampleTest {

    @Test
    public void SampleTest() throws Exception{
        System.out.println("Hello world");
    }
    @Test
    public void SampleTest1() throws Exception{
        System.out.println("Hello Swarna");
    }
}

MyListener.java:

package com.abc;

import org.testng.ITestResult;
import org.testng.TestListenerAdapter;

public class MyListener extends TestListenerAdapter  {

    private int m_count = 0;

      @Override
      public void onTestFailure(ITestResult tr) {
        log("Fail");
      }

      @Override
      public void onTestSkipped(ITestResult tr) {
        log("Skipped");
      }

      @Override
      public void onTestSuccess(ITestResult tr) {
        log("\nSuccess\n");
      ## WANT TO PRINT HERE THE TESTCASE CLASS NAME
      }

      private void log(String string) {
        System.out.print(string);
        if (++m_count % 40 == 0) {
          System.out.println("");
        }
      }

}

但不适用于多个测试用例文件..只需在MyListener中创建SampleTest对象,通过getter和setter访问类名

5 个答案:

答案 0 :(得分:1)

发布的解决方案都没有为我工作,但是我发现通过以下方式访问“ITestResult”对象可以获得所需的信息:

public void onTestSuccess(ITestResult result) {
    log("\nSuccess\n");
    String className = result.getInstanceName();      
    log(className);
}

注意:上面的代码已在我的环境中成功测试

答案 1 :(得分:0)

您可以通过检查堆栈跟踪来找到:

StackTraceElement trace [] = Thread.currentThread()。getStackTrace(); 你可以通过trace [i] .getClassName()获得调用类。

请注意,这非常昂贵,所以不要在记录器等中使用。

答案 2 :(得分:0)

使用beforeMethod方法,您可以在其中获取方法的名称

@BeforeMethod
public void beforeMethod(final Method method) throws Exception {
String testName = method.getName();
}

答案 3 :(得分:0)

您可以访问ITestResult对象,因此您应该能够:

public void onTestSuccess(ITestResult tr) {
   String className = tr.getMethod().getTestClass().getName();
   System.out.println(className);
}

答案 4 :(得分:0)

根据您的描述,我了解您希望获得@Test带注释的测试方法所在的类的名称,以及只有没有包名称的类名

在您的情况下,将是输出:" SampleTest"。

您可以通过以下方式实现此目的:

public void onTestSuccess(ITestResult tr) {
        log("\nSuccess\n");
        String className = tr.getTestClass().getRealClass().getSimpleName()      
        log(className);
}

@JacekM的解决方案也可以正常工作,但在你的情况下会返回" com.abc.SampleTest"