Partycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach

  1. Strona główna
  2. Blog
  3. Testowanie oprogramowania

Testowanie oprogramowania

Podział równoważny: Technika projektowania testów wyjaśniona na praktycznych przykładach

Nie można przetestować wszystkich możliwych danych wejściowych, więc jakie wartości wybrać? Podział równoważności daje jasną odpowiedź. Poznaj metodę krok po kroku, przepracuj prawdziwe przykłady i zobacz, gdzie potrzebuje pomocy.

8 min czytania
Technika projektowania testów z podziałem równoważności wyjaśniona na praktycznych przykładach

Najważniejsze

  • Podział równoważny dzieli dane wejściowe na grupy, które powinny zachowywać się w ten sam sposób.
  • Testujesz jedną reprezentatywną wartość z każdej grupy, a nie każdą wartość.
  • Zawsze dołączaj nieprawidłowe partycje, ponieważ w obsłudze błędów kryje się wiele błędów.
  • Najlepiej sprawdza się w połączeniu z analizą wartości brzegowych, ponieważ błędy często znajdują się na obrzeżach grupy.

Pole wieku, które akceptuje przedział od 18 do 60 lat, zawiera ogromną liczbę możliwych danych wejściowych, jeśli policzysz wartości ujemne, ogromne liczby, tekst i spacje. Nikt nie jest w stanie wypróbować ich wszystkich. Podział równoważności rozwiązuje ten problem, grupując dane wejściowe, które oprogramowanie powinno traktować w ten sam sposób, a następnie testując jedną wartość z każdej grupy.

Jest to jedna z pierwszych technik projektowania testów, której powinien nauczyć się każdy tester. W tym przewodniku omówimy to krok po kroku i przetestujemy jeden przykład w Pythonie. Uruchomiliśmy ten kod w Pythonie 3.13 i uwzględniliśmy jego dane wyjściowe. Poniższe zasady dotyczące haseł i kuponów są przykładami ilustracyjnymi i nie pochodzą z prawdziwego systemu.

Co to jest podział równoważności?

Partycjonowanie równoważne, zwane także partycjonowaniem klas równoważności (ECP), to technika projektowania testów czarnej skrzynki. Dzieli możliwe dane wejściowe funkcji na podziały, czyli klasy. Oczekuje się, że każda wartość wewnątrz partycji będzie powodować takie samo zachowanie.

Ponieważ nie musisz widzieć kodu, możesz zastosować go bezpośrednio z wymagania. Aby dowiedzieć się więcej na temat tego stylu testowania, przeczytaj artykuł testowanie czarnej skrzynki i białej skrzynki.

Dlaczego to działa

Technika opiera się na jednym założeniu: jeśli jedna wartość w partycji znajdzie błąd, inne w tej partycji prawdopodobnie też go znajdą. A jeśli jedna wartość przejdzie, inne prawdopodobnie też przejdą. Testowanie 25, 26 i 27 lat w grupie wiekowej dorosłych prawdopodobnie nie powie Ci niczego, czego nie dałoby samo badanie 25 lat.

Podejście Testy dla pola wieku Wynik
Wyczerpujące Każda możliwa wartość Niemożliwe w praktyce
Losowe zgadywanie Cokolwiek przyjdzie Ci do głowy Duplikaty i luki
Podział równoważny Jeden na partycję Mały, z celowym zakryciem

Jest to jednak założenie, a nie gwarancja. Oprogramowanie może mieć specjalne przypadki ukryte w partycji, do tego ograniczenia wrócimy później.

Jak to zrobić w pięciu krokach

  1. Przeczytaj wymagania i określ dane wejściowe oraz ich reguły.
  2. Znajdź prawidłowe partycje, czyli grupy wartości, które powinny zostać zaakceptowane, i zanotuj, czy różne zakresy zachowują się inaczej.
  3. Znajdź nieprawidłowe partycje, łącznie z wartościami zbyt niskimi, zbyt wysokimi, niewłaściwym typem i pustymi miejscami.
  4. Wybierz jedną reprezentatywną wartość z każdej partycji, zwykle gdzieś pośrodku.
  5. Zapisz oczekiwany wynik dla każdego, tak jak w każdym dobrym przypadku testowym.

