Przypadki testowe pola tekstowego
Pole tekstowe testuje się wartościami, które naprawdę w nie trafią, a nie tylko tą, pod którą zaprojektowano formularz. Oto przypadki testowe, każdy z prawdziwą wartością i tym, co zwykle psuje.
Czym testować pole tekstowe?
Tym, co naprawdę wpisują w nie ludzie i co trafia do niego z danych, a nie tylko imieniem, pod które zaprojektowano formularz: niczym, spacjami, których nikt nie widzi, wartością na limicie długości i o jeden znak dłuższą, literami spoza ASCII, liczbami i datami zapisanymi inaczej, słowami, które parser czyta jako coś innego, i znakami, które sprawiają kłopot dopiero w eksporcie. Sekcje niżej biorą je po kolei. Każda wartość pochodzi z katalogu, mówi, co zwykle psuje, i prowadzi do tego, co zamiast tego robi poprawna aplikacja.
Co sprawdzić po każdej wartości?
Za każdym razem tych samych pięć rzeczy:
- Czy zapisała się tak, jak ją wpisano? Otwórz rekord jeszcze raz i porównaj.
- Czy przeglądarka i serwer się zgadzają? Wartość, którą formularz przyjmuje, a serwer odrzuca, albo odwrotnie, to jedno z najczęstszych znalezisk.
- Czy komunikat nazywa problem? „Niepoprawne dane” przy wartości o jeden znak za długiej to osobny błąd.
- Czy przeżywa drogę w obie strony? Wyszukaj ją, edytuj, zobacz na liście.
- Czy przeżywa eksport? Otwórz plik CSV albo arkusz, który tworzy aplikacja.
Puste pole, spacje i znaki niewidoczne
Sprawdź granicę między pustym a wypełnionym. Pole, które przycina spacje po jednej stronie, a po drugiej nie, kończy z wartością pustą dla jednej warstwy i wypełnioną dla następnej.
Przeglądarka uznaje pole za wypełnione, a serwer za puste, albo odwrotnie.
whitespace/space-onlyPole wygląda na puste, ale nie jest: walidacja pola wymaganego przechodzi, a rekord nie ma użytecznej nazwy.
whitespace/zwsp-only KowalskiSortowanie stawia rekord na początku każdej listy, a wyszukiwanie dokładnego dopasowania nigdy go nie znajduje.
whitespace/leading-space KowalskiPrzeglądarka i serwer różnie porównują login i adres e-mail. Konto zostaje założone, ale nie da się go znaleźć.
whitespace/trailing-spaceDługość i limity
Sprawdź jeden znak poniżej limitu, sam limit i jeden znak ponad, a potem wartość daleko za nim. Sprawdź też, czy limit liczy znaki, czy bajty: w UTF-8 litera spoza ASCII to jeden znak i co najmniej dwa bajty.
Klasyczna szerokość kolumny: jeden znak poniżej limitu, dokładnie na limicie i jeden ponad to trzy różne ścieżki w kodzie.
length-bombs/len-255 256 × aJeden znak ponad klasyczny limit, czyli miejsce, w którym zwykle dochodzi do cichego obcięcia.
length-bombs/len-256 128 × ą128 znaków, ale 256 bajtów: pole z limitem w bajtach odrzuca wartość, którą interfejs uznał za poprawną.
length-bombs/bytes-vs-chars 65 535 × aLimit najczęstszego typu kolumny tekstowej. Jego przekroczenie zwykle kończy się surowym błędem bazy danych.
length-bombs/len-65535Litery spoza ASCII i Unicode
Sprawdź litery, które Twoi użytkownicy mają w imionach i nazwiskach, i znaki, które zmieniają sposób liczenia, porównywania albo rysowania tekstu.
Kodowanie węższe niż pełny zestaw znaków zamienia je na znaki zapytania i nazwisko psuje się przy zapisie.
locale-pl/diacritics-full éTa sama litera zapisana jako litera bazowa ze znakiem łączącym porównuje się jako różna od postaci jednoznakowej.
unicode-text/combining-acute Jan😀KowalskiZnak spoza podstawowej płaszczyzny w polu imienia przekracza limity długości w bajtach i psuje bazy danych skonfigurowane na wąskie kodowania.
unicode-text/emoji-in-name raporttxt.exeZnak wymuszający kierunek sprawia, że tekst wyświetla się odwrócony: użytkownik widzi inną wartość niż zapisana.
unicode-text/rtl-overrideSłowa, które parser czyta jako coś innego
Sprawdź słowa, które dla programu gdzieś między polem a bazą danych znaczą „brak wartości”, „fałsz” albo „to nie liczba”.
Serializatory i słabo typowane interfejsy zamieniają ten tekst na brak wartości. Pole wygląda na zapisane, a wraca puste.
magic-values/word-null noYAML 1.1 i kilka parserów konfiguracji czyta słowo no bez cudzysłowu jako logiczne false - a NO to kod kraju Norwegii.
magic-values/bool-no NaNParsery liczb je przyjmują, a potem każde porównanie z nim daje fałsz - filtry i sortowanie po cichu gubią wiersz.
magic-values/word-nan undefinedCzęsto jest skutkiem błędu gdzie indziej, więc prawdziwej wartości o tej pisowni nie da się odróżnić od usterki.
magic-values/word-undefinedLiczby
Sprawdź granice typu liczbowego, wartość ujemną tam, gdzie nikt jej nie przewidział, i liczby zapisane tak, jak zapisuje się je w innym kraju.
Pola ilości, ceny i liczby sztuk, które nigdy nie spodziewały się wartości ujemnej. Często ją przyjmują, a wychodzi to dopiero przy fakturowaniu.
numbers-extreme/minus-one 3,14Separator dziesiętny używany w większości Europy. Parsery oczekujące kropki czytają go jako separator tysięcy albo go odrzucają.
numbers-extreme/comma-decimal 2147483648Jeden ponad najczęstszy limit liczb całkowitych - tu liczniki, identyfikatory i ilości przekręcają się na liczbę ujemną.
numbers-extreme/int32-max-plus-one 9007199254740992Powyżej tej wartości przeglądarki i wiele interfejsów przestaje dokładnie przedstawiać liczby całkowite, więc identyfikator zwrócony przez serwer nie zgadza się z tym, co widzi użytkownik.
numbers-extreme/js-safe-plus-oneDaty
Sprawdź daty, które nie istnieją, daty, które da się odczytać na dwa sposoby, i lata spoza zwykłego zakresu.
Data, która nie może istnieć. Naiwne parsery przesuwają ją na drugiego marca, zamiast ją odrzucić.
dates-impossible/feb-30 29.02.2026Poprawna w jednych latach, a w innych nie, więc te same dane są poprawne albo błędne zależnie od pola roku obok.
dates-impossible/feb-29-non-leap 03/04/2026Ten sam tekst oznacza marzec albo kwiecień zależnie od konwencji, a nic na ekranie nie mówi, którą przyjęto.
dates-impossible/ambiguous-day-month 01.01.10000Lata pięciocyfrowe psują parsowanie o stałej szerokości i formaty kolumn, nie dając oczywistego błędu.
dates-impossible/year-10000Wartości, które psują dopiero eksport
Sprawdź, co dzieje się za formularzem. Wartość, która przechodzi walidację, wciąż może zepsuć plik, który eksportuje aplikacja, i arkusz tego, kto go otworzy.
Wartość zaczynającą się od znaku równości arkusz kalkulacyjny traktuje jak formułę. Wyeksportowany plik pokazuje wynik obliczenia zamiast danych.
export-breakers/formula-equals Kowalski,JanPrzecinek w wartości dzieli jedną kolumnę na dwie, chyba że na każdym etapie eksportu wartość jest poprawnie ujęta w cudzysłów.
export-breakers/csv-comma 007Kody tracą zera wiodące w chwili, gdy arkusz uzna kolumnę za liczbową.
export-breakers/leading-zero-code 1234567890123456789Arkusze kalkulacyjne zachowują około piętnastu cyfr znaczących, więc długie identyfikatory wracają zaokrąglone i w zapisie wykładniczym.
export-breakers/sheet-precisionNazwy plików
Pole, którego wartość staje się nazwą pliku, sprawdź nazwami, które system plików odrzuca albo czyta inaczej.
Nazwa urządzenia zarezerwowana przez jeden z systemów operacyjnych. Pliku o tej nazwie nie da się utworzyć, a błąd często wychodzi jako ogólny komunikat.
filenames-paths/reserved-con report.Niektóre systemy plików po cichu usuwają kropki na końcu, więc zapisana nazwa różni się od żądanej.
filenames-paths/trailing-dot report.txt.exeInterfejsy, które ukrywają znane rozszerzenia, pokazują to jako report.txt, więc użytkownik widzi dokument, a dostaje program.
filenames-paths/double-extension ..Dwie kropki to katalog nadrzędny - najkrótszy możliwy test wyjścia poza katalog (path traversal).
filenames-paths/dotdotJak szybko przejść przez wszystkie?
Paletą, jeden skrót na wartość: kliknij pole, naciśnij AltShiftN , zobacz wynik i naciśnij znowu, żeby wpisać następną. Gdy wartość coś zepsuje, AltShiftB kopiuje blok do zgłoszenia. Pierwsze kroki zajmują mniej więcej dwie minuty.
Do testu automatycznego nkb emit wypisuje każdą paczkę jako JSON, CSV albo jedną wartość na wiersz:
$ nkb emit length-bombs --format json > length-bombs.json
Cały katalog (paczki: 9, wartości: 102) pokazuje strona paczek.