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

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

Теги: #<Tag:0x00007f748258e2f8> #<Tag:0x00007f748258e208> #<Tag:0x00007f748258e140> #<Tag:0x00007f748258e078> #<Tag:0x00007f748258dfb0> #<Tag:0x00007f748258dec0>

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

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”. Объясните пожалуйста почему так?

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

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

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

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

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

1 Симпатия

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

1 Симпатия