Как стать автором
Обновить

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

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

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

Публикации

Истории

Работа

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