Перейти к содержимому

Фотография

Нужен совет по качественному переиспользованию кода в тестах

Selenium Server Java TestNG DataProvider

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2

#1 Drenjy

Drenjy

    Новый участник

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Самойлов Андрей Евгеньевич


Отправлено 02 мая 2017 - 11:23

Сам тест

@DataProvider
    public Object[][] type() {
        return new Object[][]{
                {ПАКЕТФИНАНСОВЫХДОКУМЕНТОВ}
        };
    }
    @DataProvider
    public Object[][] status() {
        return new Object[][]{
                {ДАННЫЕЗАУКАЗАННЫЙПЕРИОД}
        };
    }
    @Test(priority = 4)
    public void testFilterByDataPeriod() {
        app.getUserHelper().loginAs(USER);
        app.getUserHelper().isLoggedInAs(USER);
        app.getNavigationHelper().toDocuments();
        app.getOrderedDocumentsPage().selectLSfromSelectList("130-Б102 ЗАО \"Секретно\"");
        app.getOrderedDocumentsPage().getOrderedDocList();
        //Ручной ввод даты не работает
       // app.getOrderedDocumentsPage().filterByDate("01.04.2017","30.04.2017");
        app.getOrderedDocumentsPage().filterByDocType(ПАКЕТФИНАНСОВЫХДОКУМЕНТОВ);
        app.getOrderedDocumentsPage().filterByStatus(ДАННЫЕЗАУКАЗАННЫЙПЕРИОД);
        app.getOrderedDocumentsPage().showSearchResult();//Просто клик по копне "Показать"
        app.getOrderedDocumentsPage().assertFilterOrderedDocuments(ПАКЕТФИНАНСОВЫХДОКУМЕНТОВ,ДАННЫЕЗАУКАЗАННЫЙПЕРИОД);
    }

Фильтр по типу аналогичен с фильтр по типу

public void filterByStatus(Status status) {
        click(By.xpath("//*[@name=\"Список 2\"]/div[2]"));
        switch (status) {
            case НЕТДАННЫХ:
                driver.findElement(By.xpath(".//div[@class='uniapp input-field select__opt' and @title='Нет данных']/div")).click();
                break;
            case ВОБРАБОТКЕ:
                driver.findElement(By.xpath(".//div[@class='uniapp input-field select__opt' and @title='В обработке']/div")).click();
                break;
            case ОТПРАВЛЕН:
                driver.findElement(By.xpath(".//div[@class='uniapp input-field select__opt' and @title='Отправлен']/div")).click();
                break;
            case ОШИБКА:
                driver.findElement(By.xpath(".//div[@class='uniapp input-field select__opt' and @title='Ошибка']/div")).click();
                break;
            case ДАННЫЕЗАУКАЗАННЫЙПЕРИОД:
                driver.findElement(By.xpath(".//div[@class='uniapp input-field select__opt' and @title='Данные за указанный период не найдены']/div")).click();
                break;
        }
    }

Основная проблема здесь.

public void assertFilterOrderedDocuments(Type type,Status status) {
        List<WebElement> elements=driver.findElements(By.xpath("//*[@name='GRID_DOCUMENTS']/table[1]/tbody[1]/tr[1]/td[1]/div/span"));
        int i=1;
        for (WebElement element:elements) {
            String doc_type = element.findElement(By.xpath("//*[@name='GRID_DOCUMENTS']/table[1]/tbody[1]/tr[" + i + "]/td[3]/div/span")).getText();
            String doc_period=element.findElement(By.xpath("//*[@name='GRID_DOCUMENTS']/table[1]/tbody[1]/tr[" + i + "]/td[4]/div/span")).getText();
            String doc_status=element.findElement(By.xpath("//*[@name='GRID_DOCUMENTS']/table[1]/tbody[1]/tr["+i+"]/td[5]/div/span")).getText();
            String doc_delivery=element.findElement(By.xpath("//*[@name='GRID_DOCUMENTS']/table[1]/tbody[1]/tr["+i+"]/td[5]/div/span")).getText();
            String doc_format=element.findElement(By.xpath("//*[@name='GRID_DOCUMENTS']/table[1]/tbody[1]/tr[1]/td["+i+"]/div/span")).getText();
            String doc_LS=element.findElement(By.xpath("//*[@name='GRID_DOCUMENTS']/table[1]/tbody[1]/tr["+i+"]/td[5]/div/span")).getText();
            i++;
            assertEquals(doc_type,type);
            assertEquals(doc_period, "01.01.2017 - 31.01.2017, 01.02.2017 - 28.02.2017, 01.03.2017 - 31.03.2017, 01.10.2016 - 31.10.2016, 01.11.2016 - 30.11.2016, 01.12.2016 - 31.12.2016");
            assertEquals(doc_status, status);
            assertEquals(doc_delivery, "Andrey.Samoylov@south.rt.ru");
            assertEquals(doc_format, "PDF");
            assertEquals(doc_LS, "ЛС: 8451651");
        }

Суть проблемы:

1) Понятное дело сейчас в сравнении получается подстановка "ПАКЕТФИНАНСОВЫХДОКУМЕНТОВ", что приводит к результату:

