Как да извикам 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)


Предлагам ви да предоставите параметри чрез XML, както е обяснено в Параметри от testng.xml

person LoganMzz    schedule 12.10.2015
comment
Чудя се как можем да постигнем това чрез XML параметризация. Тук в листа на Excel всяка таблица с данни има множество колони. Както в случай на доставчик на данни, ние трябва да използваме съвпадащ брой (тук кратно) на параметрите в метода @Test, за да избегнем използването на хеш-таблица. Така че независимо от това колко параметъра връща доставчикът на данни, моят тестов метод не трябва да добавя тези параметри. Моят DP ще върне данните, независимо от броя на колоните и редовете в таблицата с данни. Но единствената ми грижа е как мога да предам динамично името на листа и името на таблицата с данни, за които DP връща данните. - person user3660045; 12.10.2015

Ако просто искате да можете да използвате повторно сложна логика за извличане на тестови данни, защо просто не я преместите към помощна функция и не предадете вашите параметри в отделни доставчици на данни?

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 и той зацикля за броя тестови случаи с флаг "да". за всеки TC се нуждае от данни, които са там в .xlsx файла и моят DP ще върне данните, ако мога динамично да предам листа и името на таблицата. Тъй като моят брой TC ще варира, така че няма да знам какъв DP може да ми е необходим. така че имам нужда от решение, което ще използва същия DP и ще предоставя различен набор от данни, които са ми необходими за различен тестов случай. - person user3660045; 12.10.2015
comment
Колко калъфа за вкус ще имате? Казвате „динамичен“, но какви биха били техните подписи (приети параметри)? Не разбирам напълно. Може би бихте могли да дадете примерни данни. - person botchniaque; 12.10.2015
comment
Имам имена на тестови случаи, имена на сценарии и неговия флаг за изпълнение в .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 с помощта на системен клас или можете да го направите с помощта на maven, gradle инструмент за изграждане. 2. Вземете тези стойности на свойства във вашия клас на доставчик на данни, като използвате метода System getProperty.

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