Kmom04: Enhetstestning
Vi jobbar vidare med klasser och objekt och nu tittar vi på hur klasser kan enhetstestas med verktyget PHPUnit. PHPUnit är ett av de verktyg som vanligen används inom PHP för att utföra enhetstestning av kod.
Vi har tidigare pratat om begreppet inkapsling och att klasserna skall erbjuda ett publikt API, ett gränssnitt för användaren av klassen. Samtidigt vill vi skydda den interna implementationen inuti klassen. Vi vill låta användaren av vår klass ha ett tydligt gränssnitt, men inuti klassen vill vi själva bestämma hur vi implementerar klassens detaljer, utan att påverka/påverkas av det publika gränssnittet.
Liknande begrepp använder vi i enhetstestning. Vi ser varje klass som en enhet som skall testas och vi testar klassen via dess publika gränssnitt vilket är de metoder vi når som användare av klassen, klassens publika metoder. När vi testar så är vi fullt medvetna om hur klassen är uppbyggd. Vi kallar det för white box testing, vi har tillgång till klassens källkod när vi skriver testfallen och vi vet exakt den källkod vi skall testa. Målet är att testa alla varianter av användning mot klassen, även felfall.
Vi försöker även nå en så kod kodtäckning som möjligt och rimligt. 100% kodtäckning handlar om att testfallen exekverar samtliga kodrader minst en gång. Ibland är det inte möjligt att nå 100% och man kan nöja sig med en siffra som kanske når 70%. Det är något man får “känna efter” och se hur testbar ens kod är.
Som ett litet sidospår tittar vi även på hur man kan automatisera dokumentationen av sin kod.
(Detta är instruktionen för kursmomentet och omfattar det som skall göras inom ramen för kursmomentet. Momentet omfattar cirka 20 studietimmar inklusive läsning, arbete med övningar och uppgifter, felsökning, problemlösning, redovisning och eftertanke. Läs igenom hela kursmomentet innan du börjar jobba. Om möjligt – planera och prioritera var du vill lägga tiden.)
#Labbmiljö
(ca: 1-2 studietimmar)
Installera följande som en del av din labbmiljö.
- Installera Xdebug för att kunna köra enhetstester med kodtäckning på din lokala maskin.
#Läs & Studera
(ca: 2-4 studietimmar)
För att lösa uppgifterna och redovisningen bör du studera enligt följande.
#Föreläsning
Titta igenom följande föreläsningar.
Introduktion till området “Software Testing” om ingenjörsprocessen att utföra testning med mjukvara.
Introduktion till området “Software Unit Testing” och rollen för enhetstestning i testprocessen av mjukvara.
#Litteratur
Läs enligt följande.
I dokumentet PHP The Right Way, finns en sektion som berör testning i PHP. Läs igenom den.
Bekanta dig med PHPUnits dokumentation. Kika över innehållsförteckningen och skumläs snabbt följande kapitel (för att bekanta dig med manualens struktur och innehåll. Du kommer behöva gå tillbaka till manualen, senare när du skriver dina testprogram. Det är via manualen du kan lära dig allt som du behöver veta om enhetstester med phpunit.
- Writing Tests for PHPUnit
- The Command-Line Test Runner
- Organizing Tests
- Fixtures
- Test Doubles
- Code Coverage
- Appendix 1. Assertions
#Övningar & Uppgifter
(ca: 10-14 studietimmar)
Övningar är träning inför uppgifterna, det är ofta klokt att jobba igenom övningarna. Uppgifter skall utföras och redovisas.
Jobba gärna i grupp med dina studiekompisar, men skriv alltid din egen kod för hand. Även om du tjuvkikar för att hitta bra lösningar så är det en stor skillnad att skriva koden själv jämfört med att kopiera från någon.
#Övningar
Jobba igenom övningarna, de förbereder dig inför uppgifterna.
- Det finns en övning “Document your PHP code” i ditt kursrepo under
example/phpdoc
som hjälper dig att komma igång med att automatiskt skapa dokumentation för din kod. Jobba igenom den och integreracomposer phpdoc
i dittme/report
.
- Det finns en övning “Get going with phpunit” i ditt kursrepo under
example/phpunit
som hjälper dig att komma igång med phpunit och enhetstestning. Jobba igenom den och försök nå 100% kodtäckning samtidigt som du lär dig grunderna i enhetstestning.
- Denna övningen visar hur du installerar PHPUnit på det viset som Symfony rekommenderar att det görs tillsammans med en Symfony applikation. Du kan se hur man gör i övningen “Run unittests with PHPUnit in Symfony”. Jobba igenom den och integrera
composer phpunit
i dittme/report
.
#Extra övningar
Följande övningar är extra träning som kan hjälpa dig i längden. Titta igenom vad de innehåller och utför dem om du har tid och energi.
- Övningen “PHPUnit how to mock object” finns i ditt kursrepo under
example/phpunit-mock
och den visar hur du kan mocka ett objekt under enhetstestning för att underlätta testning av kod som har slumpmässigt beteende eller om dina klasser har beroenden som du vill undvika och avgränsa vid enhetstestning.
#Uppgifter
Följande uppgifter skall utföras och resultatet skall redovisas.
- Lös uppgiften “Enhetstesta dina klasser med PHPUnit i Symfony”.
#Resultat & Redovisning
(ca: 1-2 studietimmar)
Läs instruktionen om hur du skall redovisa.
Se till att följande frågor besvaras i din redovisningstext.
Berätta hur du upplevde att skriva kod som testar annan kod med PHPUnit och hur du upplever phpunit rent allmänt.
Hur väl lyckades du med kodtäckningen av din kod, lyckades du nå mer än 90% kodtäckning?
Upplever du din egen kod som “testbar kod” eller finns det delar i koden som är mer eller mindre testbar och finns det saker som kan göras för att förbättra kodens testbarhet?
Valde du att skriva om delar av din kod för att förbättra den eller göra den mer testbar, om så berätta lite hur du tänkte.
Fundera över om du anser att testbar kod är något som kan identifiera “snygg och ren kod”.
Vilken är din TIL för detta kmom?
#Revision history
- 2023-04-20: (B, mos) Genomgången i mvc-v2.
- 2021-04-19: (A, mos) Första utgåvan i mvc-v1.