3

您好,我有一个简单的testNG项目,它有一个SampleTest.java包含 2 个测试用例的类文件,并且我添加了一个名为 MyListener 的侦听器。为此,我有一个MyListener.java类文件,它扩展了TestNG 的 TestListener,其中我根据测试用例执行打印通过、失败或跳过。所以每次我运行 SampleTest 时,我都可以在控制台中看到 Pass/fail .. 但我希望它带有类名

我的问题陈述是,如何在 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 访问类名

4

5 回答 5

2

根据您的描述,我了解您想要获取 @Test 带注释的测试方法所在的类的名称,并且只获取没有包名的类名

在您的情况下,这将是输出:“SampleTest”。

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

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

@JacekM 的解决方案也可以正常工作,但在您的情况下将返回“com.abc.SampleTest”

于 2015-07-03T12:03:35.510 回答
2

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

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

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

于 2016-11-24T13:48:03.527 回答
0

您有权访问 ITestResult 对象,因此您应该能够:

public void onTestSuccess(ITestResult tr) {
   String className = tr.getMethod().getTestClass().getName();
   System.out.println(className);
}
于 2013-09-04T14:29:58.510 回答
0

您可以通过检查堆栈跟踪来找出答案,例如:

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

请注意,这是相当昂贵的,所以不要在记录器等中使用。

于 2013-09-04T10:12:41.680 回答
0

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

@BeforeMethod
public void beforeMethod(final Method method) throws Exception {
String testName = method.getName();
}
于 2013-09-04T10:18:02.327 回答