Sprawdzony przykład: pole wieku

Wymóg: Rejestrować mogą się użytkownicy w wieku od 18 do 60 lat.

Partycja Wpisz Wartość testowa Oczekiwany wynik
Poniżej 18 Nieprawidłowe 10 Odrzucony
18 do 60 Ważne 35 Zaakceptowano
Powyżej 60 Nieprawidłowe 75 Odrzucony
Nie liczba Nieprawidłowe „abc” Błąd
Puste Nieprawidłowe (empty) Wiadomość „Wymagane”.

Pięć testów obejmuje każde zachowanie zawarte w wymaganiu. Wiele samouczków zatrzymuje się na pierwszych trzech wierszach, ale dwa ostatnie to te, które prawdziwi użytkownicy uruchamiają przypadkowo. Możesz także dodać wiersze dla liczb ujemnych lub dziesiętnych, jeśli można je rozsądnie obsłużyć inaczej.

Testowanie tego w kodzie

Oto ta reguła jako funkcja, z jednym testem jednostkowym na partycję, przy użyciu wbudowanego Pythona unittest:

import unittest

def can_register(age):
    if not isinstance(age, int) or isinstance(age, bool):
        raise TypeError("age must be a whole number")
    return 18 <= age <= 60

class EquivalenceTests(unittest.TestCase):
    def test_valid_partition(self):
        self.assertTrue(can_register(35))

    def test_too_young_partition(self):
        self.assertFalse(can_register(10))

    def test_too_old_partition(self):
        self.assertFalse(can_register(75))

    def test_wrong_type_partition(self):
        with self.assertRaises(TypeError):
            can_register("abc")

Nasz bieg minął:

test_too_old_partition ... ok
test_too_young_partition ... ok
test_valid_partition ... ok
test_wrong_type_partition ... ok

W prawdziwym projekcie funkcja parametryzacji pytestu to fajny sposób na uruchomienie tabeli wartości partycji w jednym teście.

Sprawdzony przykład: hasło

Wymóg: Hasło musi mieć od 8 do 20 znaków i zawierać co najmniej jedną cyfrę.

Ten ma dwie reguły, długość i treść, więc rozważamy partycje dla obu:

Partycja Wpisz Wartość testowa Oczekiwany wynik
Prawidłowa długość, zawiera cyfrę Ważne wschód słońca 42 Zaakceptowano
Za krótki Nieprawidłowe abc1 Błąd: za krótki
Za długo Nieprawidłowe Wartość 30-znakowa z cyfrą Błąd: za długi
Prawidłowa długość, bez cyfry Nieprawidłowe wschód słońca Błąd: potrzebna cyfra
Puste Nieprawidłowe (empty) Błąd: wymagane

Zauważ, że każdy nieprawidłowy test łamie tylko jedną regułę. Jeśli wartość była zbyt krótka i brakowało w niej cyfry, test pozytywny nie mógł stwierdzić, który test zadziałał. Jeden czek może zostać złamany, a drugi ukrywa ten fakt.

Sprawdzony przykład: wejścia nienumeryczne

Technika ta nie ogranicza się do zakresów liczbowych. Dyskretne opcje, kategorie i stany również tworzą partycje. Załóżmy, że w sklepie obowiązuje następująca zasada:

Wymóg: Dostawa jest bezpłatna dla członków Gold, 50 dla Silver i 100 dla wszystkich pozostałych. Nieznane wartości poziomów to błędy.

Partycja Wartość testowa Oczekiwana opłata
Złoto złoto 0
Srebro srebrny 50
Brak członkostwa (none) 100
Nieznany poziom platyna Błąd

