Liceum Klasa I 45 minut PP: II.1 + I.3 | s. 342-343

Lekcja 14: Testowanie poprawnosci programow dla roznych danych

Przypadki testowe, dane brzegowe, debugowanie, technika print debugging

📋 Podstawa programowa: II.1+I.3
dane testowedebugowanietestowanie
00:00
Wprowadzenie
5 min
00:05
Teoria
15 min
00:20
Cwiczenia
15 min
00:35
Podsumowanie
10 min
📚

Teoria

Po co testujemy programy?

Testowanie to proces sprawdzania, czy program dziala poprawnie dla roznych danych wejsciowych. Nawet jesli program kompiluje sie bez bledow i wydaje sie dzialac prawidlowo, moze zawierac ukryte bledy (bugi), ktore ujawnia sie dopiero dla pewnych specyficznych danych.

Kazdy profesjonalny programista testuje swoj kod. Szacuje sie, ze okolo 40-50% czasu pracy programisty to wlasnie testowanie i naprawianie bledow!

Zlota zasada testowania: Program, ktory nie zostal przetestowany, nie dziala poprawnie. Testuj wczesnie, testuj czesto, testuj rozne scenariusze!

Rodzaje przypadkow testowych

Dobrze dobrane testy powinny obejmowac rozne kategorie danych:

  • Dane typowe - standardowe dane, dla ktorych program powinien dzialac (np. dla dzielenia: 10/2)
  • Dane brzegowe (edge cases) - wartosci graniczne, ekstremalnie male lub duze (np. 0, 1, -1, maksymalna wartosc)
  • Dane niepoprawne - dane, ktore program powinien odrzucic (np. tekst zamiast liczby, dzielenie przez 0)
  • Dane specjalne - wartosci, ktore moga powodowac problemy (np. liczby ujemne, puste ciagi znakow)

Przyklad: testowanie funkcji silnia

def silnia(n):
    wynik = 1
    for i in range(1, n + 1):
        wynik *= i
    return wynik

# Przypadki testowe:
print(silnia(0))   # Oczekiwane: 1  (0! = 1)
print(silnia(1))   # Oczekiwane: 1  (1! = 1)
print(silnia(5))   # Oczekiwane: 120 (5! = 120)
print(silnia(10))  # Oczekiwane: 3628800
# A co z silnia(-1)? Program powinien to obslugiwac!

Technika print debugging

Najprostsza metoda szukania bledow to print debugging - dodawanie instrukcji print() w kluczowych miejscach kodu, aby sledzic wartosci zmiennych i przebieg programu.

# Program z bledem - szukamy go za pomoca print()
def srednia(lista):
    suma = 0
    for i in range(len(lista)):
        suma += lista[i]
        print(f"DEBUG: i={i}, lista[i]={lista[i]}, suma={suma}")
    wynik = suma / len(lista)
    print(f"DEBUG: suma={suma}, len={len(lista)}, wynik={wynik}")
    return wynik

# Testujemy
print(srednia([10, 20, 30]))  # Oczekiwane: 20.0

Typowe bledy w programach

Oto najczestsze bledy, ktore napotkasz jako poczatkujacy programista:

  1. Off-by-one error - blad o jeden (np. range(1, n) zamiast range(1, n+1))
  2. Blad dzielenia przez zero - brak sprawdzenia, czy dzielnik != 0
  3. Niezainicjalizowana zmienna - uzycie zmiennej przed przypisaniem wartosci
  4. Zle wciecia - w Pythonie wciecia sa czescia skladni!
  5. Pomylenie = i == - przypisanie vs porownanie
  6. Nieskonczona petla - warunek petli while nigdy nie staje sie falszywy
Wskazowka: Po znalezieniu i naprawieniu bledu, usun instrukcje print() sluzace do debugowania. Zostawianie ich zasmaca wyjscie programu. Mozesz tez uzywac komentarzy, np. # print(f"DEBUG: ...") do tymczasowego wylaczenia.
✏️

