我有一个testng测试类套件,我通过testng.xml文件运行。这很好用。所有测试都是连续运行的,因此没有并行执行障碍。
我现在的目标是在一个测试类中获取由测试方法生成的状态(例如,由数据库插入生成的customerId
主键值)并将其传递给另一个测试类,以便第二类中的测试方法可以基于该共享状态采取进一步的操作(例如,使用第一类中的customerId
值查找刚插入的客户)。
在单个类中测试方法之间很容易分享状态,当然,通过类成员变量,但我不知道如何在测试类之间共享它。
答案 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>
...