Avatar billede codecow Nybegynder
23. april 2005 - 11:18 Der 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 ?
Avatar billede nielle Nybegynder
23. april 2005 - 11:24 #1
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.
Avatar billede arne_v Ekspert
23. april 2005 - 11:27 #2
Man kan godt med lidt snille lave NUnit test cases som er multithreaded. SÅ du
kan sagtens bruge NUnit.

Med hensyn til sikkerhed så skal der jo lave snoget men hvad afhænger
lidt af hvordan klienterne og din windows service snakker sammen.
Avatar billede codecow Nybegynder
23. april 2005 - 11:36 #3
@nielle> Fordi jeg vil bruge de test som jeg har skrevet i nunit til at teste performance ved at kalde funktionerne i mange tråde.

@arne_v> Hvis nunit har en sådan funktion vil jeg da helst bruge den :) Har du et link til et eksempel ?

Der er tale om remoting over tcp. Serveren udbyder på denne her måde:

          TcpChannel channel = new TcpChannel(8080);
            ChannelServices.RegisterChannel( channel );

            RemotingConfiguration.RegisterWellKnownServiceType(
                typeof( TheObject ),
                "MyService",
                WellKnownObjectMode.Singleton );

Jeg kunne godt tænke mig at kun godkendte brugere kan bruge servicen, f.eks. ud fra om de er i en bestemt gruppe i active directory ol.
Avatar billede arne_v Ekspert
23. april 2005 - 11:53 #4
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.
Avatar billede nielle Nybegynder
23. april 2005 - 11:56 #5
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.
Avatar billede codecow Nybegynder
23. april 2005 - 12:14 #6
OK klart. Jeg laver en multi trådet test i nunit og tester på den. Det er mere elegant end en ekstern test.

Øv. Jeg havde håbet at .NET havde et eller andet smart til sikkerhed.

Hvem vil have point ?
Avatar billede nielle Nybegynder
23. april 2005 - 12:58 #7
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.
Avatar billede nielle Nybegynder
23. april 2005 - 13:00 #8
Avatar billede arne_v Ekspert
23. april 2005 - 13:02 #9
Nu kan man ikke rigtigt genbruge normale test cases i tråde da Assert ikke virker
som det skal.
Avatar billede arne_v Ekspert
23. april 2005 - 13:02 #10
Eksempel:

using System;
using System.Threading;

using NUnit.Framework;

[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;
        }
    }
}
Avatar billede arne_v Ekspert
23. april 2005 - 13:02 #11
og svar
Avatar billede codecow Nybegynder
23. april 2005 - 16:31 #12
øhh... hov. ville have givet point til jer begge

Anyway tak for hjælpen begge to :)
Avatar billede nielle Nybegynder
23. april 2005 - 16:39 #13
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester