testNG:如何在@AfterMethod或者监听器中捕获测试用例的返回值?

时间:2012-10-04 16:21:17

标签: testng

只是为了设置上下文,我的测试用例创建了一些数据,我想在拆解时删除那些数据。我想以这样的方式实现通用的拆解过程(通过AfterMethod / AfterClass / Listener),它将检查返回值(及其类型,主要是域对象)并清理数据(如下所示)。

public class SampleTest {

@AfterMethod
public void teardown(Object returnValueFromTest){
    //inspect returnValueFromTest and perform necessary clean up.
}

@Test
public String testEventGeneration(){
    //generate event

    //returning generated event id.
    return "E1234";
}

@Test
public Market testMarketGeneration(){
    //generate market

    //returning generated market.
    return someMarket;
}}

关于如何在testNG中实现这一点的任何想法/想法?我考虑过像IHookable那样实现一个监听器,但找不到可以帮助我获得返回值的监听器。

3 个答案:

答案 0 :(得分:1)

你可以简单地处理这个问题,如果你想在执行完所有测试后将所有内容都清空,你必须使用@AfterClass注释而不是@AfterMethod注释。 @AfterMethod注释在测试类中的每个测试方法之后触发。

流动的代码将完成您的任务。如果要在列表器级别实现此功能,可以实现 ITestListener ,并且在onFinish方法中可以实现逻辑。

公共类SampleTest { private String event_id = null;

@AfterClass(alwaysRun = true)
public void teardown(){
    //delete event from the db(event_id) 

}

@Test
public void testEventGeneration(){
    //generate event

    //returning generated event id.
    event_Id= "E1234";
}}

答案 1 :(得分:0)

如果有与之关联的返回值,AFAIK Testng甚至不会执行注释为Test的方法。

因此,如果您想根据设置的值进行拆分,则需要在全局上下文或外部设置这些值,而不是作为返回值。根据您想要拆除的时间,您可以将您的拆卸逻辑作为侦听器或任何After方法编写。

答案 2 :(得分:0)

你考虑过使用InvokedMethodListener2吗?

public Class BaseTestNg {

    ITestContext ctx;

    public ITestContext getContext(){
        return this.ctx;
    }

    @BeforeClass
    public void setContext( final ITestContext ctx ) {
        this.ctx = ctx;
    }
}

public Class SampleTest extends BaseTestNg {

    @Test
    public Market testMarketGeneration(){
        //generate market
        this.getContext().setAttribute("market", someMarket);
        //returning generated market.
        return someMarket;
    }
}


import org.testng.IInvokedMethod;
import org.testng.IInvokedMethodListener2;
import org.testng.ITestContext;
import org.testng.ITestResult;

public class InvokedMethodListener2Impl implements IInvokedMethodListener2 {

    @Override
    public void afterInvocation( final IInvokedMethod method, final ITestResult testResult ) {
        // TODO Auto-generated method stub

    }

    @Override
    public void afterInvocation( final IInvokedMethod method, final ITestResult testResult, final ITestContext context ) {

        //read object from context
        //Market = (Market) context.getAttribute("market");

        // testResult.setStatus( ITestResult.FAILURE );

    }

    @Override
    public void beforeInvocation( final IInvokedMethod method, final ITestResult testResult ) {
        // TODO Auto-generated method stub

    }

    @Override
    public void beforeInvocation( final IInvokedMethod method, final ITestResult testResult, final ITestContext context ) {
        // TODO Auto-generated method stub

    }

}