D Language
Unittesting
Sök…
Syntax
- unittest {...} - ett block som bara körs i "unittesting" -läge
- hävda (<uttryck som utvärderar till ett booleskt>, <valfritt felmeddelande>)
Unittest block
Tester är ett utmärkt sätt att säkerställa stabila, bugfria applikationer. De fungerar som en interaktiv dokumentation och gör det möjligt att ändra kod utan rädsla för att bryta funktionaliteten. D tillhandahåller en bekväm och inbyggd syntax för unittest
block som en del av D-språket. Var som helst i en D-modul kan unittest
block användas för att testa källkodens funktionalitet.
/**
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);
}
Utför unittest
Om -unittest
flagga skickas till D-kompilatorn, kommer den att köra alla oätaste block. Ofta är det lämpligt att låta kompilatorn generera en stubbed main
Använda kompilera & kör omslaget rdmd
och testa ditt D-program blir lika enkelt som:
rdmd -main -unittest yourcode.d
Naturligtvis kan du också dela upp denna process i två steg om du vill:
dmd -main -unittest yourcode.d
./yourcode
För dub
projekt som kan sammanställa alla filer och exekvera sina otest block kan göras bekvämt med
dub test
Pro tip: definiera `tdmd` som skalalias för att spara tippning.
alias tdmd="rdmd -main -unittest"
och testa sedan dina filer med:
tdmd yourcode.d
Annoterad unestest
För mallkod är det ofta användbart att verifiera att för funktionsattribut (t.ex. @nogc
sluts korrekt) För att säkerställa att detta för ett specifikt test och därmed skriver hela unittest kan kommenteras
@safe @nogc pure nothrow unittest
{
import std.math;
assert(exp(0) == 1);
assert(log(1) == 0);
}
Observera att naturligtvis i D kan varje block antecknas med attribut och kompilatorerna verifierar naturligtvis att de är korrekta. Så till exempel skulle följande likna exemplet ovan:
unittest
{
import std.math;
@safe {
assert(exp(0) == 1);
assert(log(1) == 0);
}
}