Функциональное тестирование TestNG @Последовательность тестовых заказов

В настоящее время я пытаюсь написать несколько тестов автоматизации с помощью 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>

The dataprovider reads this test data and passes it into an 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. Затем повторите это для следующего экземпляра

Мой подход неверен? Я понимаю, что каждый тест должен быть независимым, но как это возможно при проведении сквозного тестирования?

заранее спасибо

Джон


person johnnyc007    schedule 29.07.2014    source источник
comment
TestNG передает все данные из каждого в каждый метод @Test — это разработанное поведение поставщиков данных. Чтобы получить желаемое поведение, вам придется создать один тестовый метод, выполняющий каждый из этих шагов по порядку.   -  person Bob Dalgleish    schedule 29.07.2014
comment
Таким образом, каждый текущий тест TestNG (извините, я не могу использовать знак «at» ...) просто стал бы обычным методом - и затем они вызываются из одного теста TestNG? Отчетность для этого не будет такой хорошей, как для каждого теста TestNG. например Например, если один тест TestNG не пройден на ValidateTotal, тогда весь тест будет помечен как не пройденный?   -  person johnnyc007    schedule 29.07.2014
comment
Если я не использую DataProvider, есть ли способ передать тестовые данные объекта[][] через каждый тест TestNG?   -  person johnnyc007    schedule 29.07.2014


Ответы (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>

Затем добавьте свои параметры в тест.

person Bob Dalgleish    schedule 29.07.2014