Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Проблема с двумя dataProviderClass в аннотации Test


(Вероничка) #1

Привет!

У меня возникла следующая проблема:

Для выполнения одного теста мне надо использовать данные из двух *.dat файлов, то есть у меня есть 2 dataProvider:

dataProvider = "passengerInfoFromfile",dataProviderClass = PassengerInfoProvider.class
dataProvider = "stationsFromfile", dataProviderClass = StationProvider.class

Использовать один dataProvider в тесте у меня получилось (данные считались из файла и ввелись на форму):

@Test(dataProvider = "stationsFromfile", dataProviderClass = StationProvider.class)
    public void testCar(FillPickUpStation station, FillPassengerInfo info) throws Exception {

......

}

А вот как добавить внутрь @Test второй dataProvider, а именно синтаксис и возможно ли это, мне пока непонятно. Может кто знает.

Использую Selenium 2.0 + Java

Буду рада любой помощи

Спасибо,

Вероника

 

 


(Sergey Korol) #2

Передать тесту 2 провайдера нельзя, но вам никто не мешает объединить в 1м провайдере данные из 2х файлов. Например, так:

   @DataProvider
    public Object[][] provider() {
        return new Object[][] { { FirstFileDataProvider.getFileData(), SecondFileDataProvider.getFileData() } };
    }
 
    @Test(dataProvider = "provider")
    public void getFilesData(String firstString, String secondString) {
        System.out.println("file 1: " + firstString);
        System.out.println("file 2: " + secondString);
    }
Применительно к вашему примеру, в качестве параметров могут выступать сложные объекты, содержащие необходимые вам данные.

(Вероничка) #3

Спасибо за ответ! Данные удалось извлечь, получилось так:

    @SuppressWarnings("finally")
    @DataProvider
    public Object[][] provider() {
        Object[][] objectsList = null;
        try {
            objectsList = new Object[][]{{StationProvider.loadStationsFromFile(), PassengerInfoProvider.loadPassengerInfoFromFile()}};
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            return objectsList;
        }
    }

но при выполнении строки return objectsList;  вылетает следующая ошибка:

FAILED: testAmargoTestCar(java.util.ArrayList$Itr@9addef, java.util.ArrayList$Itr@1609812)
java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)...

может Вы знаете с чем это может быть связано?

P.S подозреваю, что это связано с неправильной передачей в 

@Test(dataProvider="provider")

public void testCar(FillPickUpStation station, FillPassengerInfo info)

Спасибо,

Вероника


(Sergey Korol) #4

Подозреваю, что методы loadStationsFromFile() / loadPassengerInfoFromFile() возвращают не объекты классов FillPickUpStation / FillPassengerInfo (как указано в тесте), а ArrayList каких-то объектов. Нужно смотреть на код самих методов. В общем, суть в том, что типы передаваемых тесту аргументов должны соответствовать типам возвращаемых провайдером значений. Плюс ко всему, нужно взглянуть на логику самого провайдера - какие данные вам нужны - один объект или список? Если 1 объект, то придется корректировать методы - их возвращаемые значения. Если список, то достаточно изменить

public void testCar(FillPickUpStation stationFillPassengerInfo info)

на нечто вроде

public void testCar(ArrayList<FillPickUpStation> stationsList, ArrayList<FillPassengerInfo> infoList)


(Вероничка) #5

Подправила немного методы в дата провайдере,  передала возвращаемый тип в метод testCar()  и заработало.

Спасибо огромное!!!!! I am happy=)