【问题标题】:TestNG functional testing @Test order sequenceTestNG 功能测试@Test 顺序序列
【发布时间】:2014-07-29 11:02:17
【问题描述】:

我目前正在尝试使用 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>

dataprovider 读取此测试数据并将其传递到 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 方法。我需要它通过方法序列传递每个实例..所以; , 登录, SearchForProduct, PlaceOrder, ValidateQuantityAmount, ValidateSide, ValidateTotal, CancelOrder 然后对

的下一个实例重复此操作

我的方法错了吗?我知道每个测试都需要独立 - 但是在运行端到端测试时怎么可能呢?

提前致谢

约翰

【问题讨论】:

  • “TestNG 将所有数据从每个传递到每个 @Test 方法”——这是数据提供者的设计行为。要获得您想要的行为,您必须创建一个按顺序执行每个步骤的测试方法。
  • 所以每个当前的 TestNG 测试(抱歉不能使用 'at' 符号......)将简单地成为一种正常的方法 - 然后从一个 TestNG 测试中调用这些方法?对此的报告不会像每个 TestNG 测试那样好。例如例如,如果一个 TestNG 测试在 ValidateTotal 上失败,那么整个测试将被标记为失败?
  • 如果我不使用 DataProvider,有没有办法可以通过每个 TestNG 测试传递 object[][] 测试数据?

标签: java testng functional-testing end-to-end


【解决方案1】:

创建您的测试套件,testng.xml:

<suite name="Johnny's Tests">
  <test name="pass1">
    <parameter name="username" value="letmein"/>
    ...
    <class name="PlaceOrderTestScript">
      <methods>
        <include name="*"/>
      </methods>
    </class>
  </test>
  <test name="pass2">
    ...
  </test>
  ,,, repeat for each test
</suite>

然后将您的参数添加到测试中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多