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

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

Testowanie oprogramowania

Wyjaśnienie zasięgu kodu: Zasięg linii a oddziału i co naprawdę oznacza 100%

Zasięg informuje, jaki kod przeprowadzono w testach. Nie mówi, czy testy cokolwiek wykazały. Zmierzyliśmy mały moduł na trzy sposoby, aby pokazać różnicę.

8 min czytania
Wyjaśniono pokrycie kodu: zasięg linii czy oddziału i co tak naprawdę oznacza 100%.

Najważniejsze

  • Pokrycie kodu mierzy, jaka część kodu działa podczas testów.
  • Zasięg oddziałów jest bardziej rygorystyczny niż zasięg linii i jest bardziej użyteczny.
  • W naszym teście zestaw bez żadnych stwierdzeń nadal osiągnął 100% pokrycia.
  • Użyj pokrycia, aby znaleźć nieprzetestowany kod, a nie jako dowód jakości.

Zespół z dumą zgłasza 95% pokrycia kodu, a następnie wysyła błąd w wierszu, który został „objęty”. To nie jest sprzeczność. Pokrycie odpowiada na jedno wąskie pytanie: czy testy wykonały ten kod? To, czy sprawdzili wynik, to zupełnie inna kwestia.

Użyliśmy Pythona z pokryciem.py 7.17 i pytestem 9.2. Wszystkie poniższe liczby i raporty pochodzą z naszego własnego badania. Idee mają zastosowanie w każdym języku.

Co to jest pokrycie kodu?

Pokrycie kodu to procent kodu, który działa podczas działania testów automatycznych. Narzędzie rejestruje, które linie i opcjonalnie które gałęzie zostały wykonane, a następnie raportuje, co zostało pominięte.

Najbardziej przydatne jest to w odwrotnej kolejności. Niski zasięg na danym obszarze z całą pewnością mówi, że testy go nie sprawdzają. Wysoki zasięg mówi znacznie mniej.

Rodzaje pokrycia

Wpisz Pytanie, na które odpowiada
Funkcja Czy każda funkcja została wywołana przynajmniej raz?
Linia (instrukcja) Czy każda linia została uruchomiona przynajmniej raz?
Oddział Czy każdy if działał w obie strony, prawdę i fałsz?
Stan Czy każda część warunku złożonego (a and b) przyjmowała obie wartości?
MC/DC Czy każdy warunek niezależnie zmienił wynik? Używany w oprogramowaniu o znaczeniu krytycznym dla bezpieczeństwa.

Każdy poziom jest bardziej rygorystyczny niż ten powyżej. Większość zespołów monitoruje zasięg linii i gałęzi. Pokrycie warunków i MC/DC pojawiają się w standardach lotniczych i motoryzacyjnych, gdzie specjalizuje się wsparcie narzędziowe.

Kod, który zmierzyliśmy

def shipping_fee(total, is_member, express=False):
    if total < 0:
        raise ValueError("total cannot be negative")
    fee = 0 if total >= 1000 else 50
    if is_member:
        fee = max(fee - 25, 0)
    if express:
        fee += 100
    return fee

Nasz pierwszy plik testowy zawierał dwa testy:

def test_regular_order():
    assert shipping_fee(500, False) == 50

def test_member_express():
    assert shipping_fee(500, True, express=True) == 125

Uruchomiliśmy go z włączonym pomiarem gałęzi:

coverage run --branch -m pytest test_shipping.py
coverage report -m

Czytanie raportu

Name          Stmts   Miss Branch BrPart  Cover   Missing
---------------------------------------------------------
shipping.py       9      1      6      1    87%   3
  • Stmts 9, Miss 1: dziewięć wykonywalnych instrukcji, jedna nigdy nie została uruchomiona.
  • Oddział 6, BrCzęść 1: trzy if decyzje dają sześć możliwych wyników. Jedna decyzja zawsze szła tylko w jedną stronę.
  • Brakujące 3: linia 3, raise ValueError, nigdy nie została uruchomiona. Żaden test nie dał wyniku negatywnego.

Poprawka polega na sprawdzeniu ścieżki błędu. Dodaliśmy także test dla dużego zamówienia:

def test_free_over_1000():
    assert shipping_fee(1000, False) == 0

def test_negative_total():
    with pytest.raises(ValueError):
        shipping_fee(-1, False)

W przypadku obu plików raport pokazywał 100% i nie brakowało żadnych linii ani częściowych rozgałęzień. Ścieżki błędów to klasyczne metody pokrycia luk, dlatego też testy pod kątem nieprawidłowych danych wejściowych, zaprojektowane przy użyciu technik takich jak podział przez równoważność, tak dobrze się z nimi łączą.