Tutaj każda opcja jest osobną partycją, ponieważ każda powinna zachowywać się inaczej. Inne popularne partycje obejmują typy plików, takie jak prawidłowe i nieprawidłowe przesłane pliki, oraz grupy oparte na danych wyjściowych, takie jak zatwierdzanie lub odrzucanie pożyczki.

Wskazówka: Pomyśl o wynikach i danych wejściowych. Jeśli obliczenia mogą dać zniżkę, brak rabatu lub ostrzeżenie, upewnij się, że co najmniej jeden test osiągnął każdy z tych wyników.

Kilka wejść na raz

W przypadku wielu pól liczba kombinacji szybko rośnie. Trzy pola z czterema partycjami każde dają 64 kombinacje. Pomocne są dwie strategie:

  • Słaby zasięg: upewnij się, że każda partycja pojawia się w co najmniej jednym teście, łącząc kilka prawidłowych wartości na każdy test. W przypadku nieprawidłowych wartości testuj pojedynczo, aby błędy się nie maskowały.
  • Zasięg oparty na regułach: gdy kombinacje faktycznie zmieniają wynik, np. status elementu z wartością zamówienia, użyj testowania tabeli decyzyjnej, aby prawidłowo je wyświetlić.

Parowanie z analizą wartości brzegowych

Partycjonowanie informuje, które grupy należy przetestować. Niewiele mówi o gdzie w grupie robaki lubią się ukrywać, a wiele z nich chowa się tuż przy krawędziach. Aby to pokazać, napisaliśmy błędną wersję z klasycznym błędem „off-by-one”:

def buggy(age):
    return 18 < age <= 60     # should be 18 <= age

[buggy(a) for a in (35, 10, 75)]   # [True, False, False]
buggy(18)                          # False

Wszystkie nasze wartości podziału, 35, 10 i 75, dały prawidłowe odpowiedzi, więc te testy zaszły pomyślnie. Jednak 18-latek zostaje niesłusznie odrzucony. Dlatego te dwie techniki są ze sobą powiązane:

Technika Wybiera Wartości dla wieku od 18 do 60 lat
Podział równoważny Jedna wartość w każdej grupie 10, 35, 75
Analiza wartości brzegowych Wartości na krawędziach każdej grupy 17, 18, 60, 61

Użyj partycjonowania, aby znaleźć grupy, a następnie granic, aby sprawdzić, gdzie spotykają się grupy. W naszym kodzie oddzielny test dla 17, 18, 60 i 61 przekazał poprawną funkcję i wyłapał ten błąd. Nasz przewodnik po analizie wartości granicznych omawia to w całości.

Zalety i ograniczenia

Zalety Ograniczenia
Znacznie zmniejsza liczbę testów Opiera się na poprawności partycji
Zapewnia jasne i zrozumiałe pokrycie Może przegapić błędy na granicach
Nie wymaga dostępu do kodu Można pominąć ukryte przypadki specjalne
Stosuje się wcześnie, nawet z wymagań Nie modeluje dobrze sekwencji ani kombinacji

Największym ryzykiem jest błędne założenie. Jeśli kod ma ukrytą regułę dla jednej konkretnej wartości, wybrany test może po prostu jej nie osiągnąć. Testy eksploracyjne i pokrycie kodu pomagają znaleźć to, czego pominęły partycje.

Typowe błędy

  • Zapominanie nieprawidłowych partycji. Testowanie tylko szczęśliwych ścieżek pozostawia obsługę błędów bez kontroli.
  • Testowanie kilku wartości z jednej partycji. Zwiększa to koszty bez nowych informacji.
  • Łączenie kilku nieprawidłowych wartości w jednym teście. Jeden błąd może ukryć inny.
  • Pomijanie granic. Same testy partycji często pomijają pojedyncze błędy.
  • Odgadywanie zasad. Jeśli wymaganie jest niejasne, zapytaj. Czy do liczby 60 należy zaliczać osoby, które ukończyły 6 i pół roku życia?

Podsumowanie

