Testing II

Testing II#

Når vi skal teste større ting er det hensiktsmessig å lage et testprogram. Det skal vi gjøre ved å bruke den innebygde pakken unittest.

Testing med unittest#

La oss ta utgangspunkt i programmet sirkelregner.py.

import math

class Sirkel:
    def __init__(self, r):
        if r < 0:
            raise ValueError("Radius kan ikke være negativ.")
        
        self.r = r
        self.areal = math.pi * self.r ** 2
        self.omkrets = 2 * math.pi * self.r
    
    # Skalerer sirkelen med en faktor k
    def skaler(self, k):
        if type(k) not in [int, float]:
            raise TypeError("Skaleringsfaktoren må være et tall.")
        elif k < 0:
            raise ValueError("Skaleringsfaktoren kan ikke være negativ")
        
        self.__init__(self.r * k)

    # Returnerer en string når man printer objekter av klassen
    def __str__(self):
        return f"Sirkel med radius: {self.r:.3f}, areal: {self.areal:.3f} og omkrets: {self.omkrets:.3f}"

Nå skal vi lage et testprogram. Vi kommer til å kalle testprogrammet test_sirkelregner.py.

Her er noen av tingene vi skal teste.

  • Vi skal få en ValueError dersom vi prøver å sette en negativ radius.

  • Vi skal få en TypeError dersom skaleringsfaktoren ikke er et tall.

  • Vi skal få en ValueError dersom skaleringsfaktoren er negativ.

  • Vi skal få areal og omkrets lik 0 dersom radius er lik 0.

  • Arealet skal øke med en faktor 4 dersom vi skalerer med skaleringsfaktor 2.

  • Omkretsen skal øke med en faktor 2 dersom vi skalerer med skaleringsfaktor 2.

Vårt testprogram test_sirkelregner.py kan se slik ut:

import sirkelregner as sr
import unittest, math

class TestSirkelregner(unittest.TestCase):
    # Testmetode for konstruktøren
    def test_konstruktør(self):
        # Sjekker at vi får ValueError med negativ radius
        self.assertRaises(ValueError, sr.Sirkel, -1)

        # Sjekker noen regneeksempler
        self.assertAlmostEqual(sr.Sirkel(1).areal, math.pi)
        self.assertEqual(sr.Sirkel(0).areal, 0)
        self.assertAlmostEqual(sr.Sirkel(1).omkrets, 2*math.pi)
        self.assertEqual(sr.Sirkel(0).omkrets, 0)

    # Testmetode for skaleringsmetoden
    def test_skalering(self):
        # Lager et eksempel
        sirkel = sr.Sirkel(1)

        # Sjekker at vi får TypeError med feil type skaleringsfaktor
        self.assertRaises(TypeError, sirkel.skaler, "1")

        # Sjekker at vi får ValueError med negativ skaleringsfaktor
        self.assertRaises(ValueError, sirkel.skaler, -1)

        # Sjekker at skaleringen blir riktig
        areal_før, omkrets_før = sirkel.areal, sirkel.omkrets
        sirkel.skaler(2)
        areal_etter, omkrets_etter = sirkel.areal, sirkel.omkrets
        self.assertAlmostEqual(areal_etter, 4*areal_før)
        self.assertAlmostEqual(omkrets_etter, 2*omkrets_før)

For å kjøre testprogrammet bruker vi python -m unittest test_sirkelregner.py i terminalvinduet.

Da får vi utskriften:

Ran 2 tests in 0.000s

OK

Det betyr at testene gikk gjennom uten feil. Koden fungerer som forventet 👍


Oppgaver#

Oppgave 1 🌡️

I denne oppgaven skal vi lage et testprogram før vi lager et program.

Til slutt skal temperatur.py inneholde en klasse Temperatur som har en attributt c som skal tilsvare grader i celsius og settes i konstruktøren.

Temperatur skal også ha to metoder.

  • som_kelvin() skal returnere temperaturen som kelvin.

  • som_fahrenheit() skal returnere temperaturen som fahrenheit.

  1. Lag to filer temperatur.py og test_temperatur.py i samme mappe.

  2. Sett opp test_temperatur.py og lag noen tomme testmetoder test_konstruktør, test_som_fahrenheit og test_som_kelvin. (Du kan bruke pass for å lage metoder som ikke gjør noen ting)

Her er noen krav som du må teste med testmetodene dine.

  • Man skal få en ValueError dersom man setter temperaturen til -273.15 eller under.

  • Man skal få en TypeError dersom temperaturen man setter ikke er et tall.

  • For en temperatur 0.0 skal man få ut 32.0 grader fahrenheit, og 237.15 grader kelvin.

  • For en temperatur 100.0 skal man få ut 212.0 grader fahrenheit og 373.15 grader kelvin.

  1. Lag temperatur.py og sjekk at alle testene går gjennom med python -m unittest test_temperatur.py underveis.