Co ukrył raport

Spójrz jeszcze raz na pierwszy raport. Mówi, że brakuje tylko linii 3. Jednak w obu pierwszych testach wykorzystano łącznie 500 sztuk, więc zasada bezpłatnej wysyłki dla zamówień na kwotę 1000 lub więcej nie była nigdy testowana i w raporcie nie została ona oznaczona.

Powodem jest to, że fee = 0 if total >= 1000 else 50 znajduje się w jednej linii. zasięg.py mierzy rozgałęzienia między wierszami, więc wyrażenie warunkowe w pojedynczej linii liczy się jako jedna wykonana instrukcja. Gdyby ta reguła zawierała błąd, taki jak > zamiast >=, pierwszy zestaw nadal pokazywałby 87% bez żadnej wskazówki. Testy samej granicy, jak opisano w analizie wartości granic , są tym, co ją wyłapuje.

Ubezpieczenie 100% bez żadnych kontroli

Następnie napisaliśmy celowo słaby test, który wywołuje każdą ścieżkę, ale niczego nie stwierdza:

def test_runs_everything_but_checks_nothing():
    shipping_fee(500, True, express=True)
    shipping_fee(1000, False)
    shipping_fee(500, False)
    try:
        shipping_fee(-1, False)
    except ValueError:
        pass
shipping.py       9      0      6      0   100%

Osiągnięto 100% zasięgu linii i odgałęzień. Funkcja może zwrócić dowolną liczbę, a test i tak zakończy się pomyślnie. Jest to podstawowy limit pokrycia: mierzy wykonanie, a nie weryfikację.

Wskazówka: przeglądając żądanie ściągnięcia, przeczytaj stwierdzenia, a nie tylko zmianę zakresu. Test, który dodaje pokrycie bez znaczącego potwierdzenia, dodaje jedynie fałszywą pewność.

Aby zmierzyć, czy testy faktycznie wyłapują błędy, użyj testowania mutacji. Narzędzie takie jak mutmut dla Pythona, PIT dla Java lub Stryker dla JavaScript wprowadza niewielkie zmiany w kodzie, takie jak zamiana >= na > i sprawdza, czy test się nie powiedzie. Nasz test bez potwierdzenia pozwoliłby przetrwać każdej mutacji.

Jaki cel wyznaczyć

Nie ma uniwersalnej liczby. Praktyczne wskazówki:

  • Nie goń za 100%. Ostatnie kilka procent często oznacza testowanie trywialnego kodu lub pisanie testów, które po prostu dotykają granic.
  • Wiele zespołów dąży ogólnie do około 70–85%, przy wyższych oczekiwaniach dotyczących podstawowej logiki biznesowej.
  • Obserwuj trend, a nie liczbę. Zasięg spadający z każdą publikacją jest sygnałem ostrzegawczym.
  • Wymagaj uwzględnienia nowego kodu w żądaniach ściągnięcia zamiast wymuszania całego starego kodu na raz.
  • Wyklucz to, co nie ma znaczenia, np. wygenerowany kod, stosując jasne zasady.

Obowiązuje prawo Goodharta: kiedy środek staje się celem, przestaje być dobrym środkiem. Twarde cele zachęcają do testów, takich jak nasz przykład bez twierdzeń.

Narzędzia według języka

Język Wspólne narzędzia
Pyton zasięg.py, pytest-cov
JavaScript/TypeScript Stambuł (Nowy Jork), wbudowany w Jest i Vitest
Jawa JaCoCo
.NET Narzuta
Idź idź przetestować - przykryj
Raportowanie Codecov, SonarQube, kombinezony

Zasięg w CI

Uruchom analizę w ramach potoku CI i opublikuj raport, aby recenzenci mogli zobaczyć, które nowe linie nie zostały przetestowane. W przypadku cover.py coverage report --fail-under=80 kompilacja poniżej progu kończy się niepowodzeniem. Zachowaj skromny próg i połącz go z regułą dotyczącą nowego kodu, aby pojedynczy duży, starszy plik nie blokował wszystkich zmian.

Poza zasięgiem: lepsze pytania do zadawania

  • Czy testy obejmują ryzykowne, często zmieniane części kodu?
  • Czy testowane są granice i ścieżki błędów, a nie tylko szczęśliwa ścieżka?
  • Czy test zakończyłby się niepowodzeniem, gdyby ta linia była błędna?
  • Czy testy są wystarczająco szybkie i stabilne, aby można je było uruchomić przy każdej zmianie?

