2010-10-01

Test af array

Inspireret af dette indlæg på StackOverflow: http://bit.ly/atgBod har jeg forsøgt at lave 2 forskellige test metoder, for at vise forskellen mellem unit og integrationstest.

Jeg mener at forfatterens eksempel er en test der i realiteten ikke er nødvendig, hvis man istedet for at teste på værdierne i et array, istedet testede det der genererede array'et

Her er først et eksempel på integrationstesten:

[TestMethod]
public void ArrayTest()
{
    IBlackBox sut = new BlackBox();
    Assert.AreEqual(0, sut.items[0] % 2);
    for (int i = 1; i < sut.items.Length; i++)
    {
       Assert.AreEqual(sut.items[i - 1] + 2, sut.items[i]);
       Assert.AreEqual(0, sut.items[i] % 2);
    }
}

Den kunne sagtens deles op i nogle seperate tests, men som man kan se, så antager testen det array der testes på allerede eksisterer og at værdierne er fyldt i uden egentlig at teste hvordan arrayet er genereret.

Hvis man ser hvordan arrayet bliver genereret kan man pludselig se en del flere hjørner der bør testes, fx negative værdier og ulige tal.

public class WhiteBox : IWhiteBox
{
    public int GenerateNextItem(int previousItem)
    {
        if (previousItem < 0) return 0;
        if (previousItem % 2 != 0) previousItem--;
        int nextItem = previousItem += 2;
        return nextItem;
    }
}
 
public class BlackBox : IBlackBox
{
    public int[] items
    {
        get
        {
            IWhiteBox whiteBox = new WhiteBox();
            int value = 0;
            IList<int> result = new List<int>();
            for (int i = 0; i < 4; i++)
            {
                value = whiteBox.GenerateNextItem(value);
                result.Add(value);
            }
            return result.ToArray();
        }
    }
}

De tilhørende tests til denne implementering kunne så være

[TestMethod]
public void GivenUnevenPreviousValueReturnsNextEvenValue()
{
    IWhiteBox sut = new WhiteBox();
    int actual = sut.GenerateNextItem(1);
    int expected = 2;
    Assert.AreEqual(expected, actual);
}

[TestMethod]
public void GivenEvenPreviousValueReturnsNextEvenValue()
{
    IWhiteBox sut = new WhiteBox();
    int actual = sut.GenerateNextItem(2);
    int expected = 4;
    Assert.AreEqual(expected, actual);
}

[TestMethod]
public void GivenNegativePreviousValueReturnsZero()
{
    IWhiteBox sut = new WhiteBox();
    int actual = sut.GenerateNextItem(-1);
    int expected = 0;
    Assert.AreEqual(expected, actual);
}

Nu er der selvfølgelig en del flere tests, til "bare" at teste en så simpel funktion, tilgengæld så er der ingen tvivl om hvordan arrayet bliver genereret og at "ulovlige" værdier er håndteret, hvis nogen skulle finde på at ændre i implementeringen af array genereringen. Den første test ville fx ikke finde fejl ved negative numre i arrayet.

Ingen kommentarer:

Send en kommentar