Keri sisuni

Mis on ühiktestimine

Ühiktestimine on üks automaattestimise liike. Ühiktestid testivad meie koodi loogilist toimimist ehk äriloogikat. Ühiktestid on arendajate peamine tööriist valmiva tarkvara töökindluse ja kvaliteedi tagamisel. Visual Studio ja .NET Core pakuvad välja soliidse raamistiku ja esmaklassilised vahendid erinevate programmide testimiseks.

Töövahendid

Selles aines kasutame järgmisi töövahendeid:

  • Visual Studio / Visual Studio Code
  • Test Explorer (Visual Studio)
  • xUnit testimisraamistik
  • Moq testimisraamistik
  • Coverlet raportid

Lisaks paremale kvaliteedile ja vigade varajasele avastamisele annavad ühiktestid meile veel ühe väga tugeva eelise - testide kirjutamine annab tulemuseks oluliselt parema objekt-orienteeritud disaini. Meie klassid on paindlikumad, süsteemis on rohkem üldistusi ja korduvat koodi kasutamist. See tähendab omakorda seda, et me ei pea erinevaid süsteemi osi korduvalt ja korduvalt parandama, sest kood on kiskunud läbuks.

Ühiktestid on väiksed ja kiired

Ühiktestide arv on üldjuhul suur. Mõned sajad ühiktestid mõne pisema rakenduse korral ei ole midagi erakorralist. See tähendab, et ühiktestid peavad töötama kiiresti - tavaliselt mitte rohkem kui paarkümmend millisekundit testi kohta. Arendajad käivitavad ühikteste tavaliselt mitmeid kordi päevas ja pole mõeldav, et testide jooksutamine võtaks liiga kaua aega.

Kui ühiktestid on aeglased ja nende jooksutamine võtab kaua aega, siis arendajad jooksutavad ühikteste järjest vähem. Seejärel kirjutavad nad uusi teste vähem ja lõpuks saab testidest suur surnud koodibaas, mida usaldada ei saa. Surnud testid on ohtlikud kui need süsteemis alles on - uued arendajad, kes projektiga liituvad, võivad eeldada, et testid on korras ja teha seega valesid eeldusi ja otsuseid, sest tegelikult on testid kaugele maha jäänud valmivast koodist.

Ühiktesti näide

Vaatame lihtsat kalkulaatori klassi. Lihtsuse huvides teeme selle võimalikult primitiivse.

public class Calculator
{
    public int Add(int x, int y)
    {
        return x + y;
    }
}

Nüüd küsime, et mida selle klassi juures testida saaksime? Kogenud testija pakuks välja vähemalt järgmised vastused:

  • Liida kaks positiivset arvu
  • Liida kaks negatiivset arvu
  • Liida üks positiivne ja üks negatiivne arv
  • Liida kaks nulli
  • Liida null ja positiivne arv
  • Liida null ja negatiivn arv
  • Liida int.MaxValue ja positiivne arv
  • Liida int.MinValue ja positiivne arv

Seda on päris palju nii väikese meetodi kohta. Kirjutame testid kahe esimese punkti jaoks.

public class CalculatorTests
{
    public void Add_should_add_two_positive_numbers()
    {
        var calculator = new Calculator();
        var x = 10;
        var y = 22;
        var expectedResult = 32;

        var actualResult = calculator.Add(x, y);

        Assert.Equal(expectedResult, actualResult)
    }

    public void Add_should_add_two_negative_numbers()
    {
        var calculator = new Calculator();
        var x = -11;
        var y = -28;
        var expectedResult = -39;

        var actualResult = calculator.Add(x, y);

        Assert.Equal(expectedResult, actualResult)
    }
}

CalculatorTests tests;

tests = new CalculatorTests();
tests.Add_should_add_two_positive_numbers();

tests = new CalculatorTests();
tests.Add_should_add_two_negative_numbers();

Me ei peatu hetkel muude küsimuste juures nagu omaduste testimine, vigade käsitlemine jmt, sest testide jooksutamiseks kasutame me tavaliselt selleks mõeldud raamistikke, mis teevad meie eest ära päris palju musta tööd.

Millised on head ühiktestid?

Viited