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 lik0
.Arealet skal øke med en faktor
4
dersom vi skalerer med skaleringsfaktor2
.Omkretsen skal øke med en faktor
2
dersom vi skalerer med skaleringsfaktor2
.
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.
Lag to filer
temperatur.py
ogtest_temperatur.py
i samme mappe.Sett opp
test_temperatur.py
og lag noen tomme testmetodertest_konstruktør
,test_som_fahrenheit
ogtest_som_kelvin
. (Du kan brukepass
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å ut32.0
grader fahrenheit, og237.15
grader kelvin.For en temperatur
100.0
skal man få ut212.0
grader fahrenheit og373.15
grader kelvin.
Lag
temperatur.py
og sjekk at alle testene går gjennom medpython -m unittest test_temperatur.py
underveis.