Поиск…


Синтаксис

  • 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);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow