35

基本上,我有一个拆卸方法,我想登录到刚刚运行测试的控制台。我将如何获得该字符串?

我可以获得类名,但我想要刚刚执行的实际方法。

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实际上应该是什么魔法。

4

5 回答 5

48

在 @AfterMethod 中声明一个 ITestResult 类型的参数,TestNG 将注入它:

@AfterMethod
public void afterMethod(ITestResult result) {
  System.out.println("method name:" + result.getMethod().getMethodName());
}
于 2010-06-01T23:26:16.737 回答
34

If you want to get the method name before the test is executed you can use the following:

import java.lang.reflect.Method;

@BeforeMethod
public void nameBefore(Method method)
{
    System.out.println("Test name: " + method.getName());       
}
于 2012-08-17T10:17:01.227 回答
8

只需声明一个java.lang.reflect.Method参数。

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

但是 TestNG 允许你注入更多;)

  • 任何@Before方法或@Test方法都可以声明类型为 的参数ITestContext
  • 任何@AfterMethod方法都可以声明一个类型的参数ITestResult,这将反映刚刚运行的测试方法的结果。
  • 任何@Before@After方法都可以声明一个XmlTest包含当前标记的类型参数。
  • 任何@BeforeMethod(和@AfterMethod)都可以声明 type 的参数java.lang.reflect.Method。此参数将接收此 @BeforeMethod 完成后(或在为 @AfterMethod 运行的方法之后)将调用的测试方法。
  • 任何@BeforeMethod都可以声明类型为 的参数Object[]。此参数将接收即将被提供给即将到来的测试方法的参数列表,这些参数可以由 TestNG 注入,例如java.lang.reflect.Method或来自@DataProvider.
  • 任何@DataProvider都可以声明类型为ITestContext或的参数java.lang.reflect.Method。后一个参数将接收即将被调用的测试方法。
于 2016-02-29T11:45:46.777 回答
2

TestNG 支持的另一种(虽然不像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)打印到控制台。它将在每次执行测试后执行。

如果您以编程方式生成 testSuite,那么您可以按如下方式添加侦听器,而不是@Listeners({MethodListener.class})在每个测试类上添加

    List<String> listeners = new ArrayList<String>();
    listeners.add(MethodListener.class.getName());
    testSuite.setListeners(listeners);
于 2017-02-07T07:27:14.727 回答
1

在我自己的项目中,我通过 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);
    }
};
于 2019-01-24T04:49:37.123 回答