Partycjonowanie równoważne zastępuje pytanie „ile testów powinienem napisać?” ze znacznie lepszym pytaniem: „Jakie zachowania istnieją i czy opisałem każde z nich?” Aby tego spróbować, weź formularz, który dzisiaj testujesz i wypisz jego partycje na papierze, łącznie z tymi nieprawidłowymi. Następnie dodaj granice. Często będziesz mieć mniej testów, które znajdą więcej błędów.

Najczęstsze pytania

Na czym polega podział równoważności w testowaniu?

Jest to technika czarnej skrzynki, która dzieli dane wejściowe na grupy, od których oczekuje się podobnego zachowania. Następnie testujesz jedną reprezentatywną wartość z każdej grupy, a nie każdą wartość.

Jaka jest różnica między podziałem równoważności a analizą wartości brzegowych?

Partycjonowanie wybiera jedną wartość z każdej grupy. Analiza wartości brzegowych sprawdza wartości na krawędziach tych grup. Zwykle używa się ich razem.

Ile przypadków testowych wymaga partycjonowanie równoważności?

Zwykle co najmniej jeden na partycję, zarówno ważny, jak i nieprawidłowy. Pole przedziału wiekowego zwykle wymaga około trzech do pięciu testów.

Czy podział równoważności to czarna skrzynka czy biała skrzynka?

Jest to technika czarnej skrzynki, ponieważ partycje pochodzą z wymagań i nie wymagają kodu. Programiści mogą jednak zastosować go również do testów jednostkowych.

Jakie są prawidłowe i nieprawidłowe partycje?

Prawidłowe partycje zawierają wartości, które system powinien zaakceptować. Nieprawidłowe partycje zawierają wartości, które powinny zostać odrzucone, takie jak liczby spoza zakresu, nieprawidłowe typy i spacje.

Ucz się dalej

Pracuj z Stack Quora

Potrzebujesz pomocy przy testowaniu, WordPressie lub SEO?

Pomagamy zespołom dostarczać lepsze oprogramowanie i rozwijać ich witryny. Powiedz nam, nad czym pracujesz, a my zaproponujemy jasny następny krok.

Czytaj dalej

Więcej poradników na testowanie, sztuczna inteligencja i nowoczesny rozwój

Podobał Ci się ten artykuł? Wybierz temat i przejdź bezpośrednio do naszych najnowszych tutoriali.

Sztuczna inteligencja

Wyjaśnienie halucynacji AI: dlaczego modele językowe tworzą rzeczy i jak je zmniejszyć

Wyjaśniono halucynacje AI: czym są, dlaczego powstają w modelach językowych, typowe typy, jak je zredukować za pomocą uziemień i podpowiedzi oraz pr…

Przeczytaj artykuł →
DevOps

Wyjaśnienie zmiennych środowiskowych: pliki .env, sekrety i konfiguracja wykonana prawidłowo

Zmienne środowiskowe wyjaśnione na przykładach Pythona, które przeprowadziliśmy: ich odczytywanie i ustawianie, dlaczego każda wartość jest ciągiem …

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie ograniczenia szybkości interfejsu API: algorytmy, nagłówki i obsługa błędów 429

Ograniczanie szybkości API wyjaśnione za pomocą przeprowadzonej przez nas symulacji: zasobnik tokenów, stałe okno, przesuwane okno, 429 odpowiedzi, …

Przeczytaj artykuł →
Automatyzacja testów

Wyśmiewanie w Pythonie: unittest.mock, patch i błędy, które sprawiają, że testy kłamią

Wyśmiewanie w Pythonie za pomocą unittest.mock, przetestowane: Mock i zwracana wartość, efekt uboczny, łatanie tam, gdzie używana jest nazwa, specyf…

Przeczytaj artykuł →
Testowanie oprogramowania

Wyjaśnienie zasięgu kodu: pokrycie linii i oddziału oraz co naprawdę oznacza 100%

Wyjaśnienie pokrycia kodu za pomocą prawdziwego pliku cover.py: pokrycie linii, gałęzi i warunków, przeczytanie raportu, dlaczego 100% pokrycia może…

Przeczytaj artykuł →
Bazy danych i SQL

