Тесты - это отличный способ создания стабильных, свободных от
багов приложений. Они служат интерактивной документацией и
позволяют модифицировать код без риска повреждения функционала.
D предоставляет удобный встроенный синтаксис для блоков
unittest
, которые встроены непосредственно в язык.
Блоки unittest
можно использовать в любом месте модуля для
проверки функционала кода.
// Блок для моей функции
unittest
{
assert(myAbs(-1) == 1);
assert(myAbs(1) == 1);
}
Это позволяет при необходимости вести разработку через тестирование.
unittest
Блоки unittest
могут содержать произвольный код, который
будет скомпилирован и будет исполняться при каждом запуске
программы, если при компиляции указан флаг компилятора
-unittest
. DUB также поддерживает компиляцию и исполнение
юнит-тестов посредством команды dub test
.
assert
В типичном случае, unittest
'ы содержат выражения assert
,
тестирующие работоспособность той или иной функции.
Блоки unittest
обычно располагают рядом с определением
функции - как на верхнем уровне исходного кода, так и
в теле определений классов и структур.
Юнит-тесты - мощное оружие, позволяющее создавать пуленепробиваемые приложения.
Общепринятой метрикой проверки, насколько программа проверяется
тестами, является покрытие кода. Это отношение количества исполненных
строк кода к количеству фактических строк кода.
Компилятор DMD позволяет легко генерировать отчёты о покрытии
посредством ключа компилятора -cov
, при использовании которого будут сгенерированы
файлы .lst
, содержащие детальную статистику по каждому модулю.
Поскольку компилятор способен автоматически вычислять атрибуты для шаблонного кода, указание атрибутов для блоков тестов является общепринятой практикой. Это позволяет убедиться, что тестируемый код действительно содержит указанные атрибуты.
unittest @safe @nogc nothrow pure
{
assert(myAbs() == 1);
}