基本上,我有一个拆机方法,我想登录到刚刚运行测试的控制台。如何获得该字符串?
我可以获取类名,但我想要刚刚执行的实际方法。
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
应该具有的魔力。
答案 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);
}
};