DELETE vs TRUNCATE vs DROP w SQL: różnice, wycofywanie i kiedy używać każdego z nich

DELETE vs TRUNCATE vs DROP wyjaśnione za pomocą przetestowanego SQL: co każdy usuwa, wycofywanie, wyzwalacze, resetowanie tożsamości, prędkość i czy…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie widoków SQL: tworzenie, używanie i unikanie pułapek wraz z przykładami

Widoki SQL wyjaśnione za pomocą zapytań, które uruchomiliśmy: tworzenie widoku, wyniki na żywo, ukrywanie kolumn, wydajność, widoki z możliwością ak…

Przeczytaj artykuł →
Tworzenie oprogramowania

Interfejs TypeScript a typ: rzeczywiste różnice, testowane za pomocą kompilatora

Interfejs TypeScript a typ, sprawdzony z prawdziwym kompilatorem: co oba mogą zrobić, co tylko jeden, łączenie deklaracji, rozszerzenia a przecięcia…

Przeczytaj artykuł →
Tworzenie oprogramowania

Python *args i **kwargs wyjaśnione: elastyczne funkcje z przejrzystymi przykładami

Python *args i **kwargs wyjaśnione za pomocą uruchomionego przez nas kodu: pakowanie i rozpakowywanie, kolejność parametrów, argumenty zawierające t…

Przeczytaj artykuł →
Tworzenie oprogramowania

Funkcje Lambda w Pythonie: składnia, rzeczywiste zastosowania i kiedy ich nie używać

Funkcje lambda w Pythonie wyjaśnione za pomocą uruchomionego przez nas kodu: składnia, sortowanie za pomocą klucza, mapa i filtr, domknięcia, pułapk…

Przeczytaj artykuł →
Sztuczna inteligencja

Kim są agenci AI? Jak one działają, dzięki prostej pętli agenta, którą możesz uruchomić

Kim są agenci AI? Prosty przewodnik po pętli agenta, narzędziach, pamięci i poręczach, z małą pętlą w Pythonie, którą uruchomiliśmy, prawdziwymi zag…

Przeczytaj artykuł →
DevOps

Monitorowanie a obserwowalność: prawdziwa różnica z logami, wskaźnikami i śladami

Wyjaśnienie monitorowania a obserwowalności: znane i nieznane awarie, dzienniki, metryki i ślady, opis incydentu przy kasie, złote sygnały, OpenTele…

Przeczytaj artykuł →
DevOps

Woluminy platformy Docker a mocowania powiązań: utrwalanie danych kontenera we właściwy sposób

Wyjaśniono woluminy Dockera a montowanie powiązań: dlaczego dane kontenera znikają, nazwane woluminy, montowanie powiązań, tmpfs, przykłady tworzeni…

Przeczytaj artykuł →
Automatyzacja testów

TDD vs BDD: kluczowe różnice, jedna funkcja zbudowana w obie strony i kiedy używać każdej z nich

TDD vs BDD wyjaśnione za pomocą jednej funkcji rabatowej zbudowanej w obie strony: refaktoryzacja czerwono-zielona z uruchomionym przez nas kodem, s…

Przeczytaj artykuł →
Testowanie oprogramowania

Testowanie akceptacyjne użytkownika (UAT): proces, lista kontrolna i rzeczywiste przykłady

Wyjaśniono testy akceptacyjne użytkownika: kto je przeprowadza, czym różni się od kontroli jakości, siedmioetapowy proces, szablon przypadku testowe…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie wartości SQL NULL: IS NULL, COALESCE, NULLIF i pułapki, których należy unikać

Wartości SQL NULL wyjaśnione za pomocą zapytań, które wykonaliśmy: logika trójwartościowa, IS NULL, COALESCE, NULLIF, w jaki sposób agregacje, łącze…

Przeczytaj artykuł →
Bazy danych i SQL

Instrukcja SQL CASE WHEN: składnia, rzeczywiste przykłady i typowe błędy

