t.me/atinfo_chat Telegram группа по автоматизации тестирования

Тесты, которые должны "валиться", не "валятся"

Теги: #<Tag:0x00007f748befc778> #<Tag:0x00007f748befc6b0> #<Tag:0x00007f748befc5c0> #<Tag:0x00007f748befc4f8> #<Tag:0x00007f748befc408> #<Tag:0x00007f748befc2f0> #<Tag:0x00007f748befc200>

Использую Java+Maven+TestNG+WebDriver на IntellijIdea.
Я подозреваю, что проблема связана с обработкой тестов с использованием DataProvider’а.
Подозрения вызваны тем, что похожие тесты без его использования проходят нормально.
Проблема в том, что не фэйлятся два теста, которые должны (выделены на скриншоте1).
Куски кода выкладываю ниже.

Проблему частично решил, если часть кода, обозначенного (// * ==) перенести в место (// ** ==), но при этом не вываливается уже знакомая ошибка “missing web element” (скриншот2).

Может кто подскажет, как правильно обрабатывать подобные тесты?

    @BeforeTest
    @Parameters({"browser", "mailboxAccount"})
    public void beforeTest(@Optional String browser, @Optional String mailboxAccount) throws Exception {
        prepareDBforApplicationTesting(NAME_VALUE, COMPANY_VALUE, mailboxAccount);
        startTest(browser, BASE_URL);
        login(driver, mailboxAccount, PASSWORD_VALUE_VALID);
        driver.findElement(By.xpath(APPLICATIONS_TAB_XPATH)).click();
    }

    @Test(dataProvider = "getIncorrectDataForAddingApplication")
    public void addNewApplication(String title, String packageName, String url, String category, String platform, String ageLimit, boolean paidApp, boolean virtualCurrency, String currencyName, String exchangeRate, boolean backExchange) throws InterruptedException {

        addApplication(driver, false, title, packageName, url, category, platform, ageLimit, paidApp, virtualCurrency, currencyName, exchangeRate, backExchange);

        try {
            assertTrue(isElementPresent(driver, By.xpath(BUTTON_ADD_NEW_APPLICATION_XPATH)));
        } catch (Error e) {
            verificationErrors.append(e.toString());
        // ** ==================================================
        }
    }

    @AfterTest
    @Parameters("mailboxAccount")
    public void afterTest(@Optional String mailboxAccount) {
        driver.quit();
        clearDBafterTest(mailboxAccount);
        // * - проблемма в этой части кода ===========================
        String verificationErrorString = verificationErrors.toString();
        if (!"".equals(verificationErrorString)) {
            fail(verificationErrorString);
        }
        // ====================================================
    }

скрин1

скрин2

Не совсем понятно зачем assertTrue в тесте обёрнут в try-catch.
Идея assert в том, чтобы тест проходил при определённом условии.
Если условие не выполняется, то assert генерит AssertionError и тест падает.
Ваш try-catch перехватывает эту ошибку и следовательно сам тест проходит и помечается зелёным.
А вместо этого падает afterTest.
На сколько я понимаю в методах с анотациями before и after проверки не желательны. Они должны быть довольно линейными.
Неплохо бы было также посмотреть как реализован дата провайдер.
А пока попробуйте убрать try-catch в теле теста и убрать if в afterTest

Так же не понятно зачем Вы формируете строку из всех ероров?

Если просто оставить assert, он сам будет выводить стекстрейс ошибки.

И ещё.

Тут с помощью fail Вы валите не тест, а afterTest.
При такой реализации у Вас тест всегда будет зелёным.

Если Вы хотите чтобы весь тест был помечен как фейл, то это случится автоматически если один из тестовых методов в тесте завалиться.

1 Симпатия

Вам верно заметили, что ассерты не оборачивают в трай-кетч, кроме того в нормальном кетче не ловят Еррор, там нужно Эксепшен ловить. В методе афтер нужно какие то завершающие действия выполнять как например закрытие соединений и БД , но не пытаться валить уже пройденный тест. В методах (это не к тестированию, а вообще Джава) не надо использовать 100500 аргументов, 3 это уже предел, если есть желание прислать в метод больше 3 аргументов то формируйте и предавайте отдельный объект, так проще и понятнее.