Как вызвать Dataprovider из моего тестового метода с параметрами

    @DataProvider (name=getData)
                public static Object[][] getData(){
                    Excelreader excel = new Excelreader("C:\\WorkspaceExcel\\Datasource.xlsx"); private static
        String sheetName="SmokeTest"; // Test Data stored in a a table with
        columns and rows. Ex. UserNmae and password are the columns and data
        for them in rows  private static String tableName="CreatePolicy";

        // Some logic to read the data table store the data in a 2
        dimentional array.

        // Some logic by which I store the columns as Keys and data for them
        as values in a HASHTABLE  Return the hashtable 
    }




       @Test (dataProvider="getData") 
        public void testData(Hashtable<String, String> data){
        /* Logic to read an .xlsx file which has Snenario name, TestCase Name  and its corespnding runflag. If the runflag is true i need to read the scenario name and testcase name from the .xlsx file.  */

/* I need some logic to pass the ScenarioName (equivalent to Sheetname in DP) and TestCase Name (equivalent to datatable name in DP) which i am getting by reading the excelfile to DataProvider, so i can get the data which i need to execute the test case */

/*I am doing the above as part of Hybridframework, where i have Scenario, TC, Test step details in one excel sheet and data for each testcase in one more sheet */
       }

Мой вопрос: мне нужна некоторая логика, поэтому, когда @Test выполняется, я должен динамически передавать данные File Path, SheetName, TableName, чтобы можно было использовать один и тот же поставщик данных, и это даст мне другой набор данных для работы.

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


person user3660045    schedule 12.10.2015    source источник


Ответы (3)



Если вы просто хотите иметь возможность повторно использовать сложную логику выборки тестовых данных, почему бы просто не перенести ее во вспомогательную функцию и не передать свои параметры отдельным поставщикам данных?

public class ReusableDataprovider {
    @Test(dataProvider = "data_from_table1")
    public void test1(Hashtable<String, String> data) {
        Assert.assertEquals(data.get("Username"), "user_table1", "Wrong username");
        Assert.assertEquals(data.get("Password"), "pass_table1", "Wrong password");
    }

    @Test(dataProvider = "data_from_table2")
    public void test2(Hashtable<String, String> data) {
        Assert.assertEquals(data.get("Username"), "user_table2", "Wrong username");
        Assert.assertEquals(data.get("Password"), "pass_table2", "Wrong password");
    }

    @DataProvider
    protected Object[][] data_from_table1() {
        return fetchData("file1", "sheet1", "table1");
    }

    @DataProvider
    protected Object[][] data_from_table2() {
        return fetchData("file2", "sheet2", "table2");
    }

    protected Object[][] fetchData(String filePath, String sheetName, String tableName) {

        final Hashtable<String, String> data = new Hashtable<String, String>();
        // Do all the complex excel logic here
        data.put("Username", "user_" + tableName);
        data.put("Password", "pass_" + tableName);

        return new Object[][] {{data}};
    }

}
person botchniaque    schedule 12.10.2015
comment
Мой тестовый метод считывает файл .xlsx с TCname, Runflag и зацикливает количество тестов с флагом yes. для каждого TC ему нужны данные, которые есть в файле .xlsx, и мой DP вернет данные, если я смогу динамически передать имя листа и таблицы. Поскольку мой номер TC будет варьироваться, поэтому я не буду знать, какой DP мне может понадобиться. поэтому мне нужно решение, которое будет использовать один и тот же DP и предоставлять другой набор данных, которые мне нужны для разных тестовых случаев. - person user3660045; 12.10.2015
comment
Сколько у вас будет дегустационных кейсов? Вы говорите «динамические», но каковы будут их сигнатуры (принятые параметры)? Я не совсем понимаю. Может быть, вы могли бы привести некоторые примеры данных. - person botchniaque; 12.10.2015
comment
У меня есть имена тестовых случаев, Scenarionames и его флаг выполнения в файле .xlsx, и число равно количеству записей, которые я сделал в файле .xlsx перед выполнением. Поскольку я использую хеш-таблицу в качестве параметра в @Test mathod, и мой DP также возвращает хэш-таблицу, поэтому я не буду беспокоиться о количестве параметров, которые мне нужно передать в моем методе @test, который использует DP. Пожалуйста, обратитесь к методу @ Test в моем вопросе, где я написал, какую операцию я собираюсь выполнить в этом методе тестирования. - person user3660045; 13.10.2015
comment
Извините, я очень старался, но мне очень трудно понять вашу проблему. Я не знаю, почему вы хотите вызвать DP из своего теста. Предполагается, что DP вводит параметры, поэтому убедитесь, что DP предоставляет все необходимые аргументы для теста. - person botchniaque; 13.10.2015
comment
Это я делаю как часть своего гибридного фреймворка. Итак, в моем сценарии драйвера я читаю файл .xlsx, чтобы получить имя сценария и имя тестового примера, которые я хочу выполнить. Поэтому я хочу, чтобы какая-то логика передала эти значения в DP, чтобы получить тестовые данные, которые я буду использовать для выполнения тестовых шагов. Так что у меня будет сценарий драйвера и DP, которые я буду использовать для выполнения всех тестовых случаев. - person user3660045; 13.10.2015

Вы можете сделать это следующим образом:

Подход 1: 1. Создайте переменные класса для Path, SheetName, TableName. 2. Инициализируйте эти переменные с помощью конструктора. 3. Прямой вызов этих переменных в функцию поставщика данных.

Подход 2: 1. Настройте Path, SheetName, TableName в системном свойстве env с помощью класса System или вы можете сделать это с помощью инструмента maven, gradle build. 2. Получите эти значения свойств в своем классе поставщика данных, используя системный метод getProperty.

person Sadik Ali    schedule 13.10.2015
comment
Подход 1 звучит хорошо для меня, однако я не понимаю, как я могу это реализовать, было бы здорово, если бы вы могли привести один пример. На самом деле я читаю один файл .xlsx, чтобы получить путь, имя листа и имя таблицы данных (имя TC), и для каждого метода @test я хочу вызвать DP с этими параметрами для получения данных. Поэтому, если это возможно, пожалуйста, приведите один пример. - person user3660045; 13.10.2015