Należą one do dowolnej strategii testowej. Zasięg pomaga odpowiedzieć tylko na to pierwsze.

Wykluczanie kodu i czytanie raportów HTML

Niektórych kodów nie warto testować bezpośrednio, na przykład pomocników debugowania lub bloków uruchamianych tylko wtedy, gdy skrypt jest uruchamiany ręcznie. cover.py pozwala wykluczyć linie z komentarzem:

if __name__ == "__main__":  # pragma: no cover
    main()

Możesz także ustawić wykluczenia i foldery źródłowe do pomiaru w konfiguracji, na przykład w pyproject.toml:

[tool.coverage.run]
branch = true
source = ["shop"]

[tool.coverage.report]
show_missing = true
exclude_also = ["if TYPE_CHECKING:"]

Używaj wykluczeń oszczędnie i przeglądaj je jak kod. Każda z nich jest decyzją, że niektóre linie nigdy nie zostaną sprawdzone. Wykluczenie trudnego do przetestowania modułu obsługi błędów tylko po to, aby podnieść liczbę, mija się z celem.

W codziennej pracy raport HTML jest bardziej przydatny niż tabela terminali. Uruchom coverage html i otwórz htmlcov/index.html. Każdy plik jest pokazany z wykonanymi liniami na zielono, brakującymi liniami na czerwono i częściowymi gałęziami na żółto, dzięki czemu można na pierwszy rzut oka zobaczyć, który if nigdy nie poszedł inną ścieżką. Wielu redaktorów może także pokazywać pokrycie na marginesie, co sprawia, że ​​luki są widoczne podczas pisania kodu, a nie później.

Pokrycie przed refaktoryzacją

Pokrycie to także kontrola bezpieczeństwa przed refaktoryzacją. Jeśli planujesz restrukturyzację modułu, najpierw przejrzyj jego raport. Na czerwonych obszarach nie ma testów ostrzegających o zmianie zachowania, dlatego przed rozpoczęciem dodaj testy charakteryzujące, które wychwytują bieżące zachowanie. Używany w ten sposób zasięg przestaje być celem, a staje się praktycznym narzędziem planowania.

Ten sam raport pomaga, gdy błąd przedostanie się do środowiska produkcyjnego. Znajdź linię, w której mieszkał błąd i sprawdź, czy przeprowadził go jakiś test. Jeśli nie, znalazłeś lukę, którą warto zamknąć. Jeśli test rzeczywiście go uruchomił, problemem jest słaba asercja, a dokładnie taką sytuację pokazał nasz przykład bez asercji. Obie odpowiedzi mówią, jak ulepszyć pakiet.

Podsumowanie

Pokrycie kodu to latarka, a nie ocena. Użyj pokrycia gałęzi, aby znaleźć kod, którego nie dotyka żaden test, zwłaszcza obsługę błędów, a następnie napisz testy, które dokonują prawdziwych asercji. Jeśli pamiętasz jeden wynik z naszego testu, niech to będzie ten: 100% pokrycia zostało osiągnięte w teście, który niczego nie sprawdził.

Najczęstsze pytania

Jakie jest pokrycie kodu w testowaniu?

Jest to procent kodu wykonanego podczas uruchamiania testów automatycznych, mierzony liniami, gałęziami lub warunkami. Pokazuje, jakich testów dotknęły, a nie czy to zweryfikowały.

Jaka jest różnica między zasięgiem linii i oddziału?

Zasięg linii sprawdza, czy każda linia działała. Zasięg oddziałów sprawdza, czy każda decyzja poszła w obie strony. Zasięg oddziałów znajduje nieprzetestowane ścieżki, które pomija zasięg linii.

Czy 100% pokrycie kodu jest dobre?

Nie samodzielnie. W naszym teście zestaw bez stwierdzeń osiągnął 100%. Staraj się przeprowadzać znaczące testy ważnego kodu, a nie doskonałej liczby.

Jaki jest dobry procent pokrycia kodu?

Wiele zespołów celuje ogólnie w około 70–85%, przy czym więcej zależy od logiki krytycznej. Trend i jakość twierdzeń mają większe znaczenie niż dokładna liczba.

Czym badanie mutacji różni się od pokrycia?

Testowanie mutacji zmienia nieznacznie kod i sprawdza, czy test kończy się niepowodzeniem. Mierzy, czy testy wykrywają błędy, czego pokrycie nie jest w stanie wykryć.

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ł →