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, как и в большинстве тестовых фреймворков, не существует строгих правил называния тестов. Однако есть некоторые общепринятые практики и рекомендации, которые помогают сделать тесты более понятными и читаемыми:
-
Используйте слово "test": В классическом JUnit (до JUnit 5) методы тестов должны начинаться со слова "test". В JUnit 5 это больше не требуется, так как аннотация
@Testопределяет тестовые методы, но использование слова "test" может помочь визуально идентифицировать тесты. -
Описательные имена: Имя теста должно быть достаточно описательным, чтобы можно было понять, что именно проверяется. Например,
testUserNameNotNull(). -
Используйте CamelCase: Подобно стандартным правилам именования методов в Java, имена методов в JUnit также следует записывать в CamelCase.
-
Структура имени теста: Один из популярных подходов к именованию тестов — это
methodName_StateUnderTest_ExpectedBehavior. Например,divide_ZeroDenominator_ThrowsException. -
Не бойтесь длинных имен: Длинные и описательные имена лучше коротких и неясных. Цель — сделать каждый тест самодостаточным и понятным.
-
Избегайте использования союзов: Постарайтесь избегать союзов и других слов, которые могут делать имя теста сложным для понимания или интерпретации.
-
Используйте аннотации для дополнительной информации: В JUnit 5 вы можете использовать
@DisplayNameдля предоставления более понятного и человекочитаемого описания теста, которое будет отображаться в отчетах и инструментах.