Как стать автором
Поиск
Написать публикацию
Обновить

Без ручного нет автоматизированного. Простой тест на Java для начинающих QA

Уровень сложностиПростой
Время на прочтение6 мин
Количество просмотров8.7K

Привет, Хабр! Меня зовут Иван, я инженер по ручному и автоматизированному тестированию. Сегодня поговорим о том, почему ручное тестирование основа автоматизации и как ручному тестировщику преобразовать свои ТК в автотесты.
Мой тг канал про QA

Теория

Ручное тестирование (manual)— это процесс тестирования без использования специальных ПО. Тестировщик имитирует реальные действия пользователя и старается охватить максимум функций продукта и найти несоответствия между спецификациями и конечной её реализацией. Manual Testing преодолевает планирование тестирования, анализ спецификаций, приоритизация проверок, тест-анализ, тест-дизайн, тестирование и проведение отчетности по результатам.

Автоматизированное тестирование (automation)— это способ тестирования продукта с использованием специальных программ. QA-инженер на основе тестового сценария пишет автотесты, которые проверяют ПО на ошибки, прогоняет на продукте разные пользовательские сценарии, тестирует базовый функционал, собирает ошибки в итоговый отчет. На основе тестового сценария пишутся автотесты, в свою очередь тестовый сценарий составляется на этапе ручного тестирования.

Теперь мы можем сделать вывод, что автоматизация - это ручные тесты, переведённые в автоматический процесс. И если нет ручных, то нет и автотестов.

Хочешь кататься, люби и саночки возить - это как раз про проектирование тест-кейсов. Мы конечно говорим не про автоматизаторов, которые пишут автотесты по ТК от ручных тестировщиков. Мы говорим про QA, который одновременно выполняет роль manual и automation engineer в команде.

В команде вы можете прийти на проект и выполнять ручное тестирование, но в какой-то момент понять, что все что я спроектировал и каждый раз тестирую руками - могу по щучьему велению перевести в автоматизированый процесс. Звучит здорово, но как?

Упрощаем теорию языков программирования и сокращаем выбор до:

🔵 Python
🔴 Java
🟡 JavaScript

На языках, указанных выше, так же может идти разработка ваших проектов.
Сегодня мы будем писать на Java.

Проектирование тестовой документации

Начнем с ТК и закончим автотестом! Сегодня мы автоматизируем проверку:
"Авторизация на странице https://music.yandex.ru/home"

Шаг

ОР

1

Откроем https://music.yandex.ru/home в инкогнито

Отображается страница онбординга нового пользователя (подписка ЯндексПлюс)

2

Нажимаем на крестик для закрытия онбординг-окна

Отображается домашняя страница Яндекс Музыки с медиа

3

Нажимаем кнопку "Войти" в хэддере

Переключаемся на вторую вкладку с авторизацией пользователя

4

Вводим логин

5

Для ввода пароля ждем "Войти"

6

Вводим пароль


7

Для входа жмем "Продолжить"

Вкладка авторизации закрывается
На странице https://music.yandex.ru/home
заменяется кнопка "Войти" на иконку "Профиль"

8

Нажимаем на "Профиль"

Отображается имя пользователя (из шага 4)

9

Проверить отображения логина из шага 4

У нас есть легенда автотеста:
🚗 Шаг;
🛞 ОР шага;
⚠️ Доп. условие, которого нет в ручном тесте.

После проектирования и написания, мы можем приступить к автоматизации нашего ручного теста.

Подготовка окружающей среды для автотестов

Статья как установить IntelliJ IDEA и все необходимые зависимости для запуска тестов. Пишем автотест с использованием Selenium Webdriver, Java 8 и паттерна Page Object.

Здесь вы можете клонировать готовый репозиторий с уже реализованным моим проектом на Java 11. Необходимо клонировать проект локально на компьютер. Если возникли трудности в запуске проекта - листаем в конец статьи до "Советы по запуску".

Проектирование автотестов

⚠️ Для того чтобы Яндекс не поставил капчу на наш парсинг сайта, нам необходимо сначала зайти на любую страницу, к примеру google translate и только после мы загружаем https://music.yandex.ru/home. Задача избежать прямого посещения сайта.

🚗 Шаг 1 Откроем https://music.yandex.ru/home в инкогнито

driver.get(ConfProperties.getProperty("Googletranslate")); //получение ссылки на google translate
driver.get(ConfProperties.getProperty("loginpage")); //получение ссылки на Яндекс Музыку из файла настроек
В моем проекте Класс TestYandexMusic = Классу LoginTest из статьи выше
В моем проекте Класс TestYandexMusic = Классу LoginTest из статьи выше

🚗 Шаг 2 Нажимаем на крестик для закрытия страницы онбординга

profilePage.clickCloseAdYndxMusic(); //закрытие страницы онбординга (Шаг 2)

🚗 Шаг 3 Нажимаем кнопку "Войти" в хэддере

profilePage.clickLoginBtnYndxMusic(); //нажатие на кнопку "Войти" (Шаг 3)

🛞 ОР шага 3 Переключаемся на вторую вкладку с авторизацией пользователя

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.numberOfWindowsToBe(2)); //ожидание появления 2 вкладки (ОР шага 3)

⚠️ Условие, в котором определяется главная вкладка, а также переключение на вкладку авторизации.

