如何获取在testng拆卸方法中运行的测试方法的名称?

时间:2010-06-01 18:20:18

标签: java unit-testing testng

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

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

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 个答案:

答案 0 :(得分:40)

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

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

答案 1 :(得分:3)

只需声明一个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 的参数,其中包含当前标记。< / LI>   
  • 任何 @BeforeMethod (以及 @AfterMethod )都可以声明类型为 java.lang.reflect.Method 的参数。此参数将接收将在@BeforeMethod完成后(或在运行@AfterMethod之后的方法之后)调用的测试方法。
  •   
  • 任何 @BeforeMethod 都可以声明 Object[] 类型的参数。此参数将接收即将提供给即将到来的测试方法的参数列表,这些参数可以由TestNG注入,例如 java.lang.reflect.Method ,也可以来自 { {1}} 即可。
  •   
  • 任何 @DataProvider 都可以声明类型为 @DataProvider ITestContext 的参数。后一个参数将接收即将被调用的测试方法。
  •   

答案 2 :(得分:2)

TestNG支持的另一种方法(虽然不像Cedric's answer那么简单)是register a listener

@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);

答案 3 :(得分:2)

在我自己的项目中,我感谢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);
    }
};