Menu

Юнит-тестирование

Тесты - это отличный способ создания стабильных, свободных от багов приложений. Они служат интерактивной документацией и позволяют модифицировать код без риска повреждения функционала. 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);
}

Подробнее

rdmd playground.d