在一个类中的Arquillian TestNG测试方法中的测试之间共享实例变量

时间:2013-06-13 05:42:30

标签: testng jboss-arquillian

免责声明:我知道这是一个非常糟糕的设计,实际上让测试依赖于相互设置任何类型的变量。但是我必须将这些测试迁移到Arquillian并重写所有内容都是不可能的。


问题:我的测试方法使用了一些像这样的实例变量:

public int myNumber= 0;

@Test
public void testOne() {
// do something with myNumber
}

@Test(dependsOnMethods = "testOne")
public void testTwo {
// do something with myNumber

这曾经使用jboss微容器工作。但是,当使用Arquillian在容器中运行这样的测试时,它没有。让这项工作再次成功的最简单方法是什么?现在我只是让所有的字段都是静态的,这是有效的。这有什么负面影响吗?


编辑:塞德里克的建议既不起作用,这可能是由于同样的原因,实例变量不起作用。 Arquillian为每个@Test方法调用整个生命周期,看起来它也为每个ITestContext注入一个新的@Test。这就是我试过的:

Integer number = new Integer(10);
static final String NUMBER = "number";

@Test(dataProvider = Arquillian.ARQUILLIAN_DATA_PROVIDER)
public void testOne(ITestContext ctx) {
    System.out.println("TEST ONE: " + number);
    number += 100;
    ctx.setAttribute(NUMBER, number);
    System.out.println("CONTEXT " + ctx.getName());
    System.out.println("CONTEXT " + ctx.getAttribute(NUMBER));
}

@Test(dependsOnMethods="testOne", dataProvider = Arquillian.ARQUILLIAN_DATA_PROVIDER)
public void testTwo(ITestContext ctx) {
    System.out.println("TEST TWO: " + number);
    System.out.println("CONTEXT " + ctx.getName());
    System.out.println("CONTEXT " + ctx.getAttribute(NUMBER));
}

结果:

TEST ONE: 10
CONTEXT Arquillian - class com.example.ServerTest
CONTEXT 110
TEST TWO: 10
CONTEXT Arquillian - class com.example.ServerTest
CONTEXT null

2 个答案:

答案 0 :(得分:0)

我不确定是什么导致它停止运行(它应该工作),但你可以在这两个方法的签名中声明ITestContext,这将由TestNG注入,然后调用{{ 1}} / setAttribute在您的方法之间共享参数。

答案 1 :(得分:0)

在测试之间共享数据的最简单方法是使用(CDI)托管bean。

@ApplicationScoped
public class MyTestContext
{
    @Produces @ApplicationScoped
    Map<String, Object> objectStore()
    {
        return new HashMap<>();
    }
}

public class IntegrationTests extends ArquillianTest
{
    @Inject
    Map<String, Object> objectStore; 

    @Test() @InSequence(1)
    public void testReadAllUsers()
    {
        objectStore.put("x", 100);
    }

    @Test() @InSequence(2)
    public void testCreateNewUser() 
    {
        assertThat((Integer)objectStore.get("x")).isEqualTo(100);
    }
}