Java for Beginner
706 subscribers
614 photos
166 videos
12 files
963 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Введение в тестирование в Spring

Основы тестирования

Тестирование — это ключевой этап разработки, позволяющий удостовериться в правильности работы приложения. Без качественных тестов сложно поддерживать стабильность приложения, особенно с ростом функциональности. Рассмотрим основные понятия тестирования и их важность.

Виды тестирования

Юнит-тесты (Unit Tests):
Тестируют отдельные модули или компоненты приложения, такие как методы или классы.
Основная цель — проверка логики отдельно взятого компонента.
Пример: Проверка корректности метода расчёта.


Интеграционные тесты (Integration Tests):
Проверяют взаимодействие между различными компонентами приложения (например, контроллер ↔️ сервис ↔️ база данных).
Цель — убедиться, что компоненты работают совместно.


Функциональные тесты (Functional Tests):
Проверяют функциональность приложения с точки зрения пользователя.
Пример: Убедиться, что REST API возвращает ожидаемые данные.


Энд-ту-энд тесты (E2E Tests):
Покрывают весь процесс использования приложения, от начала до конца.
Используются для проверки полного пользовательского сценария.


Пирамида тестирования

В идеале, проект должен иметь:
Много юнит-тестов.
Умеренное количество интеграционных тестов.
Немного функциональных и E2E тестов.
Это помогает балансировать между скоростью тестирования и его надежностью.


Инструменты тестирования

Spring предоставляет мощный набор инструментов для тестирования. Ключевые библиотеки и фреймворки:

JUnit 5 (Jupiter):
Основной фреймворк для написания юнит-тестов в Java.
Обеспечивает аннотации для написания и управления тестами.


Mockito:
Используется для создания моков (объектов-заглушек), которые эмулируют поведение реальных зависимостей.
Упрощает тестирование компонентов с зависимостями.


Spring Test:
Расширяет возможности JUnit и Mockito для работы с контекстом Spring.
Позволяет тестировать компоненты Spring (например, бины, репозитории, сервисы) в интеграционном контексте.


#Java #Training #Spring #Testing
👍1
Написание первого теста

Рассмотрим пример класса, который нужно протестировать:
public class Calculator {
public int add(int a, int b) {
return a + b;
}

public int subtract(int a, int b) {
return a - b;
}
}


Теперь напишем тест для метода add:
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

public class CalculatorTest {

@Test
void testAddition() {
Calculator calculator = new Calculator();
int result = calculator.add(5, 3);
Assertions.assertEquals(8, result, "Addition should return correct result");
}
}


Разбор кода

Ключевые элементы:
@Test — помечает метод как тестовый.
Assertions.assertEquals — проверяет, что результат равен ожидаемому значению.

Результат:
Если метод возвращает 8, тест пройдет успешно.
Если результат другой, будет выдано сообщение об ошибке.


Это элементарный тест который показывает насколько одновременно проста и важна сфера тестирования приложения.

#Java #Training #Spring #Testing
👍4
Аннотации JUnit 5

Структура JUnit 5

JUnit 5 (также известный как Jupiter) предоставляет богатый набор аннотаций для управления тестами. Каждая из аннотаций служит определенной цели — от настройки окружения до группировки и выполнения тестов.

Состоит из следующих модулей:

JUnit Platform: Основная платформа для запуска тестов.
JUnit Jupiter: Новый API для написания тестов.
JUnit Vintage: Обеспечивает совместимость с JUnit 4.



Аннотации для организации тестов

@Test

Используется для обозначения метода как тестового.
Этот метод должен быть public или default.


Пример:
@Test
void testAddition() {
Assertions.assertEquals(5, 2 + 3);
}


@DisplayName

Устанавливает читаемое имя для теста, которое будет отображаться в отчетах.

Пример:
@Test
@DisplayName("Тест сложения двух чисел")
void testAddition() {
Assertions.assertEquals(5, 2 + 3);
}


@Disabled

