23. april 2005 - 11:18Der er
12 kommentarer og 1 løsning
Test af windos service. NUnit og sikkerhed
Hej
Jeg har en windows service, som hoster en assembly der udbyder nogle funktioner til remote klienter. Alt er skrevet i C#
Jeg har skrevet nunit test til funktionerne der udbydes. Men jeg kunne godt tænke mig at teste systemets performance.
Her tænkte jeg at lave et test program der skabte X antal tråde som kaldte alle funktionerne i test suiten igen og igen, og så se hvornår systemet begyndte at thrashe.
Problemet er hvordan ser jeg om nunit testene er succesfulde uden at køre testen fra nunit GUI'en ?
Er der andre bedre måder at teste performance på ?
Et andet område som bekymre mig, da dette er mit første C#/.NET projekt, er sikkerhed. Hvordan sikre jeg mig at det kun er autoriserede brugere som kalder mine funktioner ?
Hvorfor vil du ikke afvikle testene via NUnit GUI'en? De skal jo køres på en eller anden måde. Alternativt er der jo en console-version som du kan køre i stedet.
Jeg har ikke et link men jeg kunne da hurtigt bixe et eksempel.
Remoting singleton lyder lidt svær at sikre, da det jo er samme objekt alle deler. Medmindre der er et eller andet i remoting, som jeg ikke kender (det vil jeg ikke udelukke), så tror jeg at du vil være nødt til at sende autorisations information (læs: brugernavn + password) med hvert kald for validering.
Hvis du kan finde ud af at kode med tråde, er der intet i vejen for at du gør dette inde i en NUnit test. Der er da ikke nogen speciel grund til at du gør dette "udefra".
I denne test (disse tests) kan du kalde et passende udvalg af de testcases, som du allerede har skrevet. Denne fremgangsmåde har den fordel at du kan sammensætte dine scenarier på en realistisk måde, frem for at blot teste helt tilfældigt (mange af dine tests går forhåbentlig på at teste fejl-håndtering - altså situationer som ikke (eller kun sjældent) ville dukke op i et kørende system.)
Før at du starter trådene, aflæser du tiden. Derefter starter du så trådene, og lader dem køre. Efter at den sidste tråd stopper aflæser du så tiden igen. Du trækker nu de to tider fra hinanden og dividere med det maksimale antal tråde (for at normalisere). Husk i øvrigt at du selv skal kunne skue på hvor mange tråde du maksimalt vil have i luften.
I øvrigt mener jeg ikke nødvendigvis at du bør genbruge de eksisterende tests, idet disse ikke nødvendigvis afspejler hvordan en normal remote-applikation ville bruge din dll. Hellere skrive nogle realistiske test-scanarier.
[TestFixture] public class MultiTestTest { [SetUp] protected void Init() { }
[TearDown] protected void Dispose() { }
private const int NCALL = 1000; private const int MAXTHREADS = 100; private const double MAXTIME = 0.0000005; [Test] public void Multi() { (new T(NCALL)).Run(); // warmup for(int nthreads = 1; nthreads <= MAXTHREADS; nthreads++) { long t1 = DateTime.Now.Ticks; T[] o = new T[nthreads]; Thread[] t = new Thread[nthreads]; for(int i = 0; i < nthreads; i++) { o[i] = new T(NCALL); t[i] = new Thread(new ThreadStart(o[i].Run)); } for(int i = 0; i < nthreads; i++) { t[i].Start(); } for(int i = 0; i < nthreads; i++) { t[i].Join(); Assert.AreEqual(NCALL, o[i].Good, "Thread " + i + "/" + nthreads); } long t2 = DateTime.Now.Ticks; Assert.IsTrue((t2 - t1) / 100000000.0 / nthreads / NCALL < MAXTIME, "Time with " + nthreads + " threads"); } } }
public class T { private int total; private int good; public T(int total) { this.total = total; good = 0; } public void Run() { Test tst = new Test(); for(int i = 0; i < total; i++) { if(tst.Dup("abc") == "abcabc") good ++; } } public int Good { get { return good; } } }
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.