Suche…


Syntax

  • unittest {...} - ein Block, der nur im Modus "unittesting" ausgeführt wird
  • assert (<Ausdruck, der einen Booleschen Wert ergibt>, <optionale Fehlermeldung>)

Unittest Blöcke

Tests sind eine hervorragende Möglichkeit, um stabile, fehlerfreie Anwendungen sicherzustellen. Sie dienen als interaktive Dokumentation und ermöglichen die Änderung des Codes, ohne die Funktionalität zu beeinträchtigen. D bietet eine praktische und native Syntax für den unittest Block als Teil der D-Sprache. Überall in einem D-Modul können unittest Blöcke verwendet werden, um die Funktionalität des Quellcodes zu testen.

/**
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 ausführen

Wenn -unittest Flag -unittest an den D-Compiler übergeben wird, werden alle unittest-Blöcke ausgeführt. Häufig ist es sinnvoll, den Compiler eine übergebene main generieren zu lassen. Mit dem Compile & Run-Wrapper rdmd wird das Testen Ihres D-Programms so einfach wie:

rdmd -main -unittest yourcode.d

Natürlich können Sie diesen Vorgang auch in zwei Schritte aufteilen, wenn Sie möchten:

dmd -main -unittest yourcode.d
./yourcode

Bei dub Projekten können alle Dateien kompiliert und deren einzige Blöcke ausgeführt werden

dub test

Pro-Tipp: Definieren Sie 'tdmd' als Shell-Alias, um Trinkgeld zu sparen.
alias tdmd="rdmd -main -unittest"

und testen Sie dann Ihre Dateien mit:

tdmd yourcode.d

Kommentiert ohne Test

Für @nogc Code ist es oft nützlich, zu überprüfen, ob für Funktionsattribute (z. B. @nogc korrekt abgeleitet werden). Um dies für einen bestimmten Test und damit den Typ sicherzustellen, kann der gesamte Test kommentiert werden

@safe @nogc pure nothrow unittest
{
    import std.math;
    assert(exp(0)  ==  1);
    assert(log(1)  ==  0);
}

Beachten Sie, dass natürlich in D jeder Block mit Attributen versehen werden kann und die Compiler natürlich überprüfen, ob sie korrekt sind. So wäre zum Beispiel das folgende Beispiel ähnlich:

unittest
{
    import std.math;
    @safe {
        assert(exp(0)  ==  1);
        assert(log(1)  ==  0);
    }
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow