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

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

maven
testng
ide
test-data
intellij
webdriver
java
Теги: #<Tag:0x00007f7b70a9ed20> #<Tag:0x00007f7b70a9eac8> #<Tag:0x00007f7b70a9e988> #<Tag:0x00007f7b70a9e848> #<Tag:0x00007f7b70a9e708> #<Tag:0x00007f7b70a9e578> #<Tag:0x00007f7b70a9e410>

(Максим Иванов) #1

Использую 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


(Nik Sidorenko) #2

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

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

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

И ещё.

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

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


(Farof Well) #3

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