Java 如何获取在testng分解方法中运行的测试方法的名称?
基本上,我有一个teardown方法,我想将它记录到刚刚运行测试的控制台。我怎么才能拿到那根绳子呢 我可以得到类名,但我需要刚刚执行的实际方法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()); }
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
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);
}
};