Отключает тест, чтобы он не выполнялся.
Можно указать причину отключения.


Пример:
@Test
@Disabled("Тест временно отключен из-за изменений в логике")
void testDisabled() {
Assertions.fail("Этот тест не должен выполняться");
}


Аннотации для управления жизненным циклом тестов


@BeforeEach

Выполняется перед каждым тестом.
Используется для подготовки окружения.


Пример:
@BeforeEach
void setup() {
System.out.println("Подготовка перед тестом");
}


@AfterEach

Выполняется после каждого теста.
Используется для очистки ресурсов.


Пример:
@AfterEach
void cleanup() {
System.out.println("Очистка после теста");
}


@BeforeAll

Выполняется один раз перед всеми тестами в классе.
Метод должен быть static.


Пример:
@BeforeAll
static void globalSetup() {
System.out.println("Настройка перед всеми тестами");
}


@AfterAll

Выполняется один раз после всех тестов в классе.
Метод должен быть static.


Пример:
@AfterAll
static void globalCleanup() {
System.out.println("Очистка после всех тестов");
}


#Java #Training #Spring #Testing #JUnit_5
👍1
Продвинутые аннотации JUnit 5

Управление параметрами и контекстами

@Nested

Позволяет группировать связанные тесты в отдельные внутренние классы.

Пример:

@Nested
class MathTests {
@Test
void testAddition() {
Assertions.assertEquals(5, 2 + 3);
}

@Test
void testSubtraction() {
Assertions.assertEquals(1, 3 - 2);
}
}


@ParameterizedTest

Используется для создания параметрических тестов.
Тест выполняется несколько раз с разными значениями.


Пример:
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void testWithParameters(int value) {
Assertions.assertTrue(value > 0);
}


@ValueSource

Определяет набор значений для параметрических тестов.

Пример:
@ParameterizedTest
@ValueSource(strings = {"Hello", "JUnit", "Test"})
void testStrings(String word) {
Assertions.assertFalse(word.isEmpty());
}


@CsvSource

Передает значения в виде CSV (Comma-Separated Values).

Пример:
@ParameterizedTest
@CsvSource({"1,2,3", "2,3,5", "3,5,8"})
void testCsvSource(int a, int b, int result) {
Assertions.assertEquals(result, a + b);
}


@EnumSource

Используется для автоматического предоставления значений из перечислений (enums) в тестовые методы.

Пример:
enum Day {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}

@ParameterizedTest
@EnumSource(Day.class) // Все значения перечисления Day
void testWithEnumSource(Day day) {
Assertions.assertNotNull(day, "Day should not be null");
}


@CsvFileSource

Загружает данные из CSV-файла.

Пример:
@ParameterizedTest
@CsvFileSource(resources = "/data.csv", numLinesToSkip = 1)
void testCsvFileSource(int a, int b, int result) {
Assertions.assertEquals(result, a + b);
}


Работа с условиями

@EnabledOnOs / @DisabledOnOs

Включает или отключает тест на основе операционной системы.

Пример:
@Test
@EnabledOnOs(OS.WINDOWS)
void testWindowsOnly() {
Assertions.assertTrue(System.getProperty("os.name").contains("Windows"));
}


@EnabledIf / @DisabledIf

Условное выполнение тестов.

Тестирование исключений и времени

@Timeout

Устанавливает максимальное время выполнения теста.

Пример:
@Test
@Timeout(5) // Тест завершится с ошибкой, если выполнится дольше 5 секунд
void testTimeout() {
Thread.sleep(3000);
}


@TestFactory

Используется для создания динамических тестов.

Пример:
@TestFactory
Collection<DynamicTest> dynamicTests() {
return Arrays.asList(
DynamicTest.dynamicTest("1st test", () -> Assertions.assertTrue(true)),
DynamicTest.dynamicTest("2nd test", () -> Assertions.assertEquals(4, 2 * 2))
);
}


#Java #Training #Spring #Testing #JUnit_5
👍1