Testēšana¶
Ievads vienību testēšana¶
Fibonacci divos veidos¶
Uzdevums
Aplūko dotās funkcijas un testu piemērus! Pieraksti papildus testus, atrodi kļūdu vienā no programmām un izlabo to!
Programmas un testu kods
# Vienkārša Fibonacci skaitļa aprēķināšanas funkcija
def fib(n):
old, new = 0, 1
for _ in range(n):
old, new = new, old + new
return old
# Rekursīva Fibonacci skaitļa aprēķināšanas funkcija
def rfib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return rfib(n-1) + rfib(n-1)
import pytest
from fibonacci import fib, rfib
def test_fib():
assert fib(1) == 1
assert fib(10) == 55
def test_rfib():
assert rfib(0) == 0
assert rfib(10) == 55
Valodas sintakse
- pytest lietošanas tl;dr:
- testiem datnes nosaukumam jāsākas ar
test_
vai jābeidzas ar_test
- testu funkciju nosaukumam jāsākas ar
test
- testus palaiž ar komandu
python -m pytest
- papildus karogs
-v
(verbose), lai saņemtu vairāk informācijas - papildus karogs
--durations=N
parāda N lēnākos testus
- testiem datnes nosaukumam jāsākas ar
- Oficiālā dokumentācija
- repl.it paraugs - ja nav iespējams Python uzinstalēt lokāli
Parametrizēts Fibonacci tests¶
Uzdevums
Salīdzini testu test_fibonacci_parametrizets.py
ar test_fibonacci_vienkarsi.py
.
Pieraksti papildus parametrus testā test_fibonacci_parametrizets.py
, reflektē kā tas atvieglo testu rakstīšanu!
Programmas un testu kods
# Vienkārša Fibonacci skaitļa aprēķināšanas funkcija
def fib(n):
old, new = 0, 1
for _ in range(n):
old, new = new, old + new
return old
# Rekursīva Fibonacci skaitļa aprēķināšanas funkcija
def rfib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return rfib(n-1) + rfib(n-1)
import pytest
from fibonacci import fib, rfib
def test_fib():
assert fib(1) == 1
assert fib(10) == 55
def test_rfib():
assert rfib(0) == 0
assert rfib(10) == 55
import pytest
from fibonacci import fib
@pytest.mark.parametrize('n, res',
[(0, 0),
(1, 1),
(6, 8),
(10, 55),
(34, 5702887)
])
def test_fib(n, res):
assert fib(n) == res
TDD pieeja¶
Virsraksta formatētajs¶
Uzdevums
Uzraksti funkciju, kas dotam tekstam pārveido visus vārdus "title case" - lai visi vārdi sākas ar lielo burtu. Testi, kas pārbauda dažādus ievades datus jau ir doti.
Pabeidz funkcionalitāti, lai visi testi sekmīgi izpildītos. Izdomā vēl kādu ievades teksta piemēru, kas varētu nestrādāt. Uzraksti tam testu un, ja nepieciešams, izlabo funkcionalitāti.
Programmas un testu kods
def title_case(text):
"""
Funkcija pārveido tekstu "virsrakstu formātā" -
visi vārdi sākas ar lielo burtu.
Arguments:
x {string} -- pārveidojamais teksts
Returns:
string -- pārveidotais teksts
"""
return text.capitalize()
import pytest
from titlecase import title_case
def test_empty_string():
assert title_case('') == ''
def test_lowercase_word():
assert title_case('semaphore') == 'Semaphore'
def test_uppercase_word():
assert title_case('CAMBRIDGE') == 'Cambridge'
def test_lowercase_sentence():
assert title_case('hello, world!') == 'Hello, World!'
def test_mixed_sentence():
assert title_case('ACTA non verba!') == 'Acta Non Verba!'
def test_raises_exception_on_non_string_arguments():
with pytest.raises(TypeError):
title_case(42)
Vienību testi gatavai programmai¶
Lietotāju datu formatēšanas programma¶
Uzdevums
Izlasi specifikāciju un programmas kodu. Uzraksti vienības testus dotajai programmai, kas pārbauda abilstību specifikācijai.
Specifikācija
Nepieciešama funkcija, kas pieņem un apstrādā divus argumentus: lietotāja datus (dictionary datu tips) un formātu (string) un atgriež attiecīgi noformatētu tekstu.
Iespējamie formāta nosaukumi un sagaidāmais rezultāts:
formāta nosaukums | rezultāta formāts | piemērs |
---|---|---|
greeting | "Title First Last" | "Dr Uga Dumpis" |
short | "Title Last" | "Dr Dumpis" |
country | "Nat" | "LV" |
table | "First | Last | Title | Nat" | "Uga | Dumpis | Dr | LV" |
Programmas un testu kods
def format_user(userdata, format):
result = ""
u = userdata["name"]
if format == "greeting":
result = "{}, {} {}".format(u["title"], u["first"], u["last"])
elif format == "short":
result = "{}{}".format(u["title"], u["last"])
elif format == "country":
result = userdata["nat"]
elif format == "table":
result = "{} | {} | {} | {}".format(u["first"], u["last"], u["title"], userdata["nat"])
else:
result = "{} {}".format(u["first"], u["last"])
return result
import pytest
from formatuser import format_user
@pytest.fixture
def example_people():
return [
{"name": {"title": "Miss", "first": "Melike", "last": "Karaböcek"}, "nat": "TR"},
{"name": {"title": "Mrs", "first": "Ingeborg", "last": "Halvorsrud"}, "nat": "NO"},
{"name": {"title": "Dr", "first": "Maeva", "last": "Fabre"}, "nat": "CH"},
{"name": {"title": "Mr", "first": "Louis", "last": "Leclerc"}, "nat": "FR"},
{"name": {"title": "Mr", "first": "Necati", "last": "Ilıcalı"}, "nat": "TR"}
]
def test_format_table(example_people):
result = format_user(example_people[3], "table")
assert True
Izstrāde no specifikācijas¶
Uzdevums
Uzrakstīt specifikācijai atbisltošu programmu un testus, kas pārbauda visu galveno funkcionalitāti (skat. zemsvītras piezīmi 1).
Specifikācija
Kaut kāds apraksts
Cits apraksts