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.