← Artykuły

Testy graniczne w Javie: dlaczego zielony test nie wystarcza

Mała funkcja, dwa przypadki i błąd, którego zielony test może nie wykryć.

Podkreślone pojęcia mają objaśnienia. Kod możesz skopiować i uruchomić u siebie.

Spis treści i pojęcia

Pojęcia pod ręką

Kliknij termin, aby zobaczyć definicję.

Cały słownik →

Zielony test może nie zauważyć błędu

Wydarzenie ma dziesięć miejsc, z czego trzy są zarezerwowane. Pozostało siedem. Test tylko dla tego wejścia nie wykryje implementacji, która błędnie zwraca co najmniej jedno wolne miejsce, nawet gdy wszystkie są zajęte.

Przewidź przed uruchomieniem

Zapisz kompletny przykład jako Seats.java. Z 25 uruchom java Seats.java. Nie potrzebujesz frameworka, bazy ani zależności.

java
public class Seats {
    static int available(int capacity, int reserved) {
        if (capacity < 0 || reserved < 0 || reserved > capacity) {
            throw new IllegalArgumentException("Invalid counts");
        }
        return capacity - reserved;
    }
    static void equal(int expected, int actual) {
        if (expected != actual) throw new AssertionError(expected + " != " + actual);
    }
    public static void main(String[] args) {
        equal(7, available(10, 3));
        equal(0, available(3, 3));
        System.out.println("PASS: ordinary and full-capacity cases");
    }
}

Wynik to PASS: ordinary and full-capacity cases. Parametry są wejściem , a return przekazuje obliczoną wartość. equal zgłasza błąd, gdy wynik różni się od oczekiwania. Nie potrzeba flagi -ea: przykład jawnie rzuca zamiast używać słowa assert .

Niech test wykryje pomyłkę

Zastąp wyrażenie po return przez Math.max(1, capacity - reserved). Przykład dziesięciu miejsc nadal zwraca siedem. Przypadek pełnego wydarzenia rzuca teraz AssertionError: oczekiwał zera, dostał jeden. Przywróć odejmowanie.

Test jest przydatny, gdy odróżnia regułę od wiarygodnej pomyłki. Nie mierzymy jego wartości liczbą zielonych linii.

Twoja próba

Przed uruchomieniem przewidź available(0, 0) i dopisz oczekiwanie. Następnie osobno wywołaj available(3, 4): ma odrzucić wejście. Zwrócenie zera ukrywałoby błąd danych.

Jutro napisz tę samą regułę dla nieprzeczytanych stron książki bez zaglądania tutaj. Które wejście odróżnia „nic nie pozostało” od „dane są niepoprawne”?

Czego ta próba nie dowodzi

Policzenie miejsc nie rezerwuje miejsca. Dwaj klienci mogą zobaczyć ten sam wynik. Późniejszy zapis w bazie wymaga własnej i ochrony przed konfliktem. Zacznij od funkcji, a potem poznaj tę granicę.

Źródła

SPRAWDŹ SWOJĄ INTUICJĘ

Który przypadek odróżnia poprawne odejmowanie od minimum jednego miejsca?

TERAZ TWÓJ KOD

Zrozumienie sprawdź w praktyce.

Otwórz pilot Java: własny plik, test i zadanie z liczeniem wolnych miejsc.

Otwórz materiał i ćwiczenia →