TestNG - 测试类之间的共享状态

时间:2014-07-15 19:04:19

标签: java testng

我有一个测试类套件,我通过testng.xml文件运行。这很好用。所有测试都是连续运行的,因此没有并行执行障碍。

我现在的目标是在一个测试类中获取由测试方法生成的状态(例如,由数据库插入生成的customerId主键值)并将其传递给另一个测试类,以便第二类中的测试方法可以基于该共享状态采取进一步的操作(例如,使用第一类中的customerId值查找刚插入的客户)。

在单个类中测试方法之间很容易分享状态,当然,通过类成员变量,但我不知道如何在测试类之间共享它。

4 个答案:

答案 0 :(得分:1)

使用工厂创建存储库。存储库存储"有趣的测试状态"属性。

  TestRepository tr = TestRepositoryFactory.getInstance();
  ...
  tr.store("test13.PKID", pkid.toString());

然后在随后的代码中,重复调用工厂,然后获取值:

  String spkid = tr.get("test13.PKID");

答案 1 :(得分:1)

真正的测试方法是将ITestContext属性设置为所需的值,然后从其他测试类中获取。

设定值:

@Test
public void setvaluetest(ITestContext context) {
        String customerId = "GDFg34fDF";
        context.setAttribute("customerId", customerId);
}

获取价值:

@Test
public void getvaluetest(ITestContext context) {
        String id = context.getAttribute("customerId");
}

答案 2 :(得分:1)

另一种方法是使用面向对象编程的方法。

测试的常见结构,例如:

  • TestBase.java(所有其他测试类的父类,有@BeforeTest,@ AfterSuite等方法)
    • RegistrationTests.java(扩展TestBase,)
    • ShoppingTests.java(扩展TestBase)
    • WhateverElseTests.java(扩展TestBase)

因此TestBase将所有共享数据作为静态字段,例如Customer对象:

public class TestBase {

    protected static final BrowserManager bw = new BrowserManager();
    protected static Customer customer;

    @BeforeSuite
    public void initBrowser() {
        bw.init();
    }

    @AfterSuite
    public void terminateBrowser() {
        bw.terminate();
    }

}

在测试中访问customer,例如ShoppingTests.java

public class ShoppingTests extends TestBase {

    @Test
    public void doSomethingTest() {

        bw.navigateTo().shoppingPage();

        bw.shoppingPreparationHelper().checkDisplayedName(customer.name);
        ...

N.B。:共享对象的测试应该按照严格的顺序进行(首先 - 测试该init对象,然后 - 测试使用对象的数据),所以使用@Test(dependsOnMethods = "someMethodTest")。否则,您将面临customer的NullPointerException风险。

PS:面向对象的方式比ITestContext具有很大的优势,因为您可以将任何对象从测试传递到测试(也在类之间),而不仅仅是字符串属性。< / p>

答案 3 :(得分:0)

我们从TestNG JavaDoc知道,ITestContext定义了一个测试上下文,其中包含给定测试运行的所有信息。该上下文的一个实例传递给测试侦听器,以便他们可以查询有关其环境的信息。 因此,我们可以共享该测试中一个类的数据与该测试中另一个类的数据。

Producer.java

public List<String> groupIds = ...;
@AfterClass(alwaysRun = true)
public void reserveGroupIds(ITestContext ctx) {
    ctx.setAttribute(GROUPS_ATTR, groupIds);
}

Consumer.java

public List<String> groupIds;
@BeforeClass(alwaysRun = true)
public void fetchGroupIds(ITestContext ctx) {
    groupIds = (List<String>) ctx.getAttribute(Producer.GROUPS_ATTR);
}

mySuite.xml

...
<test>
  <classes>
    <class name= "Producer"/>
    <class name= "Consumer"/>
  </classes>
</test>
...