Permalänk
Medlem

C# Forms - Att utföra tester

Inledning
Jag har obefintlig erfarenhet av professionell eller ens seriös testning. Den enda testningen som utförs är att gå igenom buggrättingen/utvecklingen och kolla så att allt lirar och att man inte har haft sönder annat i närheten. Problemen som finns är att hyfsat enkla grejer som att öppna vissa formulär eller göra andra enklare saker inte fungerar. Efter många år är det tråkigt när enkla saker sluta fungera när man har buggrättat något på "andra sidan programmet". Det är alltså inget krav på något superavancerat utan mer att man kan göra flera generella och enklare tester som gör att man inte behöver göra dessa manuellt genom att klicka runt i programmet.

Jag blir sugen att börja skriva tester som man kan dra igång. Vissa automatiskt, vissa manuellt, vissa i sekvens. Det behöver inte vara något som automatiskt görs vid varje merge eller push utan det kan vara något som man drar igång innan en ny version görs.

Förutsättningar
Projektet som jag sitter med just nu är skrivet i C# .Net Forms från Forms begynnelse till idag. Det har lagts massor av arbete på det av flera olika utvecklare utspritt på många år. Det är blandad kod med formulär, kontroller, rapporter, databaslager, or-mappning, codebehind, hjälpklasser. I mer klartext så kan det vara klickevent som registreras i ett formulär, klickeventet hanteras i guit som utför 20 rader kod som i sin tur kallar på databasen och hjälpklasser för att bygga upp en rapport som i sin tur presenterar detta i ett formulär. Ta detta blandat med att det är flera olika utvecklare över en lång tid så mycket görs på olika sätt speciellt eftersom rutiner för hur man skriver kod förändras. En utvecklare kanske använder en hjälpklass direkt istället för att göra implementationen i codebehind/klicket. En annan gör det bara i codebehind/klicket. För att testa hjälpklassen så går det snabbt men inte om man måste kombinera det med ett aktuellt GUI.

Förutom den gemensamma koden som alla kör så finns det massor av användar- och kundspecifika inställningar som kan vara helt olika. Detta ökar komplexiteten i den nuvarande manuella testningen då man helt enkelt inte har tid att testa alla kombinationer. Då det är tänkt att detta på sikt ska ha ganska omfattande tester så är det helt ok med någon lösning där man tvingas sätta upp databasen innan för specifika tester. Att det kan ta tid att sätta upp testmiljön är helt ok, det är däremot mindre ok att skriva om befintlig kod.

Befintliga lösningar
Vad jag har läst mig till hittills för testning är att man ska bryta loss GUI från logik. Det är där skon klämmer. Det finns helt enkelt inte tid att göra detta på ett korrekt sätt (ex MVC, MVVM eller liknande) så som man gör i exempelvis för webben som MVC eller WebAPI. Dessutom blir det lite problematiskt då GUI-kontrollerna också ska testas på sitt sätt. På sikt kommer projektet göras om från början men även om det sker så är det en mångårig process vilket gör att en testmiljö kommer leva lika länge som programmet. Då detta blir vår livlina i att leverera stabilare versioner så är testmiljön något vi kommer hålla vid liv.

Jag är alltså ute efter tips eller idéer om hur man kan införa testning på befintlig kod i ett Forms-projekt utan att göra om koden allt för mycket.

Mitt alternativ

Det som jag har undersökt och tänkt på lite lätt är att man kan införa en ny typ av "testklass" som man inkluderar i hela det befintliga projektet som statiskt objekt. Detta för att kunna köra upp så pass nära skarpt läge som möjligt med inställningar osv. Eventuella inställningar får man justera vid antingen testningens start eller för varje test.
Vid uppstart av programmet i testadminläge så initierar man testklassen och har möjlighet att klicka sig igenom testerna man behöver. På detta vis så får man inte onödig kod som körs förrän man faktiskt vill göra testerna. Varje formulär eller kontroll man vill ha åtkomst till registrerar man in i testklassen vid initiering men enbart vid testningsuppstart.

Exempel på enkelt test
TestGUI-formuläret har en knapp vid namn "test1" som ska kontrollera att Form2 visas om en viss knapp har klickats på.
Klickar man på knappen "test1" i formuläret så utförs följande:

1. Exekvera test1-metoden i testklassen (som är inkluderad överallt man vill utföra tester i koden) 2. Leta reda på Form1 genom alla registrerade kontroller och objekt som har registrerats i testklassen 3. Plocka fram UC1 som är inkluderad i Form1 4. Exekvera knapptryck på Button1 som ligger i UC1 som i sin tur öppnar Form2 5. Kontrollera att Form2 är öppnad 6. Om Form2 visas är testet klart med lyckat resultat

Dubbletter av kontroller är vanligtvis inget problem. Det går att lösa genom att man registrerar kontrollen med nyckelord om flera måste finnas för olika funktioner. Övriga problem som att klick går att göras med space eller enter är inte heller något större problem. Bara eventhanteringen exekveras så räcker det testet tillräckligt långt.

Om man tar detta i längden så kan man skriva många av dessa tester och bränna igenom alla viktiga tester kombinerat med egna tester innan en version görs. Om det är kritiska grejer i en specifik modul (avdelning i kodbasen) så kör man specifika tester för det området om det är så att alla tester tar för lång tid. Begränsningen här sätter man alltså själv baserat på hur många tester som ska inkluderas i en testbatch eller om man vill köra testerna manuellt.

Nackdelen är ju att detta inte går att exportera ut till andra projekt men det är där hela problemet ligger från början. Om vi skulle få tid att göra om något så skulle det göras på ett nytt och bättre sätt vilket gör att man kan utföra tester på logiken snarare än gui-komponenterna.

Dold text

Jag är väldigt öppen för andra sätt att göra detta på. Behöver ingen wall of text som jag har skrivit utan länkar eller förslag på en rad går lika bra!

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk

Fortsätt att separera ui/logik för att underlätta unit tester.
Lägg till coded ui tester för automatiska regression tester. T.e.x https://docs.microsoft.com/en-us/visualstudio/test/use-ui-aut...

Skickades från m.sweclockers.com

Permalänk
Medlem

@zoomster2:
Den där länken gav mycket.

Ska kolla upp mer om CUIT.
Även Microsoft Test Manager där man kan spela in manuella tester verkar intressant.

Tackar!

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?