Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Не запускает тестовый класс, выкидывает NullPointerException

intellij
idea
java
testng
selenium
webdriver
Теги: #<Tag:0x00007fedc15a6660> #<Tag:0x00007fedc15a6138> #<Tag:0x00007fedc15a5ad0> #<Tag:0x00007fedc15a4ef0> #<Tag:0x00007fedc15abb60> #<Tag:0x00007fedc15ab908>

(Matthew Prok) #1

Объясните пожалуйста в чем прикол. Изначально был один тестовый класс, где была такая структура:

public class MainAlfadetaliTest extends TestBase {

    private HomePage homepage;
    private Login login;
    private MainMenu mainMenu;

    @BeforeTest
    public void initPageObject() {
        homepage = PageFactory.initElements(driver, HomePage.class);
        login = PageFactory.initElements(driver, Login.class);
        mainMenu = PageFactory.initElements(driver, MainMenu.class);
    }

    @BeforeTest
    public void login() throws IOException, InterruptedException {
        homepage.open();
        login.inputEmail("ra-nt-office@yandex.ru");
        login.inputPassword();
        login.startLogIn();
        login.confirmByEmail();
        login.inputConfirmationCodeAndSubmit();
        mainMenu.selectCompany();
        mainMenu.selectStorage();
        mainMenu.openSearchMenu();
        mainMenu.openSearchDetailsForSale();
}

    @Test
    public void checkThatBuyerIsAddedInTheOrder() throws InterruptedException {
        order.setBuyer();
        order.checkThatTheBuyerIsAdded();
    }

    @AfterTest
    public void cancelOrder() throws InterruptedException {
        mainMenu.goToOrder();
        order.cancelTheOrder();
    }

Затем я добавил второй тестовый класс, где операции для подготовки к тесту примерно одинаковые, немного отличаются:

public class MainAlfadetaliTest extends TestBase {

    private HomePage homepage;
    private Login login;
    private MainMenu mainMenu;
    private SearchDetailsForSale searchDetailsForSale;
    private Order order;
    private TaskMenu taskMenu;

    @BeforeTest
    public void initPageObjects() {
        homepage = PageFactory.initElements(driver, HomePage.class);
        login = PageFactory.initElements(driver, Login.class);
        mainMenu = PageFactory.initElements(driver, MainMenu.class);
        searchDetailsForSale = PageFactory.initElements(driver, SearchDetailsForSale.class);
        order = PageFactory.initElements(driver, Order.class);
        taskMenu = PageFactory.initElements(driver, TaskMenu.class);
    }

    @BeforeTest
    public void checkThatTheTaskForCreatingTransferRequestsHaveAppeared() throws IOException, InterruptedException {
        homepage.open();
        login.inputEmail();
        login.inputPassword();
        login.startLogIn();
        login.confirmByEmail();
        login.inputConfirmationCodeAndSubmit();
        mainMenu.selectCompany();
        mainMenu.selectStorage();
        mainMenu.openSearchMenu();
        mainMenu.openSearchDetailsForSale();
        searchDetailsForSale.inputNameOfStorage();
        searchDetailsForSale.complete();
        searchDetailsForSale.findPartWithDefiniteQuantityAndClickTheMenuButton(1);
        searchDetailsForSale.clickTheButtonAddingToOrder();
        searchDetailsForSale.addThePartToOrder();
        searchDetailsForSale.findPartWithDefiniteQuantityAndClickTheMenuButton(1);
        searchDetailsForSale.clickTheButtonAddingToOrder();
        searchDetailsForSale.addThePartToOrder();
        mainMenu.goToOrder();
    }

    @Test
    public void checkThatTheTaskForCreatingTransferRequestsHaveAppeared() throws InterruptedException {
        taskMenu.openTaskMenu();
        taskMenu.checkThatCurrentTaskIsRight(2, "Создать заявки на перемещение");
    }

    @AfterTest
    public void cancelOrder() throws InterruptedException {
        mainMenu.goToOrder();
        order.cancelTheOrder();
    }

Если запустить второй класс, то вылетит ошибка “NullPointerException”. Но если во втором классе перед названием второго метода второго @BeforeTest написать login (то есть название метода будет “logincheckThatTheTaskForCreatingTransferRequestsHaveAppeared”), то тогда тесты отработают на ура. Тоже самое и с методом первого @BeforeTest. Сейчас этот метод с таким же названием как и в первом классе, и если название просто дописать(то есть initPageObjectdlsjflsjdfjsldfjlksdjflksdjf ), то все будет работать, но если вначале названия не будет стоять “initPageObject”, то опять будет ошибка “NullPointerException”. Объясните пожалуйста почему так?


(Yaroslav Pernerovskyy) #2

Если вы делаете два метода с одной и той же аннотацией, вы не можете гарантировать порядок их выполнения. Засуньте все в один метод.


(Matthew Prok) #3

ну это не проблема, я для удобство разделил эти два метода, а второй можно просто сделать зависимым от первого. Но суть не в этом, меня больше волнует, почему если во втором классе я меняю название методов в beforеtest, тесты выполняются с ошибкой


(Vasiliy Rakshin) #4

Дайте весь стектейс ошибки.
Потому что у вас может быть ошибка внутри

        searchDetailsForSale = PageFactory.initElements(driver, SearchDetailsForSale.class);
        order = PageFactory.initElements(driver, Order.class);
        taskMenu = PageFactory.initElements(driver, TaskMenu.class);

(Yaroslav Pernerovskyy) #5

Я вас еще раз говорю, что ПОРЯДОК ВЫПОЛНЕНИЯ НЕ ГАРАНТИРУЕТСЯ. То что вы делаете, это не удобство, это ужас. Должен быть ОДИН метод с анотацией @BeforeTest точка.


(Matthew Prok) #6

Я был действительно не прав. После того, когда я все сделал в одном методе, пропала ошибка с нулпоинтерэксепшеном при разном наименовании beforetest. Спасибо, что все-таки смогли донести до меня эту истину)