WCF ja Unit Testid
08.07.2007 | GunnarHea kombe kohaselt tuleb peale uue asja käima saamist ajada talle ka testid külge. Muidu on Marek suitsupausi ajal tusane ja morn. Hoidmaks rõõmsat ja tegusat õhkkonda DT IT-pühamu seinte vahel, olgu siis üle pika aja jälle üks kanne testimisest.
Peale WCF-i installimist ja tööle saamist panin püsti ka kõik vajaliku unit testide tegemiseks. Installisin siis ära NUniti ja TestDriven.Net-i ning lisasin eelmises WCF-i kandes toodud projektile juurde testide projekti. Testide jaoks tegin tavalise DLL-teegi projekti, et seda saaks kasutada ka Visual Studio nende versioonidega, kus sisseehitatud testid puuduvad.
Et NUnitit testimise projektiga kasutada, tuleb projektile külge võtta nunit.framework.dll, mis asub Program Files-i all NUniti bin kataloogis. Sellega on kõik ettevalmistused tehtud ja võime asuda testide juurde.
Uued meetodid teenusele
Et oleks rohkem, mida testida, siis lisasin teenusele paar uut meetodi juurde. Ei midagi keerukat, ainult lahutamine, korrutamine ja jagamine, et oleks kaetud kõik neli põhitehet. Seega peame muutma service contract-i ja teenuse klassi. Muudatused on järgmised.
public interface IMathService
{
[OperationContract]
double Add(double x, double y);
[OperationContract]
double Subtract(double x, double y);
[OperationContract]
double Divide(double x, double y);
[OperationContract]
double Multiply(double x, double y);
}
public class MathService : IMathService
{
public double Add(double x, double y)
{
return x + y;
}
public double Subtract(double x, double y)
{
return x - y;
}
public double Multiply(double x, double y)
{
return x * y;
}
public double Divide(double x, double y)
{
return x / y;
}
}
Unit Testid
Testimise jaoks tegin klassi MathServiceTest. Projektile tuleb lisada ka Service Reference ning anda sellele ette MathService-i teenuse URL. Kui teenus on küljes, võime asuda testide klassi kallale.
Et me teenusega igal sammul ei peaks ühendust looma ja seda jälle sulgema, siis loome ühenduse teenusega testimise algul ning katkestame ühenduse siis, kui testid on tehtud.
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;
using NUnit.Framework;
using WCFTestTests.gamma;
namespace WCFTestTests
{
[TestFixture]
public class MathServiceTest
{
private MathServiceClient client;
[TestFixtureSetUp]
public void Initialize()
{
this.client = new MathServiceClient();
this.client.Open();
}
[TestFixtureTearDown]
public void TearDown()
{
if (this.client.State != CommunicationState.Closed)
this.client.Close();
}
}
}
Järgmiseks lisame testimise meetodid teenuse kõikide meetodite jaoks.
using System.Collections.Generic;
using System.ServiceModel;
using System.Text;
using NUnit.Framework;
using WCFTestTests.gamma;
namespace WCFTestTests
{
[TestFixture]
public class MathServiceTest
{
private MathServiceClient client;
[TestFixtureSetUp]
public void Initialize()
{
this.client = new MathServiceClient();
this.client.Open();
}
[TestFixtureTearDown]
public void TearDown()
{
if (this.client.State != CommunicationState.Closed)
this.client.Close();
}
[Test]
public void AddTest()
{
Assert.AreEqual(5, client.Add(2, 3));
}
[Test]
public void SubtractTest()
{
Assert.AreEqual(3, client.Subtract(8, 5));
}
[Test]
public void MultiplyTest()
{
Assert.AreEqual(12, client.Multiply(2, 6));
}
[Test]
public void DivideTest()
{
Assert.AreEqual(4, client.Divide(12, 3));
}
}
}
Käivitame NUniti GUI ja laseme testi tööle.
Testide projekti peal vajuta paremat hiire nuppu, vali menüüst Test With ja seejärel alammenüüst NUnit. Siis avaneb NUniti GUI.
NUnit GUI näitab kõiki teste sisaldavaid klasse ja klassides olevaid teste. Vajadusel saab käivitada testid ainult konkreetse klassi piires.
Paistab, et mul vedas - kõik testid õnnestusid!
Kui midagi viltu ei läinud, siis näeme, et kõik testid on rohelised ning seega võime öelda, et teenuse kood töötab korrektselt. Minul läks igal juhul hästi seekord, loodan, et teilgi veab sama hästi või veel paremini.
Coverage Test
Coverage Testi ma siinkohal algul puudutada ei tahtnud. Kui selle aga käima lasin, siis avastasin midagi, mille võiks siingi nii silmaringi laiendamise korras ära märkida.
Käivitame nüüd Coverage Testi. Asub samas menüüs, kus NUniti GUI. TestDriven.Net-iga tuleb kaasa NCover, mis pakubki meile Coverage Testide tegemise võimalust. Coverage Testi teeb TestDriven.Net ära automaatselt. Tuleb vaid menüüst valida ning aken, mis avaneb, näitab meile tulemusi.
Coverage Test ei õnnestunud - leidub koodi, mis ei käivitu meie projektis mitte kunagi, kui me just koodi ei muuda.
Nagu näeme, ei lähe Coverage Test läbi. Leidub meetode, mida ei kasutata kunagi. Need meetodid on genereerinud service-i proxy generaator ja tegemist on proxy konstruktori nelja overload-iga.
Vajadusel saame need konstruktorid eemaldada teenuse proxy-st, kuid kui laseme teenust värskendada, siis genereeritakse need konstruktorid automaatselt uuesti. Kui keegi teab, kuidas seda välistada, siis oleks kommentaar siia juurde igati teretulnud.
Kokkuvõtteks
Kokkuvõtvalt võin öelda, et WCF teenuste testimine pole keerukas, kuni teenused on lihtsad. Arenduskeskkonna koos kõikide vajalike vahenditega saab püsti kiiresti ning tööga võib algust teha praktiliselt kohe. Peale Unit Testide saame testDriven.Net abil arenduskeskkonnale koheselt külge ka Coverage Testid.
Et mul hetkel on käsil üks keerukam SOAP-i projekt, siis mõtlen vaikselt juba sellele, et kui SOAP-kihi arhitektuur on paigas, siis kuidas seda kõige efektiivsem testida oleks. Igal juhul tekitab see oma paari pikema kande jagu materjali kindlasti.

19.07.2007 kell 21:52
Microsoft ähvardab TestDriven.NET’i autorit Jamie Cansdale’i kohtuga. Põhjuseks see, et plugin töötab ka Visual Studio Express-versioonis, kuhu MS ei tahaks laiendeid lubada. Nii väidabki MS, et Cansdale rikub Express’i litsentsitingimusi ja nõuab, et TestDriven.NET’ist tuleb Express-tugi kõrvaldada, muidu on kohtusse minek. Cansdale väidab, et kasutab ainuüksi vabalt saadavaid API-sid ja MS peaks täpsustama, milliseid tingimusi on ta rikkunud.
Jamie Cansdale: Microsoft vs TestDriven.NET
InfoQ: The Story of TestDriven.NET and Visual Studio Express