Testy aplikacji na egzaminie INF.04: przypadki testowe, dane graniczne i testy jednostkowe
Oprogramowanie: Windows 10, Visual Studio Community 2022 (MSTest), Python 3.14
Co arkusze INF.04 nazywają testem, jak dobrać dane poprawne, graniczne i błędne oraz jak napisać i uruchomić testy jednostkowe w C#, Pythonie i Javie.
Testowanie jest w nazwie kwalifikacji INF.04 i w pięciu arkuszach z lat 2022-2026 stanowi cały rezultat oceny. Arkusze rozumieją przez test różne rzeczy: wywołania w programie głównym, test w osobnym pliku albo testy jednostkowe z biblioteką testową - a klucz sprawdza, czy test naprawdę wywołuje Twoją funkcję i ma poprawne dane.
Wymagania pochodzą z 21 arkuszy INF.04 z lat 2021-2026 i ich kluczy oceniania. Przykład - program rzucający od 3 do 10 kośćmi - pokazano w Visual Studio 2022 (MSTest) na Windows 10, a testy w C#, Pythonie (unittest) i Javie (JUnit 5) zostały uruchomione. Zakres 3-10 kości pochodzi z arkusza INF.04-01-24.06-SG, a kod napisano na potrzeby tutorialu.
Egzaminy ZawodoweINF.04
Jak korzystać z tutoriala
Suwak i strzałki obok niego - albo ←→ na klawiaturze - przechodzą krok po kroku; wyjaśnienie i podgląd zmieniają się razem z krokiem.
Lista „Etap” przenosi od razu do wybranego etapu.
„Tryb prezentacji” pokazuje same kroki, bez menu strony - na rzutnik.
Etap 1: Co wymagają arkusze
Kroki 1-2
Krok 1: Trzy rodzaje testów w arkuszach INF.04
ok. 3 min
Słowo „test” znaczy w arkuszach INF.04 trzy różne rzeczy:
test w programie głównym - wywołanie funkcji lub metod klasy i wypisanie wyniku w konsoli. Tak jest w INF.04-02-22.06-SG (kolejne konstruktory klasy i licznik obiektów), INF.04-03-23.06-SG (test metod set, get i inkrementacji „przed i po”), INF.04-02-24.01-SG („przetestować obie metody”), INF.04-02-25.01-SG („z wartościami poprawnymi i niepoprawnymi”) i INF.04-02-26.01-SG (próba utworzenia obiektu, która ma się nie skompilować),
test w osobnym pliku - INF.04-02-23.06-SG: fragment programu głównego sprawdzający sortowanie liczb pseudolosowych z przedziału 0..1000, zapisany w folderze testy w pliku test „z rozszerzeniem charakterystycznym” dla języka i udokumentowany zrzutem konsola_testy.jpg,
testy jednostkowe z biblioteką testową - INF.04-02-25.06-SG (szyfr Cezara, 5 przypadków z tabeli) i INF.04-01-26.01-SG (rzut kością, 2 przypadki).
W INF.04-02-22.06-SG, INF.04-02-23.06-SG, INF.04-02-25.06-SG, INF.04-01-26.01-SG i INF.04-02-26.01-SG testy są osobnym, czwartym rezultatem oceny.
Krok 2: Testy jednostkowe: polecenia z arkuszy
ok. 2 min
Arkusze INF.04-02-25.06-SG i INF.04-01-26.01-SG stawiają te same warunki:
biblioteka do testów jednostkowych dostępna na stanowisku, dla języka, w którym napisano aplikację konsolową,
nazwy metod testujących „wyrażają cel danego testu” i są zapisane „zgodnie z konwencją nazewnictwa w danym języku programowania”,
każdy przypadek testowy - oddzielną metodą, sprawdzaną asercją,
metody testujące w oddzielnym pliku, „w lokalizacji zgodnej z wymaganiami” języka i biblioteki (INF.04-02-25.06-SG),
uruchom wszystkie metody i zrób zrzuty test1.png, test2.png... w folderze testy, z widocznymi wynikami, całym ekranem, paskiem zadań i środowiskiem programistycznym.
INF.04-02-25.06-SG dodaje: „Jeżeli metoda szyfrująca została napisana w części I niepoprawnie, testy powinny wykazać błędy. W tej części egzaminu ocenie podlegać będzie zapis i uruchomienie testu, a nie metoda szyfrująca”.
Typowe błędy
Klucz INF.04-02-25.06-SG: „Wyniki testów muszą odzwierciedlać rzeczywisty stan - jeżeli funkcja źle działa dla danego testu, jest on zakończony niepowodzeniem” oraz „W kodzie należy sprawdzić, czy test rzeczywiście odwołuje się do funkcji szyfrującej”. Test, który porównuje stałą ze stałą albo zawsze przechodzi, nie dostanie punktów. Czerwony wynik testu przy błędnej funkcji nie odbiera punktów za testy.
Etap 2: Dobór danych testowych
Kroki 3-5
Krok 3: Przypadek testowy: cel, dane, oczekiwany wynik
ok. 3 min
Przypadek testowy to trzy rzeczy: co sprawdzasz, z jakimi danymi i jaki wynik jest poprawny. Tak zbudowana jest tabela 4 z INF.04-02-25.06-SG („Scenariusz testowania z przypadkami testowymi”):
Nr
Cel testu
Tekst jawny
Klucz
Oczekiwana wartość
1
Dane podstawowe (klucz dodatni, mniejszy od długości alfabetu)
abc
3
def
2
„Zawijanie” (litery i klucz wychodzą poza alfabet)
xyz
3
abc
3
Odszyfrowanie (klucz ujemny)
def
-3
abc
4
Klucz większy niż długość alfabetu
abc
29
def
5
Spacja w tekście
ab cd
2
cd ef
Klucz oceny ma po jednym kryterium na każdy z tych pięciu testów (R.4.3-R.4.7), np. „Zapisany test jednostkowy 2, który przy danych wejściowych xyz, 3 oczekuje wyniku abc”. Dane i wynik przepisz z tabeli bez zmian.
Krok 4: Dane poprawne, graniczne i błędne
ok. 3 min
Gdy arkusz nie podaje tabeli, dobierz dane sam - z trzech grup. Przykład: funkcja sprawdzająca liczbę kości, która ma być z zakresu 3-10:
poprawne, typowe - wartość ze środka zakresu, np. 5,
graniczne - same granice (3 i 10) i wartości tuż za nimi (2 i 11). Tu najczęściej siedzą błędy, np. > zamiast >=,
błędne - wartości bez sensu dla programu: 0, liczba ujemna, tekst zamiast liczby.
Tak samo myśli egzaminator: klucz INF.04-01-24.06-SG każe sprawdzić pętlę pytającą o liczbę kostek „dla granicznych: 2 i 11 oraz 3 i 10”. Arkusz INF.04-02-25.06-SG chce zrzutów „dla różnych wartości klucza (0, ujemna, dodatnia)”, a INF.04-02-25.01-SG - testu „z wartościami poprawnymi i niepoprawnymi”.
Typowe błędy
Jeden test „na szczęśliwą ścieżkę” (np. tylko 5) przejdzie także przy funkcji z błędem na granicy. Sprawdź obie granice i po jednej wartości tuż za nimi.
Krok 5: Opis przypadków testowych dla przykładu
ok. 3 min
Zanim napiszesz kod testów, rozpisz przypadki tak jak w tabeli z arkusza - to plan, z którego od razu wynikają nazwy metod testujących:
Nr
Cel testu
Dane wejściowe
Oczekiwany wynik
Metoda testująca
1
Wartość ze środka zakresu
5
true
LiczbaWSrodkuZakresuJestPoprawna
2
Dolna granica
3
true
DolnaGranicaTrzyJestPoprawna
3
Górna granica
10
true
GornaGranicaDziesiecJestPoprawna
4
Tuż poniżej zakresu
2
false
DwaPonizejZakresuJestNiepoprawne
5
Tuż powyżej zakresu
11
false
JedenasciePowyzejZakresuJestNiepoprawne
6
Suma oczek
2, 3, 4
9
SumaTrzechKosci
7
Rzut w zakresie 1-6
1000 rzutów
każdy 1..6
KazdyRzutJestZZakresuJedenDoSzesciu
Arkusze nie każą zapisywać takiej tabeli w pliku egzamin - podają ją same (INF.04-02-25.06-SG) albo wymieniają przypadki w punktach (INF.04-01-26.01-SG). Rozpisanie przypadków na brudno pilnuje, żeby żadnego nie pominąć.
Etap 3: Test w programie głównym
Kroki 6-7
Krok 6: Test w programie głównym: sprawdzenie w konsoli
ok. 2 min
Program z przykładu pyta o liczbę kości tak długo, aż dostanie liczbę z zakresu 3-10. Uruchom go i wpisz dane z każdej grupy: 2 (tuż poniżej), 11 (tuż powyżej), abc (tekst) i na końcu 10 (granica). Program trzy razy ponawia pytanie, a po 10 rzuca dziesięcioma kośćmi i podaje sumę.
Ten zrzut dokumentuje „interakcje”, o które pytają arkusze - tu konsola z Visual Studio w tle. Arkusze z testem w programie głównym (np. INF.04-03-23.06-SG) oceniają właśnie wynik widoczny na ekranie: „wyświetlona jest wartość pola przed i po zastosowaniu metody”.
Zrzut ekranu po tym kroku
Krok 7: Kod testu w programie głównym
ok. 2 min
Test w programie głównym to wywołanie i czytelny komunikat z wynikiem. Wzór „przed i po”, którego wymaga INF.04-03-23.06-SG, w przykładzie z kośćmi:
int[] wyniki = { 2, 3, 4 };
Console.WriteLine("Test sumy: oczekiwano 9, otrzymano " + RzutKoscmi.Suma(wyniki));
Console.WriteLine("Test granicy 3: " + RzutKoscmi.CzyPoprawnaLiczbaKosci(3));
Console.WriteLine("Test liczby 11: " + RzutKoscmi.CzyPoprawnaLiczbaKosci(11));
Komunikat mówi, co jest sprawdzane i jaki wynik wyszedł - kryterium „komunikacja z użytkownikiem prowadzona jest w sposób zrozumiały” (R.1.7) dotyczy też testów.
Typowe błędy
W INF.04-02-23.06-SG test jest zapisany w osobnym pliku o nazwie test z rozszerzeniem języka (test.cs, test.java, test.py, test.cpp) w folderze testy, a zrzut ma nazwę konsola_testy.jpg. Nazwy przepisz z arkusza.
Etap 4: Testy jednostkowe w Visual Studio
Kroki 8-12
Krok 8: Nowy projekt testów MSTest
ok. 2 min
W Visual Studio testy jednostkowe C# są osobnym projektem w tym samym rozwiązaniu. Kliknij rozwiązanie prawym przyciskiem w Eksploratorze rozwiązań, wybierz Dodaj → Nowy projekt…, wpisz w wyszukiwarce MSTest i wybierz szablon projektu testowego MSTest dla C#. Nazwij projekt np. KosciTesty.
Zrzut ekranu po tym kroku
Krok 9: Odwołanie do projektu aplikacji
ok. 2 min
W projekcie testów kliknij prawym przyciskiem Dodaj → Odwołanie do projektu… i zaznacz projekt aplikacji konsolowej - bez tego testy nie widzą jej klas. Na zrzucie rozwiązanie z dwoma projektami: Kosci (aplikacja) i KosciTesty (testy), otwarty plik RzutKoscmiTesty.cs z metodami testującymi.
Typowe błędy
Klasa i metody, które testujesz, muszą być dostępne z innego projektu: public static class RzutKoscmi i public static bool CzyPoprawnaLiczbaKosci(...). Przy domyślnym dostępie projekt testów zgłosi błąd kompilacji.
Zrzut ekranu po tym kroku
Krok 10: Metody testujące: jedna metoda, jeden przypadek
ok. 3 min
Każdy wiersz tabeli przypadków to jedna metoda z atrybutem [TestMethod] i jedną asercją:
using Kosci;
namespace KosciTesty
{
[TestClass]
public sealed class RzutKoscmiTesty
{
[TestMethod]
public void DolnaGranicaTrzyJestPoprawna()
{
Assert.IsTrue(RzutKoscmi.CzyPoprawnaLiczbaKosci(3));
}
[TestMethod]
public void DwaPonizejZakresuJestNiepoprawne()
{
Assert.IsFalse(RzutKoscmi.CzyPoprawnaLiczbaKosci(2));
}
[TestMethod]
public void SumaTrzechKosci()
{
Assert.AreEqual(9, RzutKoscmi.Suma(new int[] { 2, 3, 4 }));
}
}
}
Assert.AreEqual(oczekiwana, otrzymana) porównuje wartość oczekiwaną z wartością zwróconą przez funkcję - dokładnie to, czego wymaga kryterium „metoda testująca porównuje wartość oczekiwaną z wartością zwracaną”. Nazwy w stylu PascalCase to konwencja C#.
Krok 11: Uruchom testy: błąd na granicy
ok. 2 min
Wybierz Test → Uruchom wszystkie testy (skrót Ctrl+R, A). Wyniki pokazuje Eksplorator testów.
Na zrzucie funkcja ma celowo wprowadzony błąd: liczba > 3 zamiast liczba >= 3. Test DolnaGranicaTrzyJestPoprawna jest czerwony, a w szczegółach widać, która asercja zawiodła. Pozostałe testy przechodzą - błąd wyłapał tylko test na granicy.
Typowe błędy
Nie poprawiaj testu tak, żeby „przeszedł” przy złej funkcji. Na egzaminie czerwony test przy błędnej funkcji jest dowodem, że test działa - klucz ocenia zapis i uruchomienie testu.
Zrzut ekranu po tym kroku
Krok 12: Wszystkie testy zaliczone i zrzut test1
ok. 2 min
Po poprawce liczba >= 3 wszystkie testy są zielone. Zrób zrzut całego ekranu z Eksploratorem testów, kodem i paskiem zadań (Win+PrtScn) i zapisz go jako test1.png w folderze testy. Przy wielu testach rozwiń listę tak, żeby była widoczna każda metoda - albo zrób kolejne zrzuty test2.png, test3.png.
Zrzut ekranu po tym kroku
Etap 5: Inne języki
Kroki 13-14
Krok 13: Python: unittest
ok. 3 min
W Pythonie biblioteka unittest jest wbudowana. Testy zapisz w osobnym pliku, np. test_kosci.py, obok pliku z funkcjami:
import unittest
from kosci import czy_poprawna_liczba_kosci, suma, rzuc
class TestKosci(unittest.TestCase):
def test_liczba_w_srodku_zakresu_jest_poprawna(self):
self.assertTrue(czy_poprawna_liczba_kosci(5))
def test_dolna_granica_trzy_jest_poprawna(self):
self.assertTrue(czy_poprawna_liczba_kosci(3))
def test_dwa_ponizej_zakresu_jest_niepoprawne(self):
self.assertFalse(czy_poprawna_liczba_kosci(2))
def test_suma_trzech_kosci(self):
self.assertEqual(9, suma([2, 3, 4]))
def test_kazdy_rzut_jest_z_zakresu_1_do_6(self):
for wynik in rzuc(1000):
self.assertTrue(1 <= wynik <= 6)
if __name__ == "__main__":
unittest.main()
Nazwy metod zaczynają się od test_ - po tym unittest je rozpoznaje - i są pisane małymi literami z podkreślnikami, zgodnie z konwencją Pythona. Uruchomienie: python -m unittest -v w folderze projektu albo uruchomienie pliku z testami w środowisku programistycznym.
Zrzut ekranu po tym kroku
Krok 14: Java (JUnit 5) i C++
ok. 2 min
W Javie typowa jest biblioteka JUnit 5 - metoda testująca ma adnotację @Test, a asercje pochodzą z klasy Assertions:
Nazwy metod w Javie zapisuje się w stylu camelCase. W C++ Visual Studio z obsługą C++ ma szablon projektu testów natywnych (Native Unit Test Project, biblioteka Microsoft C++ Unit Test Framework) - metody w makrze TEST_METHOD i asercje Assert::IsTrue, Assert::AreEqual. Użyj tej biblioteki, którą masz na stanowisku egzaminacyjnym.
Etap 6: Oddanie
Krok 15
Krok 15: Folder testy: co do niego trafia
ok. 2 min
Arkusze z testami jednostkowymi wymagają w folderze testy:
archiwum całego projektu z testami (INF.04-02-25.06-SG: „Utwórz archiwum ZIP zawierające cały projekt”),
pliki z metodami testującymi - skopiowane poza archiwum, żeby egzaminator mógł je przeczytać bez rozpakowywania,
zrzutytest1.png, test2.png...
W tych dwóch arkuszach nie ma folderu dokumentacja, więc plik egzamin zapisuje się bezpośrednio w folderze z numerem zdającego.
Typowe błędy
Testy w C# i Javie są często osobnym projektem albo osobnym folderem - spakuj całe rozwiązanie razem z projektem testów, a nie sam projekt aplikacji. Plik z testami bez archiwum albo archiwum bez pliku z testami to niekompletne oddanie.