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

от автора

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


ссылка на оригинал статьи https://habr.com/ru/articles/789524/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *