D Language
модульное тестирование
Поиск…
Синтаксис
- unittest {...} - блок, который запускается только в режиме «unittesting»
- assert (<выражение, которое вычисляет логическое значение>, <необязательное сообщение об ошибке>)
Блоки Unittest
Тесты - отличный способ обеспечить стабильные, без ошибок приложения. Они служат интерактивной документацией и позволяют модифицировать код без страха, чтобы нарушить функциональность. D обеспечивает удобный и собственный синтаксис для блока unittest
как часть языка D. Где угодно в блоках unittest
D-модулей можно использовать для проверки функциональности исходного кода.
/**
Yields the sign of a number.
Params:
n = number which should be used to check the sign
Returns:
1 for positive n, -1 for negative and 0 for 0.
*/
T sgn(T)(T n)
{
if (n == 0)
return 0;
return (n > 0) ? 1 : -1;
}
// this block will only be executed with -unittest
// it will be removed from the executable otherwise
unittest
{
// go ahead and make assumptions about your function
assert(sgn(10) == 1);
assert(sgn(1) == 1);
assert(sgn(-1) == -1);
assert(sgn(-10) == -1);
}
Выполнение unittest
Если -unittest
флаг передается компилятору D, он будет запускать все блоки unittest. Часто полезно, чтобы компилятор сгенерировал main
функцию. Используя rdmd
compile & run wrapper rdmd
, тестирование вашей программы D происходит так же просто, как:
rdmd -main -unittest yourcode.d
Конечно, вы также можете разделить этот процесс на два этапа, если хотите:
dmd -main -unittest yourcode.d
./yourcode
Для проектов dub
компиляция всех файлов и выполнение их блоков unittest могут быть выполнены с помощью
dub test
Pro tip: определите `tdmd` как псевдоним оболочки, чтобы сохранить чаевые.
alias tdmd="rdmd -main -unittest"
а затем проверьте свои файлы с помощью:
tdmd yourcode.d
Аннотированный unittest
Для шаблонного кода часто бывает полезно проверить, что для атрибутов функции (например, @nogc
выведены правильно. Для обеспечения этого для конкретного теста и, таким образом, введите весь unittest можно аннотировать
@safe @nogc pure nothrow unittest
{
import std.math;
assert(exp(0) == 1);
assert(log(1) == 0);
}
Обратите внимание, что, конечно, в D каждый блок может быть аннотирован с атрибутами, а компиляторы, конечно, проверяет, что они верны. Так, например, следующее было бы похоже на приведенный выше пример:
unittest
{
import std.math;
@safe {
assert(exp(0) == 1);
assert(log(1) == 0);
}
}