Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取在testng分解方法中运行的测试方法的名称?_Java_Unit Testing_Testng - Fatal编程技术网

Java 如何获取在testng分解方法中运行的测试方法的名称?

Java 如何获取在testng分解方法中运行的测试方法的名称?,java,unit-testing,testng,Java,Unit Testing,Testng,基本上,我有一个teardown方法,我想将它记录到刚刚运行测试的控制台。我怎么才能拿到那根绳子呢 我可以得到类名,但我需要刚刚执行的实际方法 public class TestSomething { @AfterMethod public void tearDown() { System.out.println("The test that just ran was: " + getTestThatJustRanMethodName()); }

基本上,我有一个teardown方法,我想将它记录到刚刚运行测试的控制台。我怎么才能拿到那根绳子呢

我可以得到类名,但我需要刚刚执行的实际方法

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”


但是,我不知道
getTestThat JustRanMethodName
实际上应该是什么魔力。

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

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

如果要在执行测试之前获取方法名称,可以使用以下命令:

import java.lang.reflect.Method;

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

只需声明一个
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
    的参数,其中包含当前标记
  • 任何@beforethod(和@AfterMethod)都可以声明类型为
    java.lang.reflect.Method的参数。此参数将接收此@BeforeMethod完成后(或在@AfterMethod的方法运行后)将调用的测试方法
  • 任何@BeforeMethod都可以声明
    对象[]
    类型的参数。此参数将接收即将提供给即将到来的测试方法的参数列表,这些参数可以由TestNG注入,例如
    java.lang.reflect.method
    ,也可以来自
    @DataProvider
  • 任何@DataProvider都可以声明类型为
    ITestContext
    java.lang.reflect.Method
    的参数。后一个参数将接收即将调用的测试方法
TestNG支持这一点的另一种方式(尽管没有那么简单)是:

其中,侦听器可能如下所示:

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);
List listeners=new ArrayList();
add(MethodListener.class.getName());
setListeners(监听器);

在我自己的项目中,由于JUnit
@规则,我可以访问这些数据

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

我使用'Reporter.setCurrentTestResult(result);'将报告流更改为测试方法也适用于
@AfterMethod
。。。OP的要求;)不过我还是帮了忙✓对我不起作用org.testng.TestNGException:只能将其中一个注入@AfterClass注释的拆卸中。这个问题是关于testng而不是JUnit的
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);
    }
};