SQL CASE WHEN wyjaśnione za pomocą zapytań, które uruchomiliśmy: proste i przeszukiwane formularze, kolejność warunków, elementy przestawne z SUM, s…

Przeczytaj artykuł →
Tworzenie oprogramowania

Co to jest JWT? Tokeny internetowe JSON wyjaśnione na przykładzie działania

Co to jest JWT? Wyjaśniono tokeny sieciowe JSON: trzy części, token zbudowany i zmodyfikowany w uruchomionym przez nas kodzie, JWT a sesje, pamięć m…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie pętli zdarzeń JavaScript: stos wywołań, mikrozadania i liczniki czasu z przykładami

Pętla zdarzeń JavaScript wyjaśniona za pomocą uruchomionego przez nas kodu: stos wywołań, kolejki zadań i mikrozadań, dlaczego setTimeout 0 nie jest…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie generatorów Pythona i wydajności: oszczędzaj pamięć dzięki prawdziwym przykładom

Generatory Pythona i wydajność wyjaśnione za pomocą uruchomionego przez nas kodu: sposób wstrzymywania i wznawiania, mierzone oszczędności pamięci, …

Przeczytaj artykuł →
Sztuczna inteligencja

Czym są osady? Wyjaśnienie wektorów i podobieństwa cosinusa

Czym są osadzania? Prosty przewodnik po wektorach, podobieństwie cosinusów i wyszukiwaniu semantycznym, z małym przykładem, który przeprowadziliśmy,…

Przeczytaj artykuł →
DevOps

Wdrożenie niebiesko-zielone a kanaryjskie: różnice, kompromisy i sposób wyboru

Wyjaśniono wdrożenie Blue-Green vs Canary: sposób działania każdego z nich, koszty, ryzyko i wycofywanie zmian, przetestowane przez nas stabilne łąc…

Przeczytaj artykuł →
Automatyzacja testów

Niestabilne testy: co je powoduje i jak je naprawić na dobre

Niestabilne testy wyjaśnione w przeprowadzonych przez nas demonstracjach: główne przyczyny, sposób potwierdzenia i zdiagnozowania jednej z nich, odp…

Przeczytaj artykuł →
Testowanie oprogramowania

Load Testing vs Stress Testing: Differences, Metrics and k6 Examples

Wyjaśniono testy obciążenia i testy warunków skrajnych: co dowodzi każdy z nich, testy szczytowe i nasiąkania, istotne metryki, dlaczego średnie wpr…

Przeczytaj artykuł →
Testowanie oprogramowania

Przypadek testowy a scenariusz testowy: kluczowe różnice, przykłady i kiedy stosować każdy z nich

Wyjaśnienie przypadków testowych i scenariuszy testowych: jasne definicje, tabela obok siebie, jedna funkcja resetowania hasła zaczerpnięta ze scena…

Przeczytaj artykuł →
Bazy danych i SQL

Optymalizacja zapytań SQL: czytaj plany wykonania i napraw powolne zapytania z synchronizacją

Optymalizacja zapytań SQL przetestowana na milionie wierszy: przeczytaj plany wykonania, dodaj odpowiednie indeksy, napraw filtry niesargowalne, uży…

Przeczytaj artykuł →
Bazy danych i SQL

SQL UNION vs UNION ALL: różnice, przykłady i testowana wydajność

SQL UNION vs UNION ALL wyjaśnione na podstawie zapytań, które uruchomiliśmy: duplikaty, obie reguły są zgodne, prawdziwy błąd danych, zmierzona wyda…

Przeczytaj artykuł →
Tworzenie oprogramowania

Samouczek API pobierania JavaScript: GET, POST, obsługa błędów i limity czasu

Samouczek JavaScript Fetch API testowany na serwerze lokalnym: GET i POST, dlaczego 404 nie rzuca, pomocnik wielokrotnego użytku, ciągi zapytań, prz…

Przeczytaj artykuł →
Tworzenie oprogramowania

Obsługa plików w Pythonie: odczyt, zapis, CSV, JSON i pathlib z przykładami

