Göm menyn

5C. Testning och undantagshantering

5.12 Inledning

I denna omgång ska vi förbättra den kod som ni skrivit i laboration 5A och 5B genom att lägga till mer genomtänkta tester samt stöd för att hantera undantag.

Studiematerial

Innan denna deluppgift påbörjas ska följande studiematerial ha lästs:

5.13 Testning

Innan man börjar ändra på tidigare skriven kod kan det vara en bra idé att skriva tester som ser till att koden gör som den ska efter att den har ändrats.

Skriv tester för de funktioner du skrivit. Python har ett inbyggt testbibliotek som kräver vissa kunskaper i objektorientering, något vi inte tar upp i den här kursen. Om ni vill kan ni prova det, annars räcker det bra med något på formen:

def test_something(): data = ... result = something(data) assert(result == expected) ... def run_free_spans_tests(): test_something() test_something_else() ... print("All tests passed")

Testerna ni skriver behöver inte vara heltäckande, men försök att komma på några gränsfall (eng. edge cases) att testa. En bra tumregel är att varje funktion ni skrivit ska ha minst ett test.

Uppgift 5C1: Testning

Målet med uppgiften är att du ska kunna ta fram heltäckande och välgrundade enhetstester för funktioner som du själv har skrivit tidigare.

Skriv tester för följande funktioner:

  • Funktionerna som returneras av pixel_constraint
  • generator_from_image
  • combine_images

Val av testfall ska motiveras tydligt, och inte bara tas från tidigare exempel, så att det framgår att ni förstått varför och hur man bör ägna sig åt testning. Motiveringen skrivs förslagsvis som kommentarer i testkoden.

Tips: Funktionerna ni skrivit behandlar bilder representerade som väldigt långa listor. Eftersom bilddatan bara är listor går det dock att förenkla testningen genom att använda små listor med intressant data.

5.14 Undantagshantering

Koden ni tidigare skrivit fungerar om den får rätt indata, men vad händer om vi till exempel ger den bilder av olika storlek?

>>> generator1 = generator_from_image([(0,0,0), (0,0,0)]) >>> generator2 = generator_from_image([(0,0,0), (0,0,0), (0,0,0)]) >>> mask = [(0,0,0), (0,0,0), (0,0,0)] >>> combine_images(mask, gradient_condition, generator1, generator2) ...

För att göra programmet mer robust vill vi lägga till undantagshantering som ger vettiga felmeddelanden om något går fel.

Uppgift 5C2: Undantagshantering

Målet med uppgiften är att du ska kunna kasta och fånga upp undantag på ett lämpligt sätt.

Nu när det finns tester som ser till att koden fortfarande gör som den ska om den ändras kan ni börja implementera undantagshanteringen.

  • Se till att funktioner som returneras av generator_from_image kastar ett lämpligt undantag (eng. exception) om indexet den får in är större än listans längd.
  • Se också till att de condition-funktioner som pixel_constraint returnerar kastar lämpliga undantag om indatan inte är tuples som kan tolkas som pixlar.
  • Slutligen ska ni se till att combine_images fångar de undantag som kastas av de inre funktionerna och kastar en ny exception om något går fel.

En lista på Pythons inbyggda undantag finns här.

Lägg också till tester som ser till att rätt undantag kastas om indatan till funktionerna är fel.

Slutligen ska ni kortfattat motivera varför de undantag ni valt att använda är rätt för just den funktionen. Det behöver bara vara någon mening per funktion. Spara ner motiveringen i en fil med namnet motivering.txt i samma mapp som er kod.


Sidansvarig: Peter Dalenius
Senast uppdaterad: 2023-10-09