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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow