mandag 13. april 2009 Diverse prosjekter Testing / TDD
Dette er en oppfølgingspost til artikkelen hvor jeg beskrev hvordan jeg lager små SOA komponenter. Nå viser jeg hvordan jeg tar kompionenten i bruk, og måler hvor bra den virker.
Jeg oppretter et nytt Console application prosjekt, og legger til en Service Reference hvor jeg bruker adressen definert i BrainSpill tjenesten: http://localhost:8000/BrainSpill/service/mex. Dette genererer en MessageRepositoryClient klasse med metodene jeg tidligere definerte i IMessageRepository i BrainSpill-prosjektet. Vil jeg nå for eksempel sende en ny melding til BrainSpill kan jeg gjøre det slik som dette:
using (var client = new MessageRepositoryClient())
{
client.AddMessage(new AddMessageRequest
{
Text = "Dette er en melding!",
By = "T-Man",
});
}
For å se hvor bra tjenesten håndterer mange requester forsøker jeg å opprette 100 meldinger om gangen i en loop, og måler hvor lang tid det tar:
static void Main(string[] args)
{
using (var client = new MessageRepositoryClient())
{
System.Console.WriteLine("{0} messages in database", client.GetTotalNumberOfMessages());
var stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 100; i++)
{
client.AddMessage(new AddMessageRequest
{
Text = "Testmelding nummer " + i,
By = "T-Man",
});
}
stopwatch.Stop();
System.Console.WriteLine("Elapsed time: {0}", stopwatch.ElapsedMilliseconds);
}
}
Resultatet:
Ikke så verst - i overkant av et halvt sekund for å sende og motta 100 requests og lagre dem i basen. For å se om performancen blir dårligere om det finnes mange meldinger i basen fra før kjører jeg testen en del ganger til. Men det ser ikke ut til å ha noen spesiell betydning:
Jeg bør også teste hvordan tjenesten oppfører seg med mange, samtidige brukere, og fyrer derfor opp seks command-winduer som hver kjører testprogrammet 10 ganger etterhverandre. Det vil altså si at jeg har seks ulike klienter som forsøker å hamre inn meldinger på en gang, samtidig som de hele tiden spør tjenesten hvor mange meldinger som finnes.
Resultatet varierte en god del. På det minste tok det nå 1,6 sekunder å sende 100 meldinger, på det meste helt opp i 16 - de fleste brukte et sted mellom 4 og 10 sekunder.
Jeg må også teste metoden for å hente ut ferske meldinger: GetLatestMessages. Jeg skriver om programmet mitt til å hente ut de 10 siste melding.
static void Main(string[] args)
{
using (var client = new MessageRepositoryClient())
{
System.Console.WriteLine("{0} messages in database", client.GetTotalNumberOfMessages());
var stopwatch = new Stopwatch();
stopwatch.Start();
var latestMessages = client.GetLatestMessages(10);
stopwatch.Stop();
System.Console.WriteLine("Elapsed time: {0}", stopwatch.ElapsedMilliseconds);
}
}
Første gang jeg kjører testen tar det hele 3,3 sekunder, men når jeg forsøker flere ganger tar det bare litt over 0,6 sekunder. Jeg antar at det er db4o-databasen som cacher noe. Venter jeg en stund og så forsøker igjen, tar det igjen i overkant av 3 sekunder første gang, deretter 0,6.
Jeg er interrestert i å se om cachingen blir påvirket av at det kommer inn nye meldinger. Dvs. om det alltid vil ta lang tid første gangen etter at en ny melding har blitt lagret. Jeg skriver derfor et program som henter de siste meldingene noen ganger, legger inn noen meldinger, og så henter nye meldinger igjen:
static void Main(string[] args)
{
using (var client = new MessageRepositoryClient())
{
System.Console.WriteLine("{0} messages in database", client.GetTotalNumberOfMessages());
var stopwatch = new Stopwatch();
Get10Messages(client, stopwatch);
Get10Messages(client, stopwatch);
Get10Messages(client, stopwatch);
Add100Messages(client);
Get10Messages(client, stopwatch);
Get10Messages(client, stopwatch);
Get10Messages(client, stopwatch);
}
}
private static void Get10Messages(MessageRepositoryClient client, Stopwatch stopwatch)
{
stopwatch.Reset();
stopwatch.Start();
var latestMessages = client.GetLatestMessages(10);
stopwatch.Stop();
System.Console.WriteLine("Getting 10 messages took {0} milliseconds", stopwatch.ElapsedMilliseconds);
}
private static void Add100Messages(MessageRepositoryClient client)
{
System.Console.WriteLine("Adding 100 messages..");
for (int i = 0; i < 100; i++)
{
client.AddMessage(new AddMessageRequest
{
Text = "Hi there........",
By = "BrainSpill.Console",
});
}
}
Resultatet bekrefter at cachingen ikke blir påvirket av at det kommer inn nye meldinger:
Knagger: BrainSpill, db4o, SOA