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


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow