Asystent AI potrafi napisać działającą funkcję w kilka sekund — ale równie szybko potrafi napisać funkcję, która wygląda dobrze i jest błędna. Błędy bywają subtelne: dzielenie przez złą liczbę, zła wartość początkowa, pętla o jeden obrót za krótka. Jedyną skuteczną obroną są testy, w szczególności testy wartości brzegowych. Na lekcji uczniowie uruchamiają zestaw testów na trzech wymyślonych fragmentach „wygenerowanego” kodu, znajdują błędy i je poprawiają.
Scenariusz jest przeznaczony na 45 minut dla klasy znającej funkcje, listy i instrukcje if w Pythonie — na przykład po lekcji o testowaniu funkcji. Fragmenty kodu są wymyślone i nie pochodzą z konkretnego asystenta; ich błędy dobrano tak, by pokazać typowe pomyłki (nie wszystkie błędy AI wyglądają w ten sposób). Program uruchamia kod z tekstu poleceniem exec — rozwiązanie na lekcji, ale nie wolno w ten sposób uruchamiać nieznanego kodu pochodzącego z internetu lub od asystenta bez przeczytania go.
Przygotowanie stanowisk
Potrzebny jest Python 3 i edytor lub IDLE. Rozpakuj pakiet z sekcji materiałów do osobnego folderu i uruchamiaj skrypty z tego folderu. Program uruchomisz przez Run → Run Module albo poleceniem python start.py, python3 start.py lub py start.py.
Cele i plan lekcji
Po zajęciach uczeń potrafi:
- przeczytać kod wygenerowany przez asystenta krytycznie, zamiast zakładać, że działa;
- napisać testy, w tym wartości brzegowe (pusta lista, liczby ujemne, 1, kwadrat liczby pierwszej);
- zlokalizować błąd na podstawie nieprzechodzącego testu i go poprawić;
- sformułować zasady bezpiecznego korzystania z AI przy programowaniu.
| Czas | Praca na lekcji |
|---|---|
| 0–5 min | Problem: kod, który wygląda dobrze |
| 5–15 min | Typowe błędy i testy brzegowe |
| 15–22 min | Uruchamianie testów |
| 22–37 min | Trzy zadania |
| 37–42 min | Zasady korzystania z AI przy kodzie |
| 42–45 min | Pytania kontrolne |
Trzy fragmenty z błędami
| Funkcja | Błąd | Jak go wykryć |
|---|---|---|
srednia | dzieli przez len(lista) + 1 | test [2, 4, 6] → 4,0 (otrzymano 3,0) |
maksimum | wartość początkowa 0 | test na liczbach ujemnych: [-5, -2, -9] → −2 (otrzymano 0) |
czy_pierwsza | range(2, int(n ** 0.5)) pomija ostatni dzielnik; brak obsługi n < 2 | testy 9, 25 i 1 |
Testy brzegowe
Najwięcej błędów kryje się na granicach: pusta lista, jeden element, liczby ujemne, zero, najmniejsza dopuszczalna wartość (1), kwadraty liczb pierwszych (9, 25, 49). Dobry zestaw testów zawiera przypadek typowy i kilka brzegowych.
Procedura pracy z kodem od AI
- Przeczytaj kod — zrozum, co robi każda linia.
- Przetestuj na własnych danych, nie tylko na przykładzie z odpowiedzi.
- Napraw na podstawie nieprzechodzącego testu; popraw przyczynę, nie objaw.
- Nie uruchamiaj nieznanego kodu na ważnych danych i nie wklejaj do asystenta haseł ani danych osobowych.
- Sprawdź licencje i zasady szkoły dotyczące korzystania z AI.
Program
Funkcja uruchom wykonuje kod z tekstu (exec), pobiera funkcję o podanej nazwie i porównuje wyniki z oczekiwanymi. Zwraca listę niezaliczonych testów.
Zadania
Zadanie 1. Testy. Uruchom testy na trzech wygenerowanych fragmentach kodu i opisz, które testy nie przeszły oraz dlaczego.
Zadanie 2. Poprawki. Sprawdź poprawione wersje funkcji tym samym zestawem testów.
Zadanie 3. Nowy test. Sprawdź błędną funkcję czy_pierwsza dla liczby 49 i wyjaśnij wynik.
Dla chętnych: napisz test, który wykryłby, że srednia nie obsługuje pustej listy, i zdecyduj, co powinna zwracać.
Rozwiązanie i wyniki
# UWAGA: kod ponizej to WYMYSLONE "odpowiedzi asystenta" z celowo ukrytymi bledami - cwiczenie wykrywania usterek.
WYGENEROWANE = {
"srednia": """def srednia(lista):
return sum(lista) / (len(lista) + 1)
""",
"maksimum": """def maksimum(lista):
wynik = 0
for x in lista:
if x > wynik:
wynik = x
return wynik
""",
"czy_pierwsza": """def czy_pierwsza(n):
for d in range(2, int(n ** 0.5)):
if n % d == 0:
return False
return True
""",
}
POPRAWIONE = {
"srednia": """def srednia(lista):
return sum(lista) / len(lista)
""",
"maksimum": """def maksimum(lista):
wynik = lista[0]
for x in lista:
if x > wynik:
wynik = x
return wynik
""",
"czy_pierwsza": """def czy_pierwsza(n):
if n < 2:
return False
for d in range(2, int(n ** 0.5) + 1):
if n % d == 0:
return False
return True
""",
}
TESTY = {
"srednia": [([2, 4, 6], 4.0), ([5], 5.0)],
"maksimum": [([3, 9, 2], 9), ([-5, -2, -9], -2)],
"czy_pierwsza": [(2, True), (9, False), (25, False), (1, False), (13, True)],
}
def uruchom(nazwa, kod):
przestrzen = {}
exec(kod, przestrzen)
funkcja = przestrzen[nazwa]
niezaliczone = []
for argument, oczekiwane in TESTY[nazwa]:
wynik = funkcja(argument)
if wynik != oczekiwane:
niezaliczone.append((argument, oczekiwane, wynik))
return niezaliczone
# Zadanie 1: testy wygenerowanego kodu
for nazwa, kod in WYGENEROWANE.items():
bledy = uruchom(nazwa, kod)
print(nazwa, "-", "wszystkie testy OK" if not bledy else str(len(bledy)) + " z " + str(len(TESTY[nazwa])) + " testow nie przeszlo")
for argument, oczekiwane, wynik in bledy:
print(" dane", argument, "oczekiwano", oczekiwane, "otrzymano", wynik)
# Zadanie 2: poprawione wersje
for nazwa, kod in POPRAWIONE.items():
print(nazwa, "po poprawce:", "OK" if not uruchom(nazwa, kod) else "nadal bledy")
# Zadanie 3: dlaczego testy sa wazne - wlasny test dodatkowy
przestrzen = {}
exec(WYGENEROWANE["czy_pierwsza"], przestrzen)
print("czy_pierwsza(49) w kodzie z bledem:", przestrzen["czy_pierwsza"](49))
Program wypisze:
srednia - 2 z 2 testow nie przeszlo
dane [2, 4, 6] oczekiwano 4.0 otrzymano 3.0
dane [5] oczekiwano 5.0 otrzymano 2.5
maksimum - 1 z 2 testow nie przeszlo
dane [-5, -2, -9] oczekiwano -2 otrzymano 0
czy_pierwsza - 3 z 5 testow nie przeszlo
dane 9 oczekiwano False otrzymano True
dane 25 oczekiwano False otrzymano True
dane 1 oczekiwano False otrzymano True
srednia po poprawce: OK
maksimum po poprawce: OK
czy_pierwsza po poprawce: OK
czy_pierwsza(49) w kodzie z bledem: True
Funkcja srednia dzieli przez 4 zamiast 3, więc pierwszy test zwraca 3,0 zamiast 4,0 (drugi: 2,5 zamiast 5,0). maksimum zwraca 0 dla liczb ujemnych. czy_pierwsza uznaje za pierwsze liczby 9, 25 i 1, a także 49, bo pętla nie sprawdza dzielnika równego pierwiastkowi: dla 9 przechodzi tylko po d = 2. Plik rozszerzenie.py pokazuje różnicę zakresów range(2, 3) i range(2, 4) dla liczby 9.
Plik rozszerzenie.py (zadanie dla chętnych) wypisze:
3 [2] [2, 3]
Typowe błędy
| Objaw | Co sprawdzić |
|---|---|
| „Kod działa, bo przykład z odpowiedzi działał” | Przykład podany przez asystenta często omija przypadki brzegowe. |
| Testowanie tylko jednej wartości | Dodaj testy brzegowe i typowe. |
| Poprawianie testu zamiast kodu | Test opisuje oczekiwane zachowanie; zmieniaj kod. |
| Kopiowanie kodu bez czytania | Przeczytaj i zrozum każdą linię. |
Uruchamianie obcego kodu z exec na ważnych danych | Kod z nieznanego źródła mógłby zrobić szkody — czytaj przed uruchomieniem. |
| Przypisanie błędu „AI” zamiast sprawdzenia | Odpowiedzialność za działający kod ma autor programu. |
Pytania kontrolne i punktacja
- Dlaczego warto testować wartości brzegowe?
- Dlaczego nie wystarczy sprawdzić przykładu z odpowiedzi asystenta?
- Co zrobisz, gdy test nie przejdzie?
Odpowiedzi: Bo błędy najczęściej pojawiają się na granicach zakresów (puste dane, zero, wartości ujemne, najmniejsze i największe wartości). Bo przykład zwykle obejmuje tylko przypadek typowy, a nie sprawdza zachowania na brzegach. Znajdę przyczynę w kodzie, poprawię ją i uruchomię ponownie wszystkie testy.
Proponowana punktacja (razem 10 punktów): zadanie 1 — trzy analizy błędów 3 pkt; zadanie 2 — poprawione funkcje 2 pkt; zadanie 3 — wyjaśnienie 49 2 pkt; zasady pracy z kodem od AI 3 pkt. Zadanie dla chętnych nie jest wymagane do pełnej oceny.
Materiały do pobrania
Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.
Co dalej?
Następny krok to pisanie własnych testów, debugowanie i dokumentowanie kodu. Ten materiał rozwija dział o odpowiedzialnym korzystaniu z AI w kursie AI w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.
Źródła techniczne: testowanie oprogramowania w Wikipedii oraz dokumentacja Pythona o exec. Zobacz też lekcję o halucynacjach AI.
Poprowadź kolejne lekcje AI
Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.
Kup dostęp do kursu AI →