Без ручного нет автоматизированного. Простой тест на 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 | Для входа жмем "Продолжить" | Вкладка авторизации закрывается |
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")); //получение ссылки на Яндекс Музыку из файла настроек
? Шаг 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();
- является экземпляром класса loginPage. В то время как clickLoginBtn();
- является методом в классе TestYandexMusic.
Простыми словами, первое это ссылка на пост в другом телеграм канале, а второе это собственный пост, на который ты ссылаешься. Итог: это один и тот же метод, но один снаружи, а другой внутри.
Такой подход часто используется в объектно-ориентированном программировании, где методы вызываются на конкретных экземплярах классов.
Итог
Автоматизация тестирования - это не процесс по решению математических формул, это лишь перевод ТК на язык, который понимает браузер. Браузер в свою очередь проводит за вас регресс проверок. Мы взяли хорошую статью из Хабра и усовершенствовали проверки, чтобы избежать множества подводных камней, таких как контекстная реклама, капча от парсинга сайта, изменение размера окон и многое другое.
⚠️ Мой тг канал, где я рассказываю про QA
Советы по запуску проекта
1 Conf.properties Необходимо заменить путь до файла с настройками conf.properties
2 conf.properties Необходимо заменить путь до файла драйвера ?
И заменить данные логина и пароля для входа в аккаунт. Советую создать тестовый аккаунт.
Может возникать ошибка запуска из-за разных версий Chrome Браузера на вашем компьютере и установленного вами ChromeDriver'а. Они должны совпадать версией, к примеру 114.0.5993.117 = 114. На скрине ниже браузер 118 версии.