我有一个testng测试类套件,我通过testng.xml文件运行。这很好用。所有测试都是连续运行的,因此没有并行执行障碍。
我现在的目标是在一个测试类中获取由测试方法生成的状态(例如,由数据库插入生成的customerId
主键值)并将其传递给另一个测试类,以便在第二个类中测试方法可以基于该共享状态采取进一步的操作(例如,使用来自第一类的customerId
值查找刚刚插入的客户)。
当然,通过类成员变量在单个类中的测试方法之间共享状态很容易,但是我没有看到如何跨测试类共享它。
使用工厂创建存储库。存储库存储“有趣的测试状态”属性。
TestRepository tr = TestRepositoryFactory.getInstance();
...
tr.store("test13.PKID", pkid.toString());
然后在随后的代码中,重复调用工厂,然后获取值:
String spkid = tr.get("test13.PKID");
真正以这种方式执行此操作的方法是将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
(扩展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风险。
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);
}
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>
...