Obsługa plików w Pythonie wyjaśniona za pomocą uruchomionego przez nas kodu: tryby otwarte, czytanie dużych plików, CSV, JSON, pathlib, pliki binarn…

Przeczytaj artykuł →
Tworzenie oprogramowania

Klasy i obiekty Pythona: samouczek OOP z prawdziwymi przykładami

Klasy i obiekty Pythona objaśnione za pomocą uruchomionego przez nas kodu: __init__, metody, atrybuty klas i instancji, dziedziczenie, właściwości, …

Przeczytaj artykuł →
Sztuczna inteligencja

Co to jest model dużego języka? Jak działają LLM, wyjaśnione bez szumu

Co to jest model dużego języka? LLM wyjaśnione prostym językiem: tokeny, osadzanie, uwaga, szkolenie, temperatura i okna kontekstowe, mała demonstra…

Przeczytaj artykuł →
DevOps

Polecenia systemu Linux dla początkujących: niezbędny przewodnik po terminalu z przykładami

Polecenia systemu Linux dla początkujących, pogrupowane według zadań: nawigacja, pliki, przeglądanie logów, grep, potoki, uprawnienia, procesy i arc…

Przeczytaj artykuł →
Automatyzacja testów

Selenium kontra dramaturg: kluczowe różnice, porównanie kodu i wybór

Porównanie Selenium i Playwright: architektura, oczekiwanie, obsługa przeglądarki i języka, debugowanie, ten sam test w obu narzędziach, porady doty…

Przeczytaj artykuł →
Testowanie oprogramowania

Partycjonowanie równoważne: technika projektowania testów wyjaśniona na praktycznych przykładach

Wyjaśniono podział równoważny: jak znaleźć prawidłowe i nieprawidłowe partycje, sprawdzone przykłady dla grup wiekowych, hasła i kupony, przeprowadz…

Przeczytaj artykuł →
Testowanie oprogramowania

Ważność a priorytet w testowaniu oprogramowania: różnice, macierz i rzeczywiste przykłady

Wyjaśniono ważność a priorytet w testowaniu oprogramowania: jasne definicje, czterokierunkowa macierz z przykładami, skale poziomów, kto ustawia każ…

Przeczytaj artykuł →
Bazy danych i SQL

Samouczek dotyczący podzapytań SQL: typy, skorelowane podzapytania i ISTNIEJĄ z przykładami

Samouczek dotyczący podzapytań SQL z zapytaniami, które wykonaliśmy: podzapytania skalarne, IN, FROM i SELECT, podzapytania skorelowane, EXISTS, puł…

Przeczytaj artykuł →
Bazy danych i SQL

Wyjaśnienie transakcji SQL i ACID: COMMIT, ROLLBACK i poziomy izolacji

Transakcje SQL i ACID wyjaśnione za pomocą wykonanego przez nas przelewu bankowego: COMMIT, ROLLBACK, punkty zapisu, blokady, poziomy izolacji, brud…

Przeczytaj artykuł →
Tworzenie oprogramowania

Git merge vs rebase: różnice, przykłady i kiedy czego używać

Git merge vs rebase wyjaśnione na prawdziwym wyniku logu, z tabelą porównawczą, złotą zasadą rebase i bezpiecznym procesem pracy zespołu.

Przeczytaj artykuł →
Tworzenie oprogramowania

Python list comprehension: składnia, przykłady i kiedy jej unikać

Python list comprehension wyjaśnione: składnia, filtrowanie, if-else, zagnieżdżone pętle, zmierzone czasy i sytuacje, w których zwykła pętla for jes…

Przeczytaj artykuł →
Bazy danych i SQL

SQL JOIN – wyjaśnienie z przykładami (Inner, Left, Right, Full)

Zrozum złączenia SQL krok po kroku na przykładowych tabelach i zapytaniach: INNER, LEFT, RIGHT, FULL, CROSS i SELF, plus typowe błędy i wskazówki wy…

Przeczytaj artykuł →