TestNG-测试类之间共享状态

TestNG-测试类之间共享状态,testng,java,Testng,Java,我有一套通过testng.xml文件运行的测试类。这个很好用。所有测试都是串行运行的,因此没有并行执行障碍 我现在的目标是获取一个测试类中的测试方法生成的状态(例如,数据库插入生成的customerId主键值),并将其传递给另一个测试类,以便第二个类中的测试方法可以基于该共享状态采取进一步的操作(例如,使用第一个类中的customerId值查找刚刚插入的客户) 当然,通过类成员变量在单个类中的测试方法之间共享状态很容易,但我不知道如何在测试类之间共享状态。使用工厂创建存储库。存储库存储“有趣的测

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

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


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

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

  TestRepository tr = TestRepositoryFactory.getInstance();
  ...
  tr.store("test13.PKID", pkid.toString());
然后在后续代码中,重复对工厂的调用,然后获取值:

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

真正的Testng-y方法是使用所需的值设置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");
}

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

测试的通用结构,例如:

  • TestBase.java
    (所有其他测试类的父类都有@BeforeTest、@AfterSuite等方法)
    • RegistrationTests.java
      (扩展TestBase,)
    • ShoppingTests.java
      (扩展测试库)
    • WhateverElseTests.java
      (扩展测试库)
因此
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”)
。否则您将面临
客户的NullPointerException风险


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

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

Producer.java

public List<String> groupIds = ...;
@AfterClass(alwaysRun = true)
public void reserveGroupIds(ITestContext ctx) {
    ctx.setAttribute(GROUPS_ATTR, groupIds);
}
公共列表groupid=。。。;
@后级(alwaysRun=true)
公共无效ReserveGroupId(ITestContext ctx){
ctx.setAttribute(GROUPS\u ATTR,groupid);
}
Consumer.java

public List<String> groupIds;
@BeforeClass(alwaysRun = true)
public void fetchGroupIds(ITestContext ctx) {
    groupIds = (List<String>) ctx.getAttribute(Producer.GROUPS_ATTR);
}
公共列表groupid;
@上课前(alwaysRun=true)
公共void fetchGroupIds(ITestContext ctx){
groupIds=(List)ctx.getAttribute(Producer.GROUPS\u ATTR);
}
mySuite.xml

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

好主意。这将满足我的需要。谢谢。如果有人知道更多的testng-y方法,我也想学习。嗨,我们从哪里获得“TestRepository”类?它是任何库的一部分吗?或者是您创建的新类。
TestRepository
将是您创建的一个类,用于作为reposi返回当我尝试在另一个测试课上使用时,它不起作用