как заставить TestNG-@Factory создавать экземпляры тестовых классов в определенном порядке?

Я использую TestNG для своих тестов на селен. Существует тест под названием «Создать фирму», который нужно запускать несколько раз на моем ноутбуке.

Поэтому я написал для этого класс под названием «CreateFirm», и данные для различных фирм находятся в электронной таблице Excel.

В разное время мне нужно создавать различные наборы фирм, которые я контролирую с помощью столбца в электронной таблице Excel, в котором хранится имя моего компьютера.

Я использую @Factory для создания своих классов CreateFirm, у которых есть один метод @Test для создания фирмы.

В электронной таблице Excel. Если я назначил фирму 1, фирму 2, фирму 3, фирму 4 в том же порядке для моего ноутбука, @Factory создает их в случайном порядке, например, фирма 4, фирма 3, фирма 1, фирма 2.

Мой вопрос: как заставить @Factory создавать тестовые экземпляры в том порядке, в котором я хочу?

Мой метод @Factory:

      @Factory
  public Object[] runCreateFirm()
  {

        //This is where I get the list of test cases assigned to my laptop
        this.test_id_list=get_test_ids_for_test_run("Create Firm (class approach).xls", "Global");      

        Object[] result = new Object[this.test_id_list.size()];


        int index=0 ;
        for (String firm_id: this.test_id_list)
        {
            //This is where I get all the test data from the Excel spreadsheet
            HashMap<String,String> test_data_row=this.get_row_from_excel("Create Firm (class approach).xls", "Global", "test_case_id", firm_id);

            System.out.println("Inside Firm Factory ,index="+index +", test case id="+ test_data_row.get("test_case_id"));

            //CreateFirm is the class which will use the data and do all the UI actions to create a Firm
            result[index]=new CreateFirm(test_data_row);
            index++;
        }
        return result;
  }

XML это

    <?xml version="1.0" encoding="UTF-8"?>
<suite name="CreateFirm Suite">
  <test name="Create Firm Test"  order-by-instances="false">
    <classes>
      <class name="regressionTests.factory.CreateFirmFactory"/>
    </classes>
  </test>
</suite>

person Vikas    schedule 08.10.2012    source источник


Ответы (3)


Удалось написать метод перехватчика для моего требования. Для начала я ввел в свой класс новое поле под названием «приоритет». Я не мог использовать @Priority, потому что в моем тестовом классе был только один тестовый метод, и в этом случае все мои экземпляры будут иметь одинаковый приоритет. Поэтому я ввел новое поле, называемое приоритетом, в котором будет указан порядок, в котором должен создаваться экземпляр класса. Я использую это поле в методе перехватчика, чтобы установить порядок создания экземпляров.

public List<IMethodInstance> intercept(List<IMethodInstance> methods,ITestContext context) 
{

    List<IMethodInstance> result = new ArrayList<IMethodInstance>();
    int array_index=0;

    for (IMethodInstance m : methods)
    {
        result.add(m);
    }
    //Now iterate through each of these test methods
    for (IMethodInstance m : methods)
    {
        try {               
            //Get the FIELD object from - Methodobj->method->class->field
            Field f = m.getMethod().getRealClass().getField("priority");
            //Get the object instance of the method object              
            array_index=f.getInt(m.getInstance());
        } 
         catch (Exception e) {
            e.printStackTrace();
        }           
        result.set(array_index-1, m);           
    }

    return result;
}
person Vikas    schedule 22.10.2012

Фабрика создает экземпляры тестовых классов, а не запускает их. Если вам нужен определенный порядок для ваших тестов, у вас есть много вариантов между зависимостями (группами и методами), приоритетами и перехватчиками методов.

person Cedric Beust    schedule 09.10.2012
comment
Привет Седрик, Большое спасибо за ответ. В моем тестовом классе есть только один метод @Test, поэтому я не могу использовать зависимости, приоритеты или группы, чтобы указать порядок запуска моего тестового класса. Я изучу MethodInterceptors (я новичок в java, поэтому мне потребуется некоторое время, чтобы понять этот подход :() И спасибо за предоставление отличного фреймворка, такого как TestNG, для таких простаков, как я :) - person Vikas; 09.10.2012
comment
Привет, Седирк, я изучил перехватчики методов. Насколько я понял, это только для того, чтобы заказать методы испытаний. Можем ли мы также вмешиваться в порядок экземпляров классов из Factory? Если нет, то есть ли способ сделать это? Пожалуйста, дайте мне знать, если у вас есть время - person Vikas; 19.10.2012

Направлено https://github.com/cbeust/testng/issues/1410 для решение и получил подсказку из примера, приведенного krmahadevan. Большое спасибо КР. Я использую плагин TestNG версии 6.14.0.201802161500 в Eclipse.

Простое переопределение метода toString в тестовом классе делает свое дело. В этом методе toString возвращает ключевой параметр, например. Фирма1, Фирма2 и т. д. Пожалуйста, обратитесь к следующему коду для четкого понимания.

TestClass.java

import org.testng.annotations.Test;

public class TestClass {

    String testcaseName;

    public TestClass(String testcaseName) {
        this.testcaseName = testcaseName;
    }

    @Test
    public void sendCmd() {
        System.out.println("Testcase received "+this.testcaseName);
    }

    @Override 
    public String toString() { 
        return this.testcaseName; 
    }
}

FactoryClass.java

import org.testng.annotations.DataProvider;
import org.testng.annotations.Factory;

public class FactoryClass {

    @DataProvider
    public static String[][] createTestCmds() {
       String[][] testData = new String[6][1];
        for (int i = 0, j= 6; i < 6 ; i++,j--) {
            testData[i][0]="Firm "+i;
        }
       return testData;
    }

    @Factory(dataProvider = "createTestCmds")
    public Object[] Factory(String testcaseName) {
        return new Object[] {new TestClass(testcaseName)};
    }
}

Тест.java

import java.util.Collections;

import org.testng.TestNG;
import org.testng.xml.XmlClass;
import org.testng.xml.XmlSuite;
import org.testng.xml.XmlTest;

public class Test {
    public static void main(String[] args) {
        TestNG testng = new TestNG();
        XmlSuite xmlSuite = new XmlSuite();
        xmlSuite.setGroupByInstances(true);
        xmlSuite.setName("Sample_Test_Suite");
        XmlTest xmlTest = new XmlTest(xmlSuite);
        xmlTest.setName("Sample_Test");
        xmlTest.setClasses(Collections.singletonList(new XmlClass(FactoryClass.class)));
        testng.setXmlSuites(Collections.singletonList(xmlSuite));
        testng.setVerbose(2);
        System.err.println("Printing the suite xml file that would be used.");
        System.err.println(xmlSuite.toXml());
        testng.run();
    }
}

Результат

Testcase received Firm 0
Testcase received Firm 1
Testcase received Firm 2
Testcase received Firm 3
Testcase received Firm 4
Testcase received Firm 5
PASSED: sendCmd on Firm 0
PASSED: sendCmd on Firm 1
PASSED: sendCmd on Firm 2
PASSED: sendCmd on Firm 3
PASSED: sendCmd on Firm 4
PASSED: sendCmd on Firm 5

===============================================
    Sample_Test
    Tests run: 6, Failures: 0, Skips: 0
===============================================


===============================================
Sample_Test_Suite
Total tests run: 6, Failures: 0, Skips: 0
===============================================

С этой проблемой я столкнулся. Я получил решение, как указано выше.

person RKH    schedule 18.04.2019