Kmom03: Enhetstestning

By , . Latest revision .

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.

Enhetstestning med PHPUnit via en Makefile.

Enhetstestning med PHPUnit via en Makefile.

Kodtäckning vid enhetstestning, en översikt av enheterna (klasserna).

Kodtäckning vid enhetstestning, en översikt av enheterna (klasserna).

Detaljerad kodtäckning rad för rad i en enhet (klass).

Detaljerad kodtäckning rad för rad i en enhet (klass).

(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ö. Se till att du installerar PHPUnit version 6.0 eller högre, men välj en version som matchar din version av PHP.

  1. Installera PHPUnit och Xdebug för att kunna köra enhetstester med kodtäckning på din lokala maskin.

#Läs & Studera

(ca: 3-6 studietimmar)

#Artiklar

Läs följande.

  1. Låt oss se över vilka delar som vi hittills har gått igenom i PHP-manualen om “Klasser och Objekt”. Kika så att du har hyffsad koll på dem. Gör en kort repetition, dessa omfattar den viktiga grunden av objektorienterade konstruktioner i PHP.

#Enhetstestning

Läs följande.

  1. Läs introduktionen till enhetstester och enhetstestning i artikeln “Enhetstestningens roll i test av mjukvara”.

  2. I dokumentet PHP The Right Way, finns en sektion som berör testning i PHP.

  3. Gå till hemsidan för PHPUnit och bekanta dig kort och översiktligt med verktyget PHPUnit. Se till att du kollar upp vilka versioner av verktyget som stödjer de olika versionerna av PHP.

  4. Kika kort på PHPUnit på GitHub, det är öppen källkod så kolla snabbt hur ett större projekt fungerar på GitHub. Kolla dess commit-historik, hur issues diskuteras, releashanteringen, pull requests och hur källkoden ser ut. Använder de phpdoc och docblock kommentarer?

  5. 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.

      1. Writing Tests for PHPUnit
      1. The Command-Line Test Runner
      1. Fixtures
      1. Organizing Tests
      1. Code Coverage Analysis
    • Appendix 1. Assertions
  6. Bekanta dig kort och översiktligt med Xdebug för PHP och kika snabbt över vilken dokumentation som finns. Se vilka funktioner Xdebug kan tillföra till din utvecklingsmiljö. Vi kommer enbart använda Xdebug tillsammans med PHPUnit för att generera rapporter över kodtäckning.

  7. För att läsa mer generellt om testning så är Wikipedia Software Testing en bra utgångspunkt. Kika där och läs mer om du har tid och intresse.

#Ramverk Anax

Modulerna i ramverket Anax omfattas av enhetstestning i olika omfattning. Här kan du se de moduler du tidigare använt tillsammans med en badge som berättar hur mycket av modulens kod som är täckt av ett eller flera enhetstester.

  1. Ett par Anax moduler och omfattningen av enhetstester (kodtäckning) för respektive modul.

Klickar du på “kodtäckningsbadgen” så kommer du till Scrutinizer som är ett automatiserat byggverktyg som checkar ut och utför enhetstesterna för modulen, varje gång som modulen uppdateras på GitHub.

Varje Anax modul har en katalog test/ där alla enhetstester är samlade. Välj ut en av modulerna och inspektera de filerna som ligger i dess test-katalog. Du kommer snart att bygga en liknande struktur i din me-sida för att testa dina egna klasser.

#Video

Det finns generellt kursmaterial i video form.

  1. Kursen innehåller genomgångar och föreläsningar som spelas in (streamas) och därefter läggs i en spellista. Du kan nå spellistan på “oophp streams vt19”.

  2. Uppgifter och övningar kan innehålla extra videomaterial i form av spellistor kopplade till respektive artikel. Ofta syns dessa videor i inledningen av artikeln.

#Övningar & Uppgifter

(ca: 6-10 studietimmar)

#Uppgifter

Gör följande uppgifter.

  1. Lös uppgiften “Kom igång med PHPUnit” som guidar dig igenom de första stapplande stegen i enhetstestning. Spara all kod i me/kmom03/phpunit.

  2. Gör uppgiften “Tärningsspel 100” inuti din me-sida. Spara din kod under me/redovisa.

  3. Pusha och tagga ditt repo me/redovisa allt eftersom och sätt en avslutande tagg (3.0.*) när du är klar med alla uppgifter och redovisningstext i kursmomentet. Gör även en avslutande make test som en sista avstämning, innan du sätter sista taggen.

#Resultat & Redovisning

(ca: 1-2 studietimmar)

Läs instruktionen om hur du skall redovisa.

Se till att följande frågor besvaras i texten:

  • Har du tidigare erfarenheter av att skriva kod som testar annan kod?
  • Hur ser du på begreppen enhetstestning och “att skriva testbar kod”?
  • Förklara kort begreppen white/grey/black box testing samt positiva och negativa tester, med dina egna ord.
  • Berätta om hur du löste uppgiften med Tärningsspelet 100, hur du tänkte, planerade och utförde uppgiften samt hur du organiserade din kod?
  • Hur väl lyckades du testa tärningsspelet 100?
  • Vilken är din TIL för detta kmom?

#Revision history

  • 2019-04-12: (D, mos) Uppdaterad inför v5, mer läsanvisningar och uppdaterade uppgifter.
  • 2018-09-10: (C, mos) Flyttad tärningsspel från kmom02.
  • 2018-04-03: (B, mos) Omarbetad inför oophp v4.
  • 2017-04-07: (A, mos) Första utgåvan.

Document source.