D Language
Unittesting
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);
}
}