Использовать DataProvider в тестовом сценарии

Если у меня есть несколько методов @Test, которые должны быть в цепочке, и я хочу использовать DataProvider для передачи большего количества данных для всего тестового сценария, как это сделать правильно.

import org.testng.Assert;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class TestClass {

   private int type = -1;

   @DataProvider
   public Object[][] mock() {
      return new Object[][] { { 1, "Hello" }, { 2, "World" } };
   }

   @Test(groups = { "A" }, priority = 0, dataProvider = "mock")
   public void testOne(int i, String name) {
      System.out.println("TestClass.testOne()");
      switch (i) {
      case 1:
         type = 1;
         Assert.assertEquals(name, "Hello");
         break;
      case 2:
         type = 2;
         Assert.assertEquals(name, "World");
         break;
      default:
         break;
      }
   }

   @Test(groups = { "A" }, priority = 1)
   public void testTwo() {
      Assert.assertEquals(type != -1, true);
      System.out.println("TestClass.testTwo()");
   }
}

Каждый раз, когда testOne вызывается с фиктивными данными после него, testTwo также должен вызываться: Resutlt -> TestClass.testOne() TestClass.testOne() TestClass.testTwo()

Ожидаемый результат -> TestClass.testOne() TestClass.testTwo() TestClass.testOne() TestClass.testTwo()

Это мой набор xml

    <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite" group-by-instances="true">
  <test name="Test" verbose="3" group-by-instances="true" >
    <classes>

      <class name="demo.test.src.TestClass">

      </class>
    </classes>
  </test> <!-- Test -->
</suite> <!-- Suite -->

person Jordan Borisov    schedule 21.10.2016    source источник


Ответы (1)


Для этого вам в основном нужна фабрика в сочетании с поставщиком данных.

Вот пример того, как это может выглядеть:

public class TestClass {

    private int type = - 1;
    private String name;

    @Factory (dataProvider = "mock")
    public TestClass(int type, String name) {
        this.type = type;
        this.name = name;
    }

    @DataProvider
    public static Object[][] mock() {
        return new Object[][] {{1, "Hello"}, {2, "World"}};
    }

    @Test (groups = {"A"})
    public void testOne() {
        System.out.println("TestClass.testOne()");
        switch (type) {
            case 1:
                type = 1;
                Assert.assertEquals(name, "Hello");
                break;
            case 2:
                type = 2;
                Assert.assertEquals(name, "World");
                break;
            default:
                break;
        }
    }

    @Test (groups = {"A"}, dependsOnMethods = "testOne")
    public void testTwo() {
        Assert.assertEquals(type != - 1, true);
        System.out.println("TestClass.testTwo()");
    }
}

Затем вы используете XML-файл пакета TestNG, который использует атрибут group-by-instances (пример показан ниже).

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" >
<suite name="factory-suite"  verbose="2" group-by-instances="true" >
    <test name="factory-test">
        <classes>
            <class name="org.rationale.emotions.TestClass"/>
        </classes>
    </test>
</suite>
person Krishnan Mahadevan    schedule 23.10.2016
comment
хорошо, но результат TestClass.testOne() TestClass.testOne() TestClass.testTwo() TestClass.testTwo() Это не то, что ожидалось. - person Jordan Borisov; 24.10.2016
comment
@JordanBorisov добавьте group-by-instances = true в XML-файл вашего пакета, и после этого вы увидите методы для каждого экземпляра, запускаемого вместе. - person Krishnan Mahadevan; 24.10.2016
comment
Хорошо, теперь у меня есть этот вывод (тот же самый): ===== Вызванные методы TestClass.testOne()[pri:0, instance:demo.test.src.TestClass@28feb3fa] 687780858 TestClass.testOne()[pri :0, instance:demo.test.src.TestClass@68be2bc2] 1757293506 TestClass.testTwo()[pri:1, instance:demo.test.src.TestClass@28feb3fa] 687780858 TestClass.testTwo()[pri:1, instance :demo.test.src.TestClass@68be2bc2] 1757293506 ===== - person Jordan Borisov; 25.10.2016
comment
@JordanBorisov - Если мой ответ помог вам, не могли бы вы помочь принять мой ответ? - person Krishnan Mahadevan; 25.10.2016
comment
Нет на самом деле это не помогает мне - person Jordan Borisov; 25.10.2016
comment
@JordanBorisov - Не могли бы вы помочь мне понять, чего не хватает? - person Krishnan Mahadevan; 25.10.2016
comment
Я хочу, чтобы выполнение было (Метод1 Метод2) (Метод1 Метод2) - person Jordan Borisov; 25.10.2016
comment
@JordanBorisov - Group-by-instances=true сделает именно это. Можете ли вы поделиться своим xml-файлом пакета, который вы используете? - person Krishnan Mahadevan; 25.10.2016
comment
@JordanBorisov - я думаю, что для правильной работы вашего случая, а именно, выполнение методов должно следовать порядку, вам придется прибегнуть к использованию методов, зависящих от методов, вместо использования приоритета. Вы можете взглянуть на эту суть, которую я создал: gist.github.com/krmahadevan/cc2c473a0a117d821b06c9ea793fb361 - person Krishnan Mahadevan; 27.10.2016