Testing
Børre Stenseth
Moduler>Kodetesting>C#Testing

Testing

Hva
testing av C# i Visual Studio

Visual Studio, versjon 9, implementerer et testverktøy i "unit-tradisjonen". Noen tidligere generasjoner av VS hadde ikke dette verktøyet innebygd. Modulen NUnit demonstrer et alternativt verktøy. Det synes ikke å være gode grunner for å bruke dette, når vi får testverktøyet i Visual Studio.

Bruken av testing er en mangesidig sak, og hensikten med denne modulen er bar å gi en kort innføring i hvordan komme igang.

Eksempel 1

Vi vil lage en applikasjon som konverterer et naturlig tall til en serie med tallord.

Vi lager en desktop-applikasjon som skal se slik ut:

app

I Form1.cs skriver vi slik:

namespace Testapp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private String NumberConvert(String S)
        {
            return "nothing";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            labelResult.Text =
                NumberConvert(textBoxTall.Text);
        }
    }
}
	

Vi høyreklikker på Form1, og velger: "Create Unit Test...". Da får vi opp følgende dialog:

settest

Vi velger vår converteringsfunksjon, og kvitterer med OK. Visaul Studio lage nå et eget prosjekt som default får navnet: TestProject1. I fila Form1Test.cs finner vi blandt annet følgende:

	...

[TestMethod()]
[DeploymentItem("Testapp.exe")]
public void NumberConvertTestConvert()
{
    Form1_Accessor target = new Form1_Accessor(); // TODO: Initialize to an appropriate value
    string S = string.Empty; // TODO: Initialize to an appropriate value
    string expected = string.Empty; // TODO: Initialize to an appropriate value
    string actual;
    actual = target.NumberConvert(S);
    Assert.AreEqual(expected, actual);
    Assert.Inconclusive("Verify the correctness of this test method.");
}
	...
	

Da er vi igang. Vi kan nå kjøre Test - Run - All tests In Solution. Vi får selvsagt feil.

Det neste vi gjør er å skrive om NumberConvertTestConvert(). (Husk vi lager testen før koden). F.eks. slik:

...
[TestMethod()]
[DeploymentItem("Testapp.exe")]
public void NumberConvertTestConvert()
{
    Form1_Accessor target = new Form1_Accessor();
    
    Assert.AreEqual("en to tre",
        target.NumberConvert("123"),"123");
    Assert.AreEqual("ikke et natulig tall", 
        target.NumberConvert("-123"),"-123");
    Assert.AreEqual("ikke et natulig tall", 
        target.NumberConvert("1.23"),"1.23");
    Assert.AreEqual("ikke et natulig tall", 
        target.NumberConvert("jensen"),"jensen");
}
...
	

Merk at vi har hengt på en string som siste parameter i AreEqual. Dette kan hjelpe oss å identifisere vilket kall som går galt, siden vi gjør mange tester i en funksjon. Vi har dessuten fjernet linja som ligger der som et sikkerhetsnett for at vi skal huske å sjekke at vi faktisk har laget en test som vi er fornøyd med:

Assert.Inconclusive("Verify the correctness of this test method.");

Hvis vi kjører testen nå går det selvsagt ikke noe bedre enn forrige gang. Vi endrer fokus mot funkjsonen vår, NumberConvert. Og lager noe slikt:

private String NumberConvert(String S)
{
    S = S.Trim();
    String[] numberwords = new String[] 
    { "null", "en", "to", "tre", "fire", "fem", "seks", "sju", "åtte", "ni" };
    String result=String.Empty;
    for (int ix = 0; ix < S.Length; ix++)
    {
        int pos="0123456789".LastIndexOf(S[ix]);
        if (pos != -1)
            result += numberwords[pos] + " ";
        else 
            return "ikke et natulig tall";
    }
    return result.Trim();           
}

Testen går bra.

Referanser
SVN checkout for Eksempel1 : https://www.it-stud.hiof.no/svn/dotnet/Csharpspikes/Testapp
Vedlikehold

B.Stenseth, jan 2008

(Velkommen) Moduler>Kodetesting>C#Testing (NUnit)