String mainWindowHandle = driver.getWindowHandle();
        Set<String> allWindowHandles = driver.getWindowHandles();
        for (String handle : allWindowHandles) {
            if (!handle.equals(mainWindowHandle)) {
                driver.switchTo().window(handle);
                break;
            }
        }

🚗 Шаг 4 Вводим логин
🚗 Шаг 5 Для ввода пароля ждем "Войти"
🚗 Шаг 6 Вводим пароль
🚗 Шаг 7 Для входа жмем "Продолжить"

loginPage.inputLogin(ConfProperties.getProperty("login"));
loginPage.clickLoginBtn();
loginPage.inputPasswd(ConfProperties.getProperty("password"));
loginPage.clickLoginCnt();
//ввод логина и пароля (Шаги 5-7)

⚠️ В ручном тесте автоматически происходит переключение на главную вкладку после авторизации, но нам необходимо переключится самостоятельно для определения элементов страницы:

Thread.sleep(3000); // ожидаем аутентификацию прежде чем переключится на главную вкладку

driver.switchTo().window(mainWindowHandle); // переключаемся обратно на главную вкладку

driver.navigate().refresh(); // обновляем страницу
WebDriverWait pageLoadWait = new WebDriverWait(driver, 10);
pageLoadWait.until(ExpectedConditions.urlContains(ConfProperties.getProperty("loginpage"))); // ожидаем загрузку страницы

🚗 Шаг 8 Нажимаем на "Профиль"

profilePage.clickProfileBtn(); // открываем меню профиля

🚗 Шаг 9 Проверить отображения логина из шага 4

String user = profilePage.getUserName();
        Assert.assertEquals(ConfProperties.getProperty("login"), user);

Важный шаг, которого нет в ТК - закрытие меню профиля. Мы проверили всё необходимое и логично, что нет необходимости писать дополнительные методы, но в автотестах необходимо связать основной тест @Testс завершающим тестом @AfterClass

Попробуйте удалить последний метод profilePage.clickProfileBtn(); и запустить тест...

Обзор основного теста:

@Test
    public void loginTestYM() throws InterruptedException {

        profilePage.clickCloseAdYndxMusic();
        profilePage.clickLoginBtnYndxMusic();

        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.numberOfWindowsToBe(2));

        String mainWindowHandle = driver.getWindowHandle();
        Set<String> allWindowHandles = driver.getWindowHandles();
        for (String handle : allWindowHandles) {
            if (!handle.equals(mainWindowHandle)) {
                driver.switchTo().window(handle);
                break;
            }
        }

        loginPage.inputLogin(ConfProperties.getProperty("login"));
        loginPage.clickLoginBtn();
        loginPage.inputPasswd(ConfProperties.getProperty("password"));
        loginPage.clickLoginCnt();

        Thread.sleep(3000); // ожидаем аутентификацию прежде чем переключится на главную вкладку

        driver.switchTo().window(mainWindowHandle); // переключаемся обратно на главную вкладку

        driver.navigate().refresh(); // обновляем страницу

        WebDriverWait pageLoadWait = new WebDriverWait(driver, 10);
        pageLoadWait.until(ExpectedConditions.urlContains(ConfProperties.getProperty("loginpage"))); // ожидаем загрузку страницы

        profilePage.clickProfileBtn(); // открываем меню профиля

        String user = profilePage.getUserName();
        Assert.assertEquals(ConfProperties.getProperty("login"), user);

        profilePage.clickProfileBtn(); // закрываем меню профиля
    }

Помимо класса TestYandexMusic у нас также есть классы аналогичные проекту выше ProfilePage, LoginPage, ConfProperties.

Вопрос:
Чем отличается метод loginPage.clickLoginBtn(); от clickLoginBtn();?

Чем отличается метод loginPage.clickLoginBtn(); от методаclickLoginBtn();?
Чем отличается метод loginPage.clickLoginBtn(); от методаclickLoginBtn();?

loginPage.clickLoginBtn(); - является экземпляром класса loginPage. В то время как clickLoginBtn(); - является методом в классе TestYandexMusic.
Простыми словами, первое это ссылка на пост в другом телеграм канале, а второе это собственный пост, на который ты ссылаешься. Итог: это один и тот же метод, но один снаружи, а другой внутри.

Такой подход часто используется в объектно-ориентированном программировании, где методы вызываются на конкретных экземплярах классов.

Итог

Автоматизация тестирования - это не процесс по решению математических формул, это лишь перевод ТК на язык, который понимает браузер. Браузер в свою очередь проводит за вас регресс проверок. Мы взяли хорошую статью из Хабра и усовершенствовали проверки, чтобы избежать множества подводных камней, таких как контекстная реклама, капча от парсинга сайта, изменение размера окон и многое другое.

⚠️ Мой тг канал, где я рассказываю про QA

"Соседи обзавидуются..."
"Соседи обзавидуются..."

Советы по запуску проекта

1 Conf.properties Необходимо заменить путь до файла с настройками conf.properties

2 conf.properties Необходимо заменить путь до файла драйвера 🟣
И заменить данные логина и пароля для входа в аккаунт. Советую создать тестовый аккаунт.

Может возникать ошибка запуска из-за разных версий Chrome Браузера на вашем компьютере и установленного вами ChromeDriver'а. Они должны совпадать версией, к примеру 114.0.5993.117 = 114. На скрине ниже браузер 118 версии.

Теги:
Хабы:
Всего голосов 5: ↑2 и ↓3+1
Комментарии0

Публикации

Ближайшие события