Unit‐Test - angelShlesser/HomeWorksAIT GitHub Wiki

Определение Unit-Test Unit-тестирование – это процесс тестирования отдельных "единиц" кода (как правило, отдельных методов) для проверки их корректности. Это первый уровень тестирования, который должен выполняться разработчиком перед интеграционным и системным тестированием.

Библиотека JUnit В Java для unit-тестирования наиболее популярной является библиотека JUnit. Последняя на момент моего последнего обновления - это JUnit 5.

Написание эффективных unit-тестов в Java (или в любом другом языке программирования) требует следования определенным правилам и рекомендациям. Вот некоторые из основных правил

**1. Атомарность тестов (Один тест — один сценарий): Каждый тест должен проверять только одно конкретное условие или сценарий. Это облегчает идентификацию проблемы, если тест не проходит.

**2. Независимость тестов: Тесты не должны зависеть друг от друга. Они должны быть способными запускаться в любом порядке и в любом контексте.

**3. Читаемость: Тесты должны быть легко читаемыми и понимаемыми. Названия тестовых методов должны отражать суть проверки, например, shouldReturnTrueWhenPalindrome.

**4. Детерминированность: Каждый запуск теста должен давать одинаковый результат (либо успешно пройденный, либо нет), независимо от условий внешней среды.

**5. Быстрота выполнения: Unit-тесты должны быть быстрыми, чтобы их можно было запускать часто без больших затрат времени.

**6. Использование заглушек (mocks) и фиктивных объектов (stubs): Чтобы обеспечить независимость и быстроту выполнения тестов, часто используются заглушки и фиктивные объекты вместо реальных зависимостей, таких как базы данных или внешние сервисы.

**7. Покрытие кода: Хотя 100% покрытие кода тестами не гарантирует отсутствие ошибок, вы должны стремиться к максимальному покрытию кода тестами.

**8. Обработка исключений: Следует проверять и ожидаемое поведение (например, возвращает ли метод правильный результат), и неожидаемое поведение (например, выбрасывает ли метод исключение при некорректных входных данных).

**9. Создание чистой и изолированной среды для каждого теста: Используйте аннотации @BeforeEach и @AfterEach в JUnit для настройки и очистки ресурсов для каждого теста.

**10. Не игнорируйте проваленные тесты: Если тест не проходит, либо исправьте ошибку в коде, либо, если тест больше не актуален, обновите или удалите тест.

**11. Код тестов тоже требует поддержки: Как и основной код, тестовый код требует рефакторинга, обновления и поддержки.

**12. Постоянное выполнение: Используйте инструменты автоматической интеграции, такие как Jenkins или Travis CI, чтобы тесты запускались автоматически при каждом изменении кода.

Хорошие unit-тесты делают код более надежным и устойчивым к ошибкам. Следование этим правилам поможет максимально эффективно использовать преимущества unit-тестирования в вашем проекте на Java.

Пример создания Unit-теста с JUnit Предположим, у вас есть класс Calculator с методом add(), который складывает два числа:

	public class Calculator {
	    public int add(int a, int b) {
	        return a + b;
	    }
	}

Чтобы написать тест для этого метода, создайте новый класс, например, CalculatorTest:

		import org.junit.jupiter.api.Assertions;
		import org.junit.jupiter.api.Test;

		public class CalculatorTest {
		    @Test
		    public void testAdd() {
		        Calculator calculator = new Calculator();
		        int result = calculator.add(2, 3);
		        Assertions.assertEquals(5, result);
		    }
		}

В приведенном примере: - @Test аннотирует метод как тестовый метод. - Мы создаем экземпляр класса Calculator и вызываем его метод add(). - Assertions.assertEquals() используется для проверки ожидаемого и фактического значения. В JUnit, как и в большинстве тестовых фреймворков, не существует строгих правил называния тестов. Однако есть некоторые общепринятые практики и рекомендации, которые помогают сделать тесты более понятными и читаемыми:

  1. Используйте слово "test": В классическом JUnit (до JUnit 5) методы тестов должны начинаться со слова "test". В JUnit 5 это больше не требуется, так как аннотация @Test определяет тестовые методы, но использование слова "test" может помочь визуально идентифицировать тесты.

  2. Описательные имена: Имя теста должно быть достаточно описательным, чтобы можно было понять, что именно проверяется. Например, testUserNameNotNull().

  3. Используйте CamelCase: Подобно стандартным правилам именования методов в Java, имена методов в JUnit также следует записывать в CamelCase.

  4. Структура имени теста: Один из популярных подходов к именованию тестов — это methodName_StateUnderTest_ExpectedBehavior. Например, divide_ZeroDenominator_ThrowsException.

  5. Не бойтесь длинных имен: Длинные и описательные имена лучше коротких и неясных. Цель — сделать каждый тест самодостаточным и понятным.

  6. Избегайте использования союзов: Постарайтесь избегать союзов и других слов, которые могут делать имя теста сложным для понимания или интерпретации.

  7. Используйте аннотации для дополнительной информации: В JUnit 5 вы можете использовать @DisplayName для предоставления более понятного и человекочитаемого описания теста, которое будет отображаться в отчетах и инструментах.