我目前正在尝试使用 TestNG 编写一些自动化测试,它将验证用户在网站上的一些操作,因此这些测试是端到端的功能测试,而不是单元测试。
我创建了一个 XML 文件来保存测试数据(这个 XML 文件的结构不会改变)。测试脚本将从测试文件中读取信息并将其传递给 DataProvider,然后提供 @Tests。问题是 - 数据提供者似乎正在用每个测试数据实例抽取每个 @Test 方法,并且它没有按顺序运行测试。
我附上了代码 - 如果我的方法是正确的,或者需要在代码中调整什么以使每组测试数据都可以运行,请有人提出建议。
测试数据文件
<TestData>
<test>
<username>letmein</username>
<password>ok!</password>
<product>tesco</product>
<ordertype>Market</ordertype>
<quantity>1000</quantity>
<side>Buy</side>
</test>
<test>
<username>letmein</username>
<password>ok!</password>
<product>barc</product>
<ordertype>RFQ</ordertype>
<quantity>100</quantity>
<side>Buy</side>
</test>
数据提供者读取此测试数据并将其传递给 Object[][]
自动化测试脚本如下;
public class PlaceOrderTestScript {
InitiateTesting x;
static TestDataProvider y;
static WebDriver driver;
boolean loggedin = false;
@Parameters("browser")
@BeforeTest
public void beforeMethod(String browser) throws Exception {
x = new InitiateTesting();
y = new TestDataProvider();
driver = x.launch(browser); //select driver, browser and launch website
}
@DataProvider
public static Object[][] dp(ITestContext context) throws Exception {
String testdatalocation = context.getCurrentXmlTest().getParameter("placeordertestdata"); //suite.xml holds details of the test data file location
Object[][] data = y.Provider(testdatalocation);
return data;
}
@Test (dataProvider = "dp")
public void SignIn(String username, String password, String product, String ordertype, String quantity, String side) throws Exception {
System.out.println("Log into site");
// only run this test once
if (loggedin == false) {
LogIn_Page.txtbx_UserName(driver).sendKeys(username);
LogIn_Page.txtbx_Password(driver).sendKeys(password);
LogIn_Page.btn_LogIn(driver).click();
Thread.sleep(5000); //pause for x seconds and let site load for the first time
loggedin = true;
}
}
@Test (dependsOnMethods={"SignIn"}, dataProvider = "dp")
public void SearchForProduct(String username, String password, String product, String ordertype, String quantity, String side) {
// search for <product>
}
@Test (dependsOnMethods={"Search"}, dataProvider = "dp")
public void PlaceOrder(String username, String password, String product, String ordertype, String quantity, String side) {
//Place order
}
@Test (dependsOnMethods={"PlaceOrder"}, dataProvider = "dp")
public void ValidateQuantityAmount(String username, String password, String product, String ordertype, String quantity, String side) {
//check results <quantity>
}
@Test (dependsOnMethods={"PlaceOrder"}, dataProvider = "dp")
public void ValidateSide(String username, String password, String product, String ordertype, String quantity, String side) {
//check results <side>
}
@Test (dependsOnMethods={"PlaceOrder"}, dataProvider = "dp")
public void ValidateTotal(String username, String password, String product, String ordertype, String quantity, String side) {
//check results - some calcs here
}
@AfterTest
public void CancelOrder() throws Exception {
//Cancel the Order
}
}
问题是当我运行它时 - TestNG 正在将每个数据中的所有数据传递给每个 @Test 方法。我需要它通过方法序列传递每个实例..所以; , SignIn, SearchForProduct, PlaceOrder, ValidateQuantityAmount, ValidateSide, ValidateTotal, CancelOrder 然后对下一个实例重复这个
我的方法错了吗?我知道每个测试都需要独立 - 但是在运行端到端测试时怎么可能呢?
提前致谢
约翰