Testing

Проработать

  1. 10 интересных нововведений в JUnit 5
  2. Туториал по JUnit 5 - Введение
  3. Тестирование в Java. JUnit
  4. Тестирование кода Java с помощью фреймворка JUnit
  5. Нагрузочное тестирование Gatling
  6. Как я сократил код для нагрузочного тестирования в три раза

Основные библиотеки

Правила тестирования

Ваши тесты должны

  1. Достоверными.
  2. Не зависеть от окружения.
  3. Легко поддерживаться.
  4. Легко читаться и быть простыми для понимания.
  5. Соблюдать единую конвенцию именования.
  6. Запускаться регулярно в автоматическом режиме.
  7. Каждый тест должен проверять только одну вещь.

Хороший пример теста "AAA (arrange, act, assert)". Пример калькулятора.

class CalculatorTests
{
	public void Sum_2Plus5_7Returned()
	{
		// arrange
		var calc = new Calculator();

		// act
		var res = calc.Sum(2,5);

		// assert
		Assert.AreEqual(7, res);
	}
}
    

Принципы для написания тестируемого кода.

  1. Мыслите интерфейсами, а не классами, тогда вы всегда сможете легко подменять настоящие реализации подделками в тестовом коде.
  2. Избегайте прямого инстанцирования объектов внутри методов с логикой. Используйте фабрики или dependency injection. В этом случае использование IOC-контейнера в проекте может сильно упростить вам работу.
  3. Избегайте прямого вызова статических методов.
  4. Избегайте конструкторов, которые содержат логику: вам сложно будет это протестировать.

Измерения успешности внедрения юнит-тестов в вашем проекте следует использовать метрики

  1. Количество багов в новых релизах (в т.ч. и регрессии)
  2. Покрытие кода

Способы измерения покрытия

  1. Покрытие операторов — каждая ли строка исходного кода была выполнена и протестирована.
  2. Покрытие условий — каждая ли точка решения (вычисления истинно ли или ложно выражение) была выполнена и протестирована.
  3. Покрытие путей — все ли возможные пути через заданную часть кода были выполнены и протестированы.
  4. Покрытие функций — каждая ли функция программы была выполнена.
  5. Покрытие вход/выход — все ли вызовы функций и возвраты из них были выполнены.
  6. Покрытие значений параметров — все ли типовые и граничные значения параметров были проверены.