Тестирование ПО | QA Auto
Открыть в Telegram
QA Auto с 2005 года. Рассказываю про автоматизацию тестирования на Java, Rest Assured, TestNG, JUnit. Обучаю автоматизации тестирования на Java: http://qaway.ru/qa-courses/ Если видео нравится больше текста: https://youtube.com/c/QAWayAuto
Больше1 149
Подписчики
+124 часа
-77 дней
-1130 день
Архив постов
💬 Типы тестирования веб-приложений
Тестирование веб-приложений - это достаточно объёмный раздел тестирования. Его можно разделить на следующие типы тестирования.
🔸 Тестирование функциональности. Это проверка того, что каждая функция веб-приложения работает в соответствии с требованиями. Эта область тестирования включает в себя проверку правильной работы ссылок, форм, загрузки файлов, cookie и другой функциональности веб-приложения.
🔸 Тестирование юзабилити. Сюда мы можем отнести проверку веб-приложения с точки зрения удобства пользователя. Здесь важно убедиться, что приложение интуитивно понятно. Пользователь легко в нём ориентируется, а само приложение является простым в использовании.
🔸 Тестирование совместимости. Это проверка работы веб-приложения в разных браузерах и на различных устройствах. Важно, чтобы взаимодействие с пользователем было одинаковым независимо от выбранной технологии, браузера или устройства.
Курсы для QA | Дзен | YouTube
💬 Что такое assertEquals() в JUnit?
assertEquals() — это метод в библиотеке #JUnit, который используется для проверки, что два объекта равны друг другу. Если они равны, тест проходит успешно. Если не равны, тест завершается с ошибкой, и мы увидим сообщение о том, что ожидаемое значение не совпало с фактическим.
Если в автотестах мы проверяем метод, который должен возвращать определенное значение, можно использовать assertEquals, чтобы убедиться, что метод действительно возвращает то, что ожидаем.
public class AssertEqualsTest {
public int sum(int a, int b) {
return a + b;
}
@Test
public void testSum() {
int result = sum(2, 3);
// Проверяем, что результат сложения 2 и 3 равен 5
assertEquals(5, result, "2 + 3 должно быть равно 5");
}
}
Предположим, у нас есть простой метод sum(), который складывает два числа.
Чтобы убедиться, что метод работает правильно, напишем для него простой тест. Внутри автотеста мы вызываем метод sum и сохраняем результат в переменную result. В методе assertEquals() мы проверяем, что результат равен 5. Если результат не равен 5, тест упадет, и мы увидим сообщение «2 + 3 должно быть равно 5».
Вам больше нравится #TestNG? В моём курсе про TestNG на степике есть бесплатный урок. Если хотите больше узнать о возможностях TestNG вам сюда. Потом просто нажмите на кнопку 'Попробовать бесплатно'.
Мини курс по Java | Дзен | YouTube💬 Устранение избыточности с помощью DISTINCT.
В #SQL DISTINCT позволяет исключить повторяющиеся значения из результата выполнения запроса SELECT.
DISTINCT можно задать только один раз для данного запроса SELECT. Если он извлекает множество полей, тогда исключаются строки, в которых повторяются все выбранные поля. Строки, в которых некоторые значения совпадают, а другие отличаются, включаются в результат. DISTINCT фактически работает со всей строкой результата, а не с отдельными полями, предотвращая дублирование данных.
Если нужно выяснить, какие фамилии присутствуют в нашей таблице, а полные данные вместе с адресами не имеют значения. Сейчас нам нужен лишь список фамилий. Нам необходимо ввести первую команду. Чтобы получить список без повторяющихся элементов, нужно добавить к ней ключевое слово DISTINCT.
DISTINCT анализирует информацию, полученную в результате обработки данных, и удаляет повторяющиеся значения. Это эффективный метод для исключения избыточных данных.
Курсы для QA | Дзен | YouTube
💬 Тестирование Web приложений.
Как тестировщик, во время тестирования веб-сайта, вы проверяете его функциональность, пользовательский интерфейс (UI) и пользовательский опыт (UX). Это основные моменты для удобной работы веб-сайта в интернете. Всё выглядит хорошо, и код готов к запуску, чтобы стать доступным всем пользователям.
Однако через пару дней вы узнаёте, что кто-то проник на сайт и украл пользовательские данные. Это серьёзная проблема, которая может привести к краху всего бизнеса. Была ли ответственность за это на команде тестирования? Должны ли были они это предусмотреть? Да!
Всё, что связано с веб-приложением, относится к тестированию web приложений. Оно также включает в себя безопасность веб-приложений, API, которые помогают в коммуникации, тестирование производительности и так далее. Даже если в одном браузере всё работает нормально, тестировщик должен проверить одинаковые функции в каждом из браузеров, которые являются целевыми для приложения.
Мини курс по Java | Дзен | YouTube
💬 Поиск элемента по @id с помощью CSS селекторов.
Ранее для поиска элемента на странице в Selenide мы использовали атрибут @id. Аналогичным образом мы можем найти элемент с помощью CSS селектора.
Одно из преимуществ CSS-селекторов - это простота и читаемость. CSS-селекторы часто короче и понятнее, чем, например, XPath. В большем количестве браузеров CSS-селекторы работают быстрее, чем XPath. Рекомендуется использовать уникальные атрибуты. Старайся выбирать такие локаторы, которые точно указывают на один элемент.
public class SelenideFirstTest {
@Test
void checkDropDownCss() {
String url = "https://the-internet.herokuapp.com/dropdown";
open(url);
SelenideElement element = $("#dropdown");
element.should(tagName("select"));
}
}
В #Selenide для поиска элемента по id воспользуемся методом $. В параметре нужно передать CSS селектор с указанием идентификатора.
В нашем тесте, после открытия страницы, мы сначала ищем элемент с идентификатором dropdown. Затем с помощью метода should проверяем имя тега у найденного элемента. Для этого передаём внутри should статический метод tagName, который содержит ожидаемое имя тега select. Тест пройдёт успешно, если имя тега с таким идентификатором на странице совпадёт с ожидаемым значением.
Курсы для QA | Дзен | YouTube💬 Провайдеры данных в отдельном классе.
По мере того как вы будете расширять тестовое покрытие и увеличивать количество автотестов, вам может потребоваться вынести провайдер данных в отдельный класс. Это позволит создать более понятную структуру ваших автотестов и упростить повторное использование существующего провайдера данных в других тестах.
public class NumbersProvider {
@DataProvider(name = "numbers")
public Object[][] dataProviderMethod() {
return new Object[][] {
{1, false},
{2, true}
};
}
}
В этом примере в отдельном классе мы создадим специальный метод с аннотацией @DataProvider, который будет возвращать тестовые данные. Эти данные будут представлять собой число, за которым следует логическое значение: true, если число чётное, и false, если нечётное.
public class DataProviderTest {
@Test(dataProvider = "numbers")
void checkOddOrEvenNumber(Integer number, Boolean result) {
Assert.assertEquals(number % 2 == 0, result);
}
}
В тестовом методе мы используем аннотацию @Test, чтобы указать имя созданного провайдера данных и класс, в котором он находится. Затем мы передаём данные из провайдера в тестовый метод через входные параметры. В теле метода мы проверяем, является ли число чётным, и сравниваем результат с ожидаемым значением с помощью assertEquals.
Запустив наши тесты, мы убедимся, что оба они проходят успешно.
В моём курсе про #TestNG на степике есть бесплатный урок. Если хотите больше узнать о возможностях TestNG вам сюда. Потом просто нажмите на кнопку 'Попробовать бесплатно'.
Мини курс по Java | Дзен | YouTube💬 Проверка массива на равенство.
Сегодня мы рассмотрим, как в Rest Assured проверить, что массив равен ожидаемому. Это может быть полезно, когда в ответе мы получаем массив элементов и хотим убедиться, что он совпадает с ожидаемым значением.
public class RestAssuredTest {
@Test
public void checkArrayEquals() {
given().
baseUri("https://reqres.in/api").
when().
queryParam("page", 1).
get("/users").
then().assertThat().
log().all().
body("data.id", Matchers.equalTo(List.of(1, 2, 3, 4, 5, 6)));
}
}
В автотесте мы будем вызывать API для получения списка пользователей. После этого в консоль выведем результат этого запроса. Запустим тест и посмотрим, как выглядит ответ.
В тесте хотим проверить, что массив идентификаторов в ответе совпадает с ожидаемым значением. Для проверки воспользуемся методом body. В первом параметре с помощью JsonPath указываем элемент, который хотим проверить. Чтобы получить идентификаторы объектов, нужно указать data.id. Во втором параметре используем equalTo из фреймворка Hamcrest, содержащий нужную проверку. С его помощью убедимся, что массив идентификаторов совпадает с ожидаемым. В аргументе передадим это значение, равное списку идентификаторов от 1 до 6.
Если идентификаторы совпадают, тогда тест пройдет успешно. Запустим наш тест, чтобы в этом убедиться.
В моём курсе про автотесты для #API, на степике есть бесплатный урок. Если хотите больше узнать о возможностях Rest Assured вам сюда. Потом просто нажмите на кнопку 'Попробовать бесплатно'.
Курсы для QA | Дзен | YouTube💬 Основы тестирования Web приложений
В нашем технологическом мире веб-сайты используются повсюду. Для оплаты счетов или покупки того, что вы давно хотели приобрести, нам всем может понадобиться веб-сайт. Еще до того, как попасть на эти веб-сайты, мы выполняем поиск по нашему запросу в Яндекс или Google, которые сами по себе являются веб-сайтами.
Веб-тестирование включает в себя оценку функциональности, удобства использования, безопасности и производительности веб-приложения. Оно направлено на выявление и устранение проблем, мешающих эффективной работе приложения в различных браузерах, устройствах и сетях, и удобству взаимодействия с пользователем.
Что касается пользователей, веб-сайты играют важную роль в их повседневной жизни. Как разработчики и тестировщики, мы считаем, что для поддержания бизнеса и привлечения пользователей к работе на нашем веб-сайте мы должны быть уверены, что со стороны пользователя все будет в порядке. Этого можно достичь с помощью веб-тестирования.
Мини курс по Java | YouTube
💬 Проверка описания кода ответа.
Сегодня мы напишем простой тест для проверки описания кода ответа в #Postman. В начале Http ответа от сервера находится стартовая строка. Она содержит версию протокола, статус код и его описание. В нашем примере мы хотим проверить успешный ответ от сервера. Мы ожидаем получить код ответа 200 OK.
Добавим новый запрос и откроем вкладку Scripts. Там выберем Post-response. Будем проверять описание статус кода ответа. Для этого добавим новый тест. Первым параметром укажем строку, которая будет показана в результатах запуска. Далее добавим новую функцию. В ней мы с помощью метода pm.expect сделаем проверку. Нам нужно убедиться, что описание кода ответа в поле status объекта pm.response совпадает с ожидаемым значением OK. Сама проверка делается с помощью метода to.be.eql().
Запустим наш тест и посмотрим, как будут выглядеть результаты.
Курс по Java | Дзен | YouTube
💬 Многомерные массивы.
Сегодня поговорим о многомерных массивах в #Java. В Java многомерные массивы - это массивы массивов. Для того, чтобы объявить переменную многомерного массива используются дополнительные квадратные скобки. Например для объявления двумерного массива нам потребуется две пары квадратных скобок.
public class Lesson_03_3 {
public static void main(String[] args) {
int[][] matrix = new int[5][4];
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
matrix[i][j] = i + j;
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}
}
}
В этом примере мы создали двумерный массив matrix. В программе, происходит резервирование памяти для массива размерностью 3 на 4 элемента. Внутри эта матрица реализована как массив массивов значений типа int. Внутри циклов for каждому элементу массива присваивается сумма номеров его столбца и строки. Далее в программе делается вывод значения элемента массива в консоль.
В итоге после выполнения программы массив будет выведен в виде таблицы. Мы сможем убедиться в этом, запустив нашу программу.
В моём курсе про Java на Cтепике есть бесплатный урок. Если хотите больше узнать о возможностях этого языка программирования вам сюда.
Мини курс по Java | Дзен | YouTube💬 Что такое Playwright?
Playwright — это тестовый фреймворк для автоматизации end-to-end сценариев, разработанный компанией Microsoft. Он пользуется большой популярностью среди пользователей и является одним из часто используемых средств для автоматизации web тестирования.
Playwright позволяет автоматизировать работу с браузерами построенными на движках Chromium, Gecko и WebKit с помощью единого API. Вы можете писать автотесты в Playwright, используя JavaScript, Java, Python и другие популярные языки программирования
Основные возможности Playwright:
🔸 Возможность запускать тестовые сценарии в различных популярных браузерах, построенных на движках Chromium, WebKit и Gecko.
🔸 Совместимость с различными операционными системами, включая Windows, Mac OS и Linux, что делает её универсальным инструментом для автотестов.
🔸 Playwright позволяет тестировщикам взаимодействовать с элементами веб-сайта, что делает его важным инструментом для автоматизации различных аспектов веб-разработки.
Мини курс по Java | YouTube
💬 Аннотация @AfterAll.
Сегодня мы рассмотрим аннотацию @AfterAll в #JUnit. Как и @BeforeAll, она относится к аннотациям жизненного цикла теста. Эти аннотации позволяют добавить дополнительную логику, которая будет выполнена в нужный момент до или после запуска конкретного автотеста.
Метод с такой аннотацией будет запущен только один раз после запуска всех тестов в данном классе. Как и в случае с @BeforeAll, метод с аннотацией @AfterAll должен быть статическим. Давайте посмотрим, как это работает на практике.
public class LifeCycleTest {
@Test
void lifeCycleTest1(TestInfo testInfo) {
System.out.printf("Test : %s\n", testInfo.getDisplayName());
}
@Test
void lifeCycleTest2(TestInfo testInfo) {
System.out.printf("Test : %s\n", testInfo.getDisplayName());
}
@AfterAll
static void tearDown() {
System.out.println("AfterAll");
}
}
Добавим метод с аннотацией @AfterAll. В нём будет только вывод информации в консоль в момент запуска. Чтобы показать порядок запуска, добавим в наш класс два теста. В каждом из них будет вывод названия теста. Для этого мы будем использовать объект TestInfo, содержащий информацию о тесте.
Запустим тесты и посмотрим вывод в консоли. В результатах мы увидим, что были запущены два тестовых метода. После них был запущен метод с аннотацией @AfterAll только один раз.
Вам больше нравится #TestNG? В моём курсе про TestNG на степике есть бесплатный урок. Если хотите больше узнать о возможностях TestNG вам сюда. Потом просто нажмите на кнопку 'Попробовать бесплатно'.
Курс по Java | Дзен | YouTube💬 Фильтрация данных в SELECT
Таблицы могут содержать большое количество данных, а также увеличиваться по мере добавления новых строк. Язык #SQL позволяет задать критерий фильтрации данных при выборке. Он определяет, какие строки нужно включить в результат запроса.
Оператор WHERE задаёт условие, которое будет истинным или ложным для каждой строки таблицы. Команда извлекает только те строки из таблицы, для которых условие истинно.
С помощью предложения WHERE программа обработки базы данных просматривает таблицу строка за строкой и проверяет, истинно ли условие для каждой строки.
Выведем все строки таблицы, с помощью первой команды. В результате видим 5 строк.
После добавления в запрос условия WHERE, в результатах осталось только 2 строки. Столбец last_name включён в результат не потому, что он указан в предложении WHERE, а потому, что он указан в предложении SELECT. Столбец, используемый в предложении WHERE, необязательно будет среди столбцов в результате запроса.
Курсы для QA | Дзен | YouTube
💬 Основы CI/CD - ч.3
🔸 Стабильная среда тестирования
Код следует тестировать в отдельной версии production среды. Не стоит тестировать новый код в production версии. Создайте её копию, максимально приближенную к реальной. Используйте подробные тестовые сценарии для поиска ошибок, которые могли возникнуть в ходе первоначального тестирования.
🔸 Максимальная наглядность
Каждый разработчик должен иметь доступ к последней версии кода и видеть все изменения, внесённые в репозиторий. Используйте систему контроля версий для отслеживания изменений, чтобы разработчики знали, какая версия является актуальной. Максимальная наглядность позволяет каждому участнику команды отслеживать прогресс и выявлять потенциальные проблемы.
🔸 Предсказуемое развёртывание
Развёртывания должны быть рутинными и мало рискованными, чтобы команда могла выполнять их в любое удобное время. Процессы CI/CD должны быть надёжными, чтобы команда могла быть уверена в развёртывании обновлений в любой момент.
Мини курс по Java | Дзен | YouTube
💬 Поиск по имени тэга с помощью CSS селекторов.
Еще один способ для поиска элемента на странице в #Selenide - это #CSS селекторы. Давай разберем, что это такое, простым языком. CSS (Cascading Style Sheets) — это язык, который используется для стилизации веб-страниц, но его селекторы также можно использовать для поиска элементов в автоматизированных тестах.
<div class="large-6 small-12 columns large-centered">
<h3>Inputs</h3>
<div class="example">
<p>Number</p>
<input type="number">
</div>
</div>
В данном примере у нас есть заголовок, находящийся внутри тега h3. Его мы можем найти, используя CSS селектор по имени тега. Для поиска нужного элемента воспользуемся методом $. Обратите внимание, что здесь мы не используем методы класса By, а просто передаём строку, содержащую css селектор.
public class SelenideFirstTest {
@Test
void checkInputsWithCss() {
String url = "https://the-internet.herokuapp.com/inputs";
open(url);
SelenideElement element = $("h3");
element.shouldHave(text("Inputs"));
}
}
В нашем тесте, после открытия страницы, мы сначала ищем элемент с с именем тега 'h3'. Затем, с помощью метода shouldHave, проверяем текст у найденного элемента. Для этого передаём внутри should статический метод text, который содержит ожидаемый текст. Тест пройдёт успешно, если текст внутри элемента с таким именем тега на странице совпадёт с ожидаемым значением.
Курс по Java | Дзен | YouTube💬 Провайдер данных.
Вам часто будут попадаться тестовые сценарии с одинаковой логикой и разными входными данными. Специально для этих случаев в #TestNG есть удобный способ параметризации автотестов с помощью DataProvider.
Один и тот же тестовый метод будет использоваться несколько раз с разными наборами данных. Это сократит количество методов и облегчит поддержку в будущем.
public class DataProviderTest {
@DataProvider(name = "numbers")
public Object[][] dataProviderMethod() {
return new Object[][] {
{1, false},
{2, true}
};
}
@Test(dataProvider = "numbers")
void checkOddOrEvenNumber(Integer number, Boolean result) {
Assert.assertEquals(number % 2 == 0, result);
}
}
В этом примере мы создаём специальный метод и добавляем к нему аннотацию @DataProvider. Этот метод будет возвращать тестовые данные. Они представляют собой число, за которым следует логическое значение: true, если число чётное, и false, если нечётное.
В тестовом методе мы используем аннотацию @Test, чтобы указать имя созданного провайдера данных. Затем мы передаём данные из провайдера в тестовый метод через входные параметры. В теле метода мы проверяем, является ли число чётным, и сравниваем результат с ожидаемым значением с помощью assertEquals.
Запустив наши тесты, мы убедимся, что оба теста проходят успешно.
В моём курсе про TestNG на степике есть бесплатный урок. Если хотите больше узнать о возможностях TestNG вам сюда. Потом просто нажмите на кнопку 'Попробовать бесплатно'.
Курсы для QA | Дзен | YouTube💬 Как проверить, равен ли элемент одному из указанных?
Сегодня мы рассмотрим, как в #RestAssured проверить равенство элемента одному из указанных значений. Это может быть полезно, когда мы не знаем точного значения элемента, но известно, что оно точно принадлежит группе значений.
public class RestAssuredTest {
@Test
public void checkPetStatus() {
given().
baseUri("https://petstore.swagger.io/v2/").
when().log().all().
contentType(ContentType.JSON).
queryParam("status", "pending", "sold").
get("pet/findByStatus").
then().log().all().
statusCode(200).
body("status[0]", Matchers.oneOf("pending", "sold"));
}
}
В данном примере мы используем #API для поиска по заданным статусам. Точно неизвестно, какой статус будет у первого элемента списка, но он точно должен быть одним из указанных в запросе.
В тесте хотим проверить, что первый объект из списка имеет один из указанных в запросе статусов. Для проверки воспользуемся методом body. В первом параметре с помощью JsonPath указываем элемент, который хотим проверить. Чтобы проверить status первого объекта, нужно указать status[0]. Во втором параметре используем oneOf из фреймворка Hamcrest, содержащий нужную проверку. С его помощью убедимся, что значение статуса равно одному из указанных. В аргументе значения pending и sold.
Если значение совпадёт с одним из указанных, тогда тест пройдет успешно. Запустим наш тест, чтобы в этом убедиться.
В моём курсе про автотесты для #API, на степике есть бесплатный урок. Если хотите больше узнать о возможностях Rest Assured вам сюда. Потом просто нажмите на кнопку 'Попробовать бесплатно'.
Курсы для QA | Дзен | YouTube💬 Основные возможности Cypress.
Вот несколько особенностей #Cypress, которые делают эту платформу очень хорошим инструментом для автоматизации тестирования:
🔸 Cypress предоставляет инструментарий для запуска тестов. С его помощью вы можете выполнять автоматизированные тесты прямо в своей локальной системе. Это позволяет получать быструю обратную связь во время разработки тестов.
🔸 Cypress поддерживает параллельный запуск тестов. Это означает, что вы можете значительно сократить время, необходимое для выполнения всего набора тестов.
🔸 Платформа может быть интегрирована с популярными инструментами CI/CD, такими как CircleCI и AWS CodeBuild. Это позволяет автоматизировать выполнение тестов в рамках вашего конвейера непрерывной интеграции.
🔸 Cypress автоматически ожидает, пока элементы на странице станут доступны. Это уменьшает необходимость в ручном ожидании внутри тестовых сценариев.
🔸 Если сценарий завершается неудачно, Cypress автоматически сохраняет скриншот страницы
Мини курс по Java | Дзен | YouTube
💬 Добавление параметра в скриптах.
Сегодня поговорим о том, как в Postman добавить новый query параметр в скриптах. Напомню, что в HTTP-запросах они представляют собой дополнительные данные, которые передаются в URL-адресе. Они используются для передачи на сервер параметров для фильтрации, поиска, сортировки и т.д. Query-параметры могут использоваться вместе с любым HTTP-методом. Наиболее часто они используются с методом GET.
Добавим новый запрос. Он содержит один query параметр city. Откроем вкладку Scripts -> Pre-request. Напишем следующий код. С помощью метода addQueryParams, он добавит к запросу дополнительный параметр строки запроса. В строке мы передаём его имя и значение. Имя у него будет 'country', а значение 'ru'.
Выполним запрос и откроем тело ответа. Как видим запрос был запущен с двумя параметрами.
Курсы для QA | Дзен | YouTube
💬 Типы данных с дробной частью.
Сегодня поговорим про типы данных с дробной частью в #Java.
Существуют два таких типа данных: float и double. Они представляют числовые значения с одинарной и двойной точностью соответственно. Разрядность этих типов составляет 32 и 64 бита. Тип double употребляется чаще, чем float, т.к. используется во всех математических функциях библиотек Java. Например, метод Math.sqrt(), определенный в стандартном классе Math, который вычисляет квадратный корень, возвращает значение double.
public class Lesson_02_2 {
public static void main(String[] args) {
// a*x^2 + b*x + c = 0
int a = 1;
int b = -1;
int c = -6;
double d = b * b - 4 * a * c; // 1
double x1 = (-b + Math.sqrt(d)) / (2 * a); // 2
double x2 = (-b - Math.sqrt(d)) / (2 * a); // 3
System.out.printf("x1 = %s, x2 = %s", x1, x2);
}
}
В этой программе мы будем вычислять корни квадратного уравнения. Метод sqrt() определен в классе Math, поэтому для вызова нужно указать его перед именем метода. Используя метод printf выведем корни уравнения в консоль. Запустим нашу программу и посмотрим её вывод.
В моём курсе про Java на Cтепике есть бесплатный урок. Если хотите больше узнать о возможностях этого языка программирования вам сюда.
Мини курс по Java | Дзен | YouTube