Zadania

Latwe

Zadanie 1: Znajdz blad w kodzie

Ponizszy program ma obliczac srednia z listy liczb, ale zawiera blad. Znajdz go i napraw:

def srednia(lista):
    suma = 0
    for i in range(1, len(lista)):
        suma += lista[i]
    return suma / len(lista)
Pokaz rozwiazanie
# Blad: range zaczyna od 1, a powinien od 0!
# Przez to pomijamy pierwszy element listy.

def srednia(lista):
    suma = 0
    for i in range(0, len(lista)):  # POPRAWKA: start od 0
        suma += lista[i]
    return suma / len(lista)

# Lub jeszcze lepiej:
def srednia_v2(lista):
    return sum(lista) / len(lista)
Srednie

Zadanie 2: Napisz przypadki testowe

Dla ponizszej funkcji czy_parzysta(n) napisz co najmniej 6 przypadkow testowych obejmujacych dane typowe, brzegowe i specjalne:

def czy_parzysta(n):
    return n % 2 == 0
Pokaz rozwiazanie
def czy_parzysta(n):
    return n % 2 == 0

# Przypadki testowe:
print(czy_parzysta(4))    # True  - typowa parzysta
print(czy_parzysta(7))    # False - typowa nieparzysta
print(czy_parzysta(0))    # True  - brzegowa (zero)
print(czy_parzysta(1))    # False - brzegowa (jeden)
print(czy_parzysta(-2))   # True  - ujemna parzysta
print(czy_parzysta(-3))   # False - ujemna nieparzysta
print(czy_parzysta(1000000))  # True  - duza liczba
Srednie

Zadanie 3: Debugowanie funkcji maximum

Ponizszy program zawiera dwa bledy. Uzyj techniki print debugging, zidentyfikuj je i napraw:

def znajdz_max(lista):
    maks = 0
    for i in range(len(lista)):
        if lista[i] > maks:
            maks = i
    return maks
Pokaz rozwiazanie
# Blad 1: maks = 0 - co jesli wszystkie liczby sa ujemne?
# Blad 2: maks = i - zapisujemy indeks zamiast wartosci!

def znajdz_max(lista):
    maks = lista[0]  # POPRAWKA 1: inicjujemy pierwszym elementem
    for i in range(1, len(lista)):
        if lista[i] > maks:
            maks = lista[i]  # POPRAWKA 2: zapisujemy wartosc
    return maks

# Test
print(znajdz_max([3, 7, 2, 9, 1]))    # 9
print(znajdz_max([-5, -2, -8]))      # -2
Trudne

Zadanie 4: Testowanie funkcji z assert

Poznaj instrukcje assert - automatyczne sprawdzanie warunkow. Napisz funkcje potega(a, n) obliczajaca a^n (bez uzycia **) i przetestuj ja za pomoca assert.

Pokaz rozwiazanie
def potega(a, n):
    if n == 0:
        return 1
    wynik = 1
    for _ in range(abs(n)):
        wynik *= a
    if n < 0:
        return 1 / wynik
    return wynik

# Testy z assert
assert potega(2, 0) == 1,    "2^0 powinno byc 1"
assert potega(2, 1) == 2,    "2^1 powinno byc 2"
assert potega(2, 10) == 1024, "2^10 powinno byc 1024"
assert potega(5, 3) == 125,  "5^3 powinno byc 125"
assert potega(1, 100) == 1,  "1^100 powinno byc 1"
print("Wszystkie testy przeszly!")
🎥

Materialy wideo

Jak Zostać TESTEREM OPROGRAMOWANIA | Wybór Techniki Testowania | ▶strefakursow.pl◀ #tester
strefakursow.pl
Listy rozwijane || Excel #2
Info Cube
🎧

Podcasty

✔️

Quiz - sprawdz sie!

📜

Podstawa programowa

← Lekcja 13: Funkcje Lekcja 15: Powtorzenie i sprawdzian →