D Language
Testów jednostkowych
Szukaj…
Składnia
- unittest {...} - blok, który działa tylko w trybie „unittesting”
- assert (<wyrażenie, które zwraca wartość logiczną>, <opcjonalny komunikat o błędzie>)
Unittest bloki
Testy to doskonały sposób na zapewnienie stabilnych aplikacji bez błędów. Służą one jako interaktywna dokumentacja i pozwalają modyfikować kod bez obawy o uszkodzenie funkcjonalności. D zapewnia wygodną i natywną składnię dla unittest
bloku w ramach języka D. W dowolnym miejscu w module D do sprawdzania funkcjonalności kodu źródłowego można użyć unittest
bloków.
/**
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);
}
Wykonywanie w sposób nieuczciwy
Jeśli -unittest
flaga zostanie przekazana do kompilatora D, uruchomi wszystkie bloki Unittest. Często przydatne jest pozwolenie kompilatorowi wygenerować main
funkcję. Korzystając z rdmd
i uruchom opakowanie rdmd
, testowanie programu D jest tak proste, jak:
rdmd -main -unittest yourcode.d
Oczywiście możesz również podzielić ten proces na dwa etapy, jeśli chcesz:
dmd -main -unittest yourcode.d
./yourcode
W przypadku projektów dub
kompilacja wszystkich plików i wykonywanie ich najmniejszych bloków może być wygodnie wykonane
dub test
Pro tip: zdefiniuj `tdmd` jako alias powłoki, aby zapisać tipping.
alias tdmd="rdmd -main -unittest"
a następnie przetestuj swoje pliki za pomocą:
tdmd yourcode.d
Z adnotacją nieprzyzwoite
W przypadku kodu szablonowego często przydatne jest sprawdzenie, czy dla atrybutów funkcji (np. @nogc
są wywnioskowane poprawnie. Aby to zapewnić w przypadku konkretnego testu, a tym samym wpisać, cały opis jednostkowy może być opatrzony adnotacjami
@safe @nogc pure nothrow unittest
{
import std.math;
assert(exp(0) == 1);
assert(log(1) == 0);
}
Zauważ, że oczywiście w D każdy blok może być opatrzony adnotacjami z atrybutami, a kompilatory oczywiście sprawdzają, czy są poprawne. Na przykład następujące byłoby podobne do powyższego przykładu:
unittest
{
import std.math;
@safe {
assert(exp(0) == 1);
assert(log(1) == 0);
}
}