Expected :ПАКЕТФИНАНСОВЫХДОКУМЕНТОВ
Actual   :Счет-фактура, Счет, Расшифровка счета, Акт выполненных работ

Какие есть способы для подстановки мне требуемых данных, например алиас, что-то вроде: если выбран -"ПАКЕТФИНАНСОВЫХДОКУМЕНТОВ" то ожидается текст .... и т.д
2) Вообще не уверен в верности решения в методе "assertFilterOrderedDocuments", возможно есть более элегантные решения?


  • 0

#2 checo

checo

    Опытный участник

  • Members
  • PipPipPipPip
  • 400 сообщений
  • Город:Н.Новгород

Отправлено 02 мая 2017 - 15:34

В идеале, нужно разбить этот тест на много. Несколько ассертов в одном тесте, да еще в цикле - это не считается нормальным.

  1. Делаем по 1 тесту на каждое поле.
  2. Что мы ожидаем в поле type, мы не знаем? Должны знать, если известны входные данные к тесту. Или если это покрыто другими тестами, тогда надо хотя бы проверить, что там список допустимых типов документов, а не абракадабра. Можно это вынести в отдельный метод, возвращающий booleаn, и делать assertTrue(). (И зачем вообще дата провайдер, если там одно значение?)
  3. Лучше не делать ассерт в цикле, а собрать информацию в список, и в конце сравнить список с эталонным. Так можно вывести в лог более полную информацию.

Если не хватает ресурсов, чтобы проверить всё по отдельности, то нам нужен по крайней мере максимум информации в логе. Надо убрать все ассерты, собрать всю информацию по таблице, вывести в лог, сравнить с эталоном, вывести все несовпадения, и уже в конце сделать 1 ассерт, что несовпадений > 0.


  • 0

#3 Drenjy

Drenjy

    Новый участник

  • Members
  • Pip
  • 12 сообщений
  • ФИО:Самойлов Андрей Евгеньевич


Отправлено 03 мая 2017 - 13:12

В идеале, нужно разбить этот тест на много. Несколько ассертов в одном тесте, да еще в цикле - это не считается нормальным.

  1. Делаем по 1 тесту на каждое поле.
  2. Что мы ожидаем в поле type, мы не знаем? Должны знать, если известны входные данные к тесту. Или если это покрыто другими тестами, тогда надо хотя бы проверить, что там список допустимых типов документов, а не абракадабра. Можно это вынести в отдельный метод, возвращающий booleаn, и делать assertTrue(). (И зачем вообще дата провайдер, если там одно значение?)
  3. Лучше не делать ассерт в цикле, а собрать информацию в список, и в конце сравнить список с эталонным. Так можно вывести в лог более полную информацию.

Если не хватает ресурсов, чтобы проверить всё по отдельности, то нам нужен по крайней мере максимум информации в логе. Надо убрать все ассерты, собрать всю информацию по таблице, вывести в лог, сравнить с эталоном, вывести все несовпадения, и уже в конце сделать 1 ассерт, что несовпадений > 0.

Спасибо! Подумаю над Вашим решением.


  • 0



Темы с аналогичным тегами Selenium Server Java, TestNG, DataProvider

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных