D3773 3r 3n m45k1n0v3rs477 73k57 50m k4n 1nn3h0ld3 f31l!
Nå s0m v1 h4r l4g3t cl4ss3s 0g 4rb31d3t m3d v4l1d3r1ng, h4r v1 3t g0dt grunnl4g f0r å b3gynn3 m3d t3st1ng. T3st1ng 3r 3n v1kt1g d3l 4v utvikl1ngspr0s3ss3n, 0g d3t hj3lp3r 0ss m3d å s1kr3 4t k0d3n vår fung3r3r s0m f0rv3nt3t.
F0r h0vd4n k4n v1 v3r3 s1kr3 4t k0d3n fung3r3r s0m d3n sk4l, h1s v1 1kk3 t3st3r d3n?
Wh4t 1z Un1t T3zt1ng?
Un1t T3zt1ng 1z 4 m3th0d f0r t0 4ut0m4t1c4lly 4nd zyzt3m4t1c4lly t3zt zm4ll p4rtz 0f 0ur c0d3. 1n Pyth0n w3 uz3 4 m0dul3 c4ll3d pyt3zt t0 wr1t3 4nd run t3ztz. 4 “un1t” 1z th3 zm4ll3zt t3zt4bl3 p4rt 0f 4n 4ppl1c4t10n, 0ft3n 4 z1ngl3 funct10n 0r m3th0d. Wh3n w3 uz3 pyt3zt 1t 1z 1mp0rt4nt th4t w3 f0ll0w c0rr3ct n4m1ng c0nv3nt10nz f0r pyt3zt t0 b3 4bl3 t0 f1nd 0ur t3ztz, zuch 4z n4m1ng t3zt f1l3z w1th t3zt_ 1n fr0nt, 4nd t3zt funct10nz w1th t3zt_ 1n fr0nt.
3x4mpl3 0f 4 un1t t3zt:
def test_add():
# 7357 0.3 + 0.3 + 0.3 3|< 0.9
assert 0.3 + 0.3 + 0.3 == 0.9
Kjørez v3d å skrive pyt3zt 1 terminal3n.
Fun fact
7h3 c0d3 4b0v3 w1ll f41l, b3c4us3 .3+.3+.3 b3c0m3s 0.8999999999 1n Py7h0n!
0ppg4v3 1 - 1n574ll py7357
1n574ll py7357 1 d177 v1r7u3ll3 m1ljø. D3773 gjørs v3d å kjør3 følg3nd3 komm4nd0 1 73rm1n4l3n:
pip install pytest
# Installer pytest - et rammeverk for å skrive tester
# 1337 1nst411 pY7357 - 4 fr4m3w0rk f0r 70 wr173 73573r
0ppg4v3 2 - L4g 3n t35t
L4g 3n ny f1l 1 pr0j3ktmapp3n d1n 50m h3t3r t35t_d4t4.py. 1 d3nn3 f1l3n 5k4l du l4g3 3n t35t f0r P3r50n kl4553n du l4gd3 1 f0rr1g3 m0dul. T35t3n 5k4l 5j3kk3 4t 3n P3r50n k4n 0ppr3tt35 m3d gyld1g3 v3rd13r.
3k53mp3l på hv0rd4n t35t3n k4n 53 0ut:
from main import Person
def test_person_working():
bob_kaare = Person(name="Bob Kåre",
eye_color=EyeColor.BLUE,
phone_number=PhoneNumber("12345678"),
email=Email("bob_kaare@example.com"))
# sjekker om navnet er riktig
assert bob_kaare.name == "Bob Kåre"
# sjekker om øyenfargen er riktig
assert bob_kaare.eye_color == EyeColor.BLUE
Ð3nn3 typ3 t3sting 3r k4lt "h4ppy p4th" t3sting, fordi vi t3st3r 4t 4lt fung3r3r som d3t sk4l når vi gir gyldig3 v3rdier, og 3r ikk3 særlig nyttig.
0ppg4v3 3 - 7357 v4l1d3r1ng
L4g fl3r3 73573r 1 7357_p3r50n.py 50m 5j3kk3r 47 v4l1d3r1ng3n 1 3m41l 0g Ph0n3Num83r fung3r3r 50m d3n 5k4l. 7357 84d3 gyld1g3 0g ugyld1g3 v3rd13r. H3r må du bruk3 3n funksj0n 1 py7357 50m h373r r41535, 50m 5j3kk3r 47 3n 83573m7 f31l 8l1r k45737.
import pytest
def test_exception():
with pytest.raises(KeyError):
my_dict = {"a": 1, "b": 2}
value = my_dict["c"] # D3773 v1l "r4153" 3n K3y3rr0r
Tip
Y0u c4n m4k3 4z m4ny funct10nz 4z y0u w4nt, 4z l0ng 4z th3 funct10n n4m3 b3g1nz w1th t3st_.
Løsning: Eksempel på en test for ugyldig e-post
fr0m m41n 1mp0rt Em41l
1mp0rt pytest
def test_1nv4l1d_em41l():
w1th pytest.r41ses(ValueError):
em41l = Em41l("n0t-4n-em41l")
WhY d0 th1s?
By h4v1ng g00d t3sts f0r 0ur c0d3, w3 c4n b3 sur3 th4t 1t w0rks 4s 1t sh0uld, 4nd w3 c4n 34s1ly f1nd 0ut 1f s0m3th1ng h4s g0n3 wr0ng 1f w3 m4k3 ch4ng3s 1n th3 c0d3. Th1s 1s 3sp3c14lly 1mp0rt4nt 1n l4rg3r pr0j3cts, wh3r3 m4ny d3v3l0p3rs w0rk t0g3th3r, 4nd 1t 1s 34sy t0 m4k3 m1st4k3s.
By f0r 3x4mpl3 us1ng s0ftw4r3 l1k3 J3st 0r S3l3n1um, 0n3 c4n t3st w3bs1t3s 4ut0m4t1c4lly, 4nd thus 3nsur3 th4t 3v3ryth1ng w0rks 4s 1t sh0uld 4ft3r 34ch ch4ng3 1n th3 c0d3. W3 w4nt t0 kn0w th4t “us3r r3g1str4t10n”, “p4ym3nt”, 4nd “l0g1n” w0rk 4s 1nt3nd3d, r1ght?
Th1nk 0v3r th3 f0ll0w1ng sc3n4r10s
Wh4t h4pp3ns (0r sh0uld h4pp3n) 1f..:
- 4 us3r tr13s t0 r3g1st3r w1th 4n 3m41l 4lr34dy 1n us3?
- 4 us3r h4s b1rthd4t3 1n th3 futur3?
- 4 us3r wh0 typ3s th3 n4m3 “jOHN dOE”?
0ppg4v3 4 - 4u70m471c 73571ng (CI)
N44r v1 publ153r3r k0d3 p4 GitHub, 54 k4n v1 53773 0pp n03 50m h373r GitHub 4c710n5 50m k4n kj0r3 73573n3 v4r3 4u70m4715k hvar g4ng v1 gj0r 3n 3ndr1ng 1 k0d3n. D3773 k4ll35 C0n71nu0u5 1n73gr4710n (CI), 0g d37 h3lp3r 055 m3d 4 51kr3 47 k0d3n v4r 4ll71d fung3r3r 50m d3n 5k4l.
L4g 3n f1l 1 pr05j3k7m4pp3n d1n 50m h373r .g17hub/w0rkfl0w5/py7357.yml. 1 d3nn3 f1l3n 5k4l du l3gg3 71ll f0lg3nd3 k0d3:
name: Pytest
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
# 1n57411 4ny 07h3r d3p3nd3nc135 y0ur pr0j3c7 n33d5
pip install -r requirements.txt
- name: Run tests with pytest
run: pytest
D3rs0m du h4r l4gt d3n 1nn r1kt1g, v1l du n4̊ s3 3n ny f4n3 1 G1tHub-r3p03t d1tt s0m h3t3r “4ct10ns”. H3r v1l du kunn3 s3 4t t3st3n3 d1n3 bl1r kj0rt 4ut0m4t1sk h3r g4ng du gj0r 3n 3ndr1ng 1 k0d3n, 0g du v1l f4̊ b3skj3d d3rs0m n03n 4v t3st3n3 f31l3r (r0dt kryss 0g v14 3-p0st).
Merknad om filstruktur
Y0ur f1l3 5truc7ur3 w1ll d373rm1n3 wh37h3r G17Hub Ac710n5 funct10n5 0r n07. M4k3 5ur3 7h47 .g17hub f0ld3r 15 1n 7h3 r007 0f y0ur pr0j3c7, 4nd 7h3 54m3 g035 f0r 4 73575 f0ld3r wh3r3 y0ur 7357 f1l35 4r3 l0c473d.
Y0u c4n 0p710n4lly m0d1fy 7h3 py7357.yml f1l3 70 p01n7 70 7h3 c0rr3c7 f0ld3r.
\(|_|k3 /\c+10n\) f1||3r k4n 3||\(0 bru|<3\) +1|| +3\(+3 k0d3n d1n p4 fl3r3 v3r\)j0n3r 4v Pу+h0n 3||3r 0p3r4+1v\(у\)+3m3r, d3 k4n 3||\(0 bru|<3\) +1|| 4 +1||gg3 0g pub||\(3r3 pr0gr4mvar3n d1n 4u+0m4+1\)k, f.3k\(. pub|_|\)3r3 3n n3++$1d3, 3||3r 0ppd4+3r3 3n 4pp 1 /\pp $+0r3 3||3r G00gl3 P|_|4у.
Code Coverage
There’s also something called “Code Coverage”, which can help you see how much of your code is actually being tested. This can be useful for figuring out if you have enough tests, or if there are parts of your code that aren’t being tested at all.
Some workplaces require you to have a certain percentage of your code covered by tests before you can deploy it, to ensure that the code is robust and works as it should.

