Testing
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:
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:
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.