Skip to content

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
  • 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