Kmom03: Enhetstestning
Vi jobbar vidare med klasser och objekt och denna gången 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 koden.
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, dess 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.
Detta är instruktionen för kursmomentet och omfattar cirka 20 studietimmar. Fokus ligger på uppgifter som du skall lösa och redovisa. För att lösa uppgifterna behöver du normalt jobba igenom övningar och läsanvisningar för att skaffa dig rätt kunskap och förståelse av uppgiftens alla delar. Läs igenom hela kursmomentet innan du börjar jobba.
#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.
- Om du är på Mac kan du vara behjälpt av att installera “PHP i terminalen” och “Xdebug” via pakethanterare Brew, för detaljer se “Installera Xdebug på Mac OS med XAMPP/brew”.
#Uppgifter & Övningar
(ca: 10-14 studietimmar)
Uppgifter skall utföras och redovisas, övningar är träning inför uppgifterna.
#Uppgifter
Följande uppgifter skall utföras och resultatet skall redovisas.
- Lös uppgiften “Enhetstesta dina klasser med PHPUnit”.
#Övningar
Jobba igenom övningarna, de förbereder dig inför uppgifterna.
- Det finns en tutorial “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 och samtidigt lära dig grunderna i enhetstestning.
#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 “software testing” och ingenjörsprocessen att utföra testning.
Slides till föreläsningen “Introduktion till området ‘Software Testing’”.
#Introduktion till området “Software Unit Testing”
Fortsättning med objekt och klasser i PHP. Vi studerar konstrukturer för arv, komposition, interface och trait. Vi pratar också om hur man skall tänka när man kodar objektorienterat och vad som är god kodsed och riktlinjer när man designar och implementerar sina klasser.
Slides till föreläsningen “Introduktion till området ‘Software Unit Testing’”.
#Litteratur
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
- Fixtures
- Organizing Tests
- Code Coverage Analysis
- Appendix 1. Assertions
#Resultat & Redovisning
(ca: 1-2 studietimmar)
Läs instruktionen om hur du skall redovisa. Observera att denna kursen skiljer sig från hur du normalt sett lämnar in din redovisningstext.
Se till att följande frågor besvaras i texten i din rapport:
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?
#Resurser bra-att-ha
Här anges övriga resurser som kan användas för vidare studier i det som kursmomentet omfattar.
#Om Software Testing
Följande resurser används i olika omfattning i samband med föreläsningen “Introduktion till området “Software Testing”“.
För att läsa mer allmänt om test av mjukvara så kan Wikipedia vara en grov startpunkt via följande sidor.
Om du fattade intresse för SWEBOK så finns resurserna här.
- Wikipedia om SWEBOK
- IEEE Computer Society med “The Guide to the Software Engineering Body of Knowledge (SWEBOK Guide)”
#Om Software Unit Testing
Följande resurser används i olika omfattning i samband med föreläsningen “Introduktion till området “Software Unit Testing”“.
Kika på Wikipedia artikeln om “List of software bugs” för att lära sig om kända buggar och deras konsekvenser.
Läs om “Side effect (computer science)” och lära sig om referens transparens, idempotens och deterministisk.
- Läs om den relaterade termen “Pure function”.
- Läs om den relaterade termen “Deterministic algorithm”.
Försök få en förståelse för begreppet “False positives and false negatives” och hur det hänger ihop med enhetstester.
#PHPUnit
När det gäller phpunit så är bland annat följande resurser intressanta att ha koll på.
- PHPUnits hemsida
- Manualen (dubbelkolla så att du läser rätt version av manualen som mappas mot den version av phpunit du använder).
- PHPUnit och PHP supportade versioner, se vilka versioner som är aktiva för tillfället.
- PHPUnit på GitHub, följ utvecklingen och läs om vilka issues som finns.
För att kodtäckningen skall fungera behöver du installera Xdebug.
#Arkiv
En introduktionen till enhetstester och enhetstestning ges i artikeln “Enhetstestningens roll i test av mjukvara”. Denna artikeln kan anses ersatt av de båda föreläsningarna om test och ligger med här enbart av kuriosa skäl.
#Git och skriva bra commits
Det kan vara en konst att skriva bra commit-meddelande så att man får en bra historik när man tittar på koden via ens commits.
- Läs artikeln “How to Write a Git Commit Message” för att få sju gyllene regler som kan hjälpa dig till bättre commit-meddelanden.
I artikeln ovan refereras till Linux kärnan och repon skrivna av Tim Pope som bra exempel på commit-historik. Följande länkar leder till den typen av exempel.
- StackOverflow “Git Commit Messages: 50/72 Formatting” men ett histogram över längden på commit-meddelanden från Linux kärnan.
- Tim Pope “A Note About Git Commit Messages” som är en äldra artikel som ofta refereras till i sammanhanget.
#Revision history
- 2021-04-13: (A, mos) Första utgåvan i mvc-v1.