在POM框架中使用TestNg Selenium进行并行执行,覆盖数据对象类



我正在尝试并行运行两个测试类,它们都使用指向不同excel表的数据提供程序。从顺序上讲,它运行得很好,但在并行运行时,保存所有测试数据的测试对象类似乎被覆盖了。以下是数据提供商
Class 1

@DataProvider(name = "tradeData"  ) 
public Object[][] createMessage() {
return ExcelUtils
.getDataFromExcelSheet("TestSheet1", LOADTESTDATAPROVIDER);
}}

2级

@DataProvider(name = "tradeData")
public Object[][] createMessage() {
return ExcelUtils
.getDataFromExcelSheet("TestSheet2", LOADTESTDATAPROVIDER);
}

数据从excel中正确返回,但当放入对象类时,数据似乎被覆盖了。数据对象类正在从两个测试类初始化,类似于以下

@Test(dataProvider = "tradeData")
public void connectAndPushMessage(String sellerName,
String buyerName,
String SIN){
testMessage tMessage = new testMessage();
tMessage.setSellerName(sellerName);
tMessage.setBuyerName(buyerName);
tMessage.setSIN(SIN);
}

下面是我使用过的testng.xml。

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Parallel Testing" parallel="classes" thread-count="2">
<test name="Test run 1">
<classes>
<class name="test.xxx.performance.InjectTrades_TestRun1"/>
<class name="test.xxx.performance.InjectTrades_TestRun2"/>
</classes>
</test>
</suite>

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Parallel Testing" parallel="tests" thread-count="2">
<test name="Test run 1">
<classes>
<class name="test.xxx.performance.InjectTrades_TestRun1"/>
</classes>
</test>
<test name="test run 2">
<classes>
<class name="test.xxx.performance.InjectTrades_TestRun2"/>
</classes>
</test>

我从两个xml中都得到了相同的结果,所以创建了六条不同的消息/将其推送到系统中(基于两张excel表(,代码推送了三条重复两次的不同消息。我的印象是testNg应该处理好这一点,因为两个类/测试都是作为单独的线程运行的。

EDIT下面是Test对象类的片段。所有属性都声明为专用

public class testMessage{
private String currentBusinessDate;
private String sellerName = "";
private String buyerName= "";
private String sin= "";
....
public testMessage() {
cTradeID = "T" + CommonUtils.randomNumber(12);
sRef = CommonUtils.randomNumber(12);
requestId = "1" + CommonUtils.randomNumber(5);
settlementRequestStateCode = "New";
currencyTypeCode = "USD";
}
public String getCurrentBusinessDate() {
return currentBusinessDate;
}
public void setCurrentBusinessDate(String currentBusinessDate) {
this.currentBusinessDate = currentBusinessDate;
}
public String getsellerName () {
return currentBusinessDate;
}
public void setsellerName (String currentBusinessDate) {
this.currentBusinessDate = currentBusinessDate;
}
public String getBuyerName () {
return currentBusinessDate;
}
public void setBuyerName (String currentBusinessDate) {
this.currentBusinessDate = currentBusinessDate;
}
....

没有提到使用过的TestNG版本,也没有共享ExcelUtils.getDataFromExcelSheet实现,但这两件事可能都与这种意外行为有关。

我将分享我的实验结果,以确认TestNG并行化本身没有问题,至少对于TestNG 7.5是这样。

测试类别1

class T1 {
@Test(dataProvider = "tradeData")
public void connectAndPushMessage(String arg) {
System.out.println(arg);
}
@DataProvider(name = "tradeData")
public Object[][] createMessage() {
return new Object[]{
{ "T1.createMessage-data-1" },
{ "T1.createMessage-data-2" },
{ "T1.createMessage-data-3" },
};
}
}

测试类别2

class T2 {
@Test(dataProvider = "tradeData")
public void connectAndPushMessage(String arg) {
System.out.println(arg);
}
@DataProvider(name = "tradeData")
public Object[][] createMessage() {
return new Object[]{
{ "T2.createMessage-data-1" },
{ "T2.createMessage-data-2" },
{ "T2.createMessage-data-3" },
};
}
}

testng.xml

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Parallel Testing" parallel="tests" thread-count="2">
<test name="Test run 1">
<classes>
<class name="samples.T1"/>
</classes>
</test>
<test name="test run 2">
<classes>
<class name="samples.T2"/>
</classes>
</test>
</suite>

输出:

T1.createMessage-data-1
T2.createMessage-data-1
T2.createMessage-data-2
T1.createMessage-data-2
T2.createMessage-data-3
T1.createMessage-data-3

也是如此

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="Parallel Testing" parallel="classes" thread-count="2">
<test name="Test run 1">
<classes>
<class name="samples.T1"/>
<class name="samples.T2"/>
</classes>
</test>
</suite>

请尝试使用TestNG7.5重新检查这一点,并查看您的ExcelUtils.getDataFromExcelSheet方法实现,它应该是线程安全的。

最新更新