Samouczek Pytest dla początkujących: urządzenia, parametryzacja i prawdziwe przykłady

  1. Strona główna
  2. Blog
  3. Automatyzacja testów

Automatyzacja testów

Samouczek Pytest dla początkujących: Urządzenia, parametryzacja i rzeczywiste przykłady

Pytest umożliwia pisanie testów w Pythonie za pomocą prostych funkcji i prostych instrukcji potwierdzających. Zbuduj krok po kroku mały zestaw testów, przeczytaj wyniki rzeczywistych awarii i poznaj funkcje, z których będziesz korzystać na co dzień.

10 min czytania
Poradnik Pytest dla początkujących: urządzenia, parametryzacja i prawdziwe przykłady

Najważniejsze

  • Pytest znajduje funkcje o nazwach test_* i sprawdza je za pomocą zwykłych instrukcji assert.
  • Urządzenia umożliwiają konfigurację i czyszczenie wielokrotnego użytku, których można zażądać po prostu poprzez nazwanie ich jako argumentów.
  • @pytest.mark.parametrize uruchamia jeden test z wieloma danymi wejściowymi.
  • Umieść udostępnione urządzenia w conftest.py i nie musisz ich importować.

Jeśli unikałeś pisania testów, ponieważ wydawało Ci się to uciążliwe, ten samouczek dotyczący testów Pythona powinien zmienić Twoje zdanie. Pytest usuwa większość ceremonii: nie ma klas, z których można dziedziczyć, ani żadnych specjalnych metod potwierdzania do zapamiętania. Test może składać się tylko z dwóch linii.

Zbudujemy mały koszyk i przetestujemy go krok po kroku. Uruchomiliśmy wszystko w Pythonie 3.13 z pytestem 9.2, a pokazane dane wyjściowe są prawdziwe, chociaż przycięliśmy ścieżki plików i szczegóły taktowania, które będą się różnić na twoim komputerze.

Dlaczego pytest?

Python jest dostarczany z unittest, co działa dobrze, ale pytest jest zwykle wygodniejszym wyborem. Oto ta sama kontrola w każdym przypadku:

Zadanie test jednostkowy test
Sprawdź równość self.assertEqual(a, b) twierdzić a == b
Sprawdź wyjątek self.assertRaises(...) pytest.raises(...)
Struktura testu Klasa dziedzicząca z TestCase Prosta funkcja
Konfiguracja i czyszczenie metody setUp i tearDown. Oprawy wielokrotnego użytku
Wiele wejść subTest pętle parametryzować

Pytest może również uruchomić istniejące unittest testy, dzięki czemu możesz przełączać się stopniowo. Ma również duży ekosystem wtyczek, w tym pytest-cov dla zasięgu i pytest-xdist dla przebiegów równoległych.

Zainstaluj pytest

Najpierw utwórz środowisko wirtualne, jak wyjaśniono w naszym samouczku dotyczącym środowiska wirtualnego Pythona, a następnie zainstaluj je:

pip install pytest
pytest --version

# pytest 9.2.0

Utwórz folder projektu zawierający dwa pliki, cart.py i test_cart.py. Pytest znajduje testy automatycznie, stosując następujące zasady nazewnictwa: pliki o nazwach test_*.py lub *_test.py, funkcje zaczynające się od test i klasy zaczynające się od Test. Jeśli test nie zostanie odebrany, pierwszą rzeczą do sprawdzenia jest niezgodność nazewnictwa.

Kod do przetestowania

# cart.py
class Cart:
    def __init__(self):
        self.items = []

    def add(self, name, price, qty=1):
        if qty < 1:
            raise ValueError("qty must be at least 1")
        self.items.append((name, price, qty))

    def total(self, discount=0):
        subtotal = sum(price * qty for _, price, qty in self.items)
        return round(subtotal * (1 - discount / 100), 2)

Twoje pierwsze testy

# test_cart.py
from cart import Cart

def test_empty_cart_is_free():
    assert Cart().total() == 0

To kompletny test. Uruchom pytest z folderu projektu i zgłosi jeden test pozytywny. Jeśli pojawi się błąd importu, uruchom go jako python -m pytest, co spowoduje dodanie bieżącego folderu do ścieżki importu.

Błędy w czytaniu

Tutaj pytest naprawdę błyszczy. Oto test z celowo błędną wartością oczekiwaną:

def test_wrong_total():
    c = Cart()
    c.add("Keyboard", 1500)
    assert c.total() == 1400

A oto co wyświetliło się po uruchomieniu:

    def test_wrong_total():
        c = Cart()
        c.add("Keyboard", 1500)
>       assert c.total() == 1400
E       assert 1500.0 == 1400
E        +  where 1500.0 = total()

FAILED fail_example.py::test_wrong_total - assert 1500.0 == 1400
============================== 1 failed in 0.12s ==============================

> oznacza błędną linię, a E linie pokazują rzeczywiste wartości. Nie musiałeś dodawać niestandardowej wiadomości, ponieważ pytest przepisuje assert instrukcje, aby mogli zgłosić to, co porównali. Robi to samo z listami i słownikami, wskazując dokładnie, które elementy się różnią.

Testowanie wyjątków

Obsługa błędów to także zachowanie i zasługuje na testy. pytest.raises przechodzi tylko wtedy, gdy blok zgłosi oczekiwany wyjątek:

import pytest

def test_rejects_zero_qty():
    with pytest.raises(ValueError, match="at least 1"):
        Cart().add("Pen", 10, qty=0)

Opcjonalny argument match sprawdza wiadomość przy użyciu wyrażenia regularnego, więc inny argument ValueError nie zostanie przekazany przez przypadek. Aby dowiedzieć się, jak zgłaszać i obsługiwać takie błędy, przeczytaj nasz przewodnik po obsłudze wyjątków w Pythonie.

Oprawy: konfiguracja wielokrotnego użytku

Większość testów wymaga najpierw czegoś przygotowanego. urządzenie to funkcja, która je udostępnia. Udekoruj go @pytest.fixture, a każdy test, który nazwie go jako argument, otrzyma wynik:

@pytest.fixture
def cart():
    c = Cart()
    c.add("Keyboard", 1500)
    c.add("Mouse", 500, qty=2)
    return c

def test_total(cart):
    assert cart.total() == 2500

Każdy test domyślnie otrzymuje nowy koszyk, więc testy nie mogą na siebie wpływać. Pytest dopasowuje nazwę argumentu do nazwy urządzenia i nigdy nie wywołujesz tego urządzenia samodzielnie. @pytest.fixture to dekorator, co wyjaśnimy w Wyjaśnienie dekoratorów Pythona.

Oczyszczanie z wydajnością

Użyj yield zamiast return, jeśli chcesz później posprzątać. Kod po yield jest uruchamiany po zakończeniu testu, nawet jeśli zakończył się niepowodzeniem:

@pytest.fixture
def temp_db():
    print("\nopen db")
    yield {"users": []}
    print("close db")

def test_db(temp_db):
    assert temp_db["users"] == []

Uruchomienie z -s w celu wyświetlenia wydruku potwierdziło, że zamówienie zostało otwarte, przetestuj, a następnie zamknij.

Zakres urządzeń i conftest.py

Domyślnie urządzenie uruchamia się raz na test. W przypadku kosztownej konfiguracji, takiej jak baza danych lub przeglądarka, zmień jej czas życia za pomocą scope:

Zakres Tworzone raz na
function (domyślnie) Testuj
klasa Klasa testowa
moduł Plik
pakiet Pakiet
sesja Cały przebieg testowy

Umieść urządzenia używane przez kilka plików w pliku o nazwie conftest.py. Pytest ładuje go automatycznie, więc testy mogą używać jego urządzeń bez importu. Należy jednak zachować ostrożność w przypadku zakresów współdzielonych, ponieważ zmiana dokonana w jednym teście może przedostać się do następnego.

Parametryzacja: jeden test, wiele danych wejściowych

Zamiast kopiować test dla każdej wartości, wymień przypadki:

@pytest.mark.parametrize("discount, expected", [
    (0, 2500),
    (10, 2250),
    (100, 0),
])
def test_discount(cart, discount, expected):
    assert cart.total(discount) == expected

Każdy wiersz staje się osobnym testem, co można zobaczyć w pełnych wynikach naszego uruchomienia całego pliku:

test_cart.py::test_total PASSED                        [ 16%]
test_cart.py::test_discount[0-2500] PASSED             [ 33%]
test_cart.py::test_discount[10-2250] PASSED            [ 50%]
test_cart.py::test_discount[100-0] PASSED              [ 66%]
test_cart.py::test_rejects_zero_qty PASSED             [ 83%]
test_cart.py::test_empty_cart_is_free PASSED           [100%]

============================== 6 passed in 0.05s ==============================

Jeśli jeden wiersz ulegnie awarii, pozostałe nadal działają, a nazwa dokładnie informuje, które wartości spowodowały problem. Zauważ, że połączyliśmy parametryzację z urządzeniem cart. Aby wybrać wartości, które prawdopodobnie znajdą błędy, użyj analizy wartości granicznych.

Wskazówka: Jeśli parametry są długie lub niejasne, podaj ids=["none", "ten", "full"], aby nadać każdemu przypadkowi czytelną nazwę w raporcie.

Przydatne wbudowane elementy wyposażenia

Pytest zawiera kilka gotowych urządzeń. Te dwa są szczególnie przydatne i oba przeszły w naszym biegu:

def test_write_report(tmp_path):
    report = tmp_path / "report.txt"
    report.write_text("passed")
    assert report.read_text() == "passed"

def read_mode():
    return os.environ.get("APP_MODE", "dev")

def test_mode(monkeypatch):
    monkeypatch.setenv("APP_MODE", "staging")
    assert read_mode() == "staging"

tmp_path przydziela każdemu testowi unikalny folder tymczasowy, więc testy nigdy nie dotykają prawdziwych plików. monkeypatch zmienia zmienne środowiskowe lub atrybuty i cofa zmianę po zakończeniu testu. Innym przydatnym jest capsys, który przechwytuje wydruki, abyś mógł je sprawdzić.

Znaczniki: pomiń i xfail

Markery dodają etykiety i zachowania do testów:

@pytest.mark.skip(reason="payment sandbox is down")
def test_payment():
    assert False

@pytest.mark.xfail(reason="floating point")
def test_rounding():
    assert 0.1 + 0.2 == 0.3

skip w ogóle nie przeprowadza testu. xfail uruchamia go, ale spodziewa się awarii, więc znany problem nie zakłóca kompilacji. Z innymi dodatkowymi testami w tym samym pliku, nasz przebieg podsumowano jako 3 passed, 1 skipped, 1 xfailed. Nawiasem mówiąc, ten test zaokrąglania naprawdę zawodzi: w arytmetyce zmiennoprzecinkowej 0,1 + 0,2 to nie dokładnie 0,3. Użyj pytest.approx(0.3) przy porównywaniu ułamków dziesiętnych.

Możesz także utworzyć własne znaczniki, takie jak @pytest.mark.slow i uruchamiać tylko te z pytest -m slow lub pominąć je za pomocą -m "not slow". Zarejestruj niestandardowe znaczniki w pliku konfiguracyjnym, aby uniknąć ostrzeżeń.

Przydatne flagi wiersza poleceń

Polecenie Co to robi
pytest -v Pokaż nazwę każdego testu
pytest -q Pokaż krótsze podsumowanie
pytest -x Zatrzymaj się przy pierwszej porażce
pytest -k rabat Uruchom testy, których nazwy pasują do słowa
pytest -s Pokaż wyjście print.
pytest --lf Uruchom ponownie tylko ostatnie awarie
pytest --pdb Otwórz debuger w przypadku awarii
pytest test_cart.py::test_total Uruchom jeden konkretny test

Uruchamianie pytestu w CI

Testy są najcenniejsze, gdy uruchamiają się automatycznie przy każdej zmianie. Minimalne zadanie GitHub Actions wygląda następująco:

steps:
  - uses: actions/checkout@v4
  - uses: actions/setup-python@v5
    with:
      python-version: "3.13"
  - run: pip install -r requirements.txt
  - run: python -m pytest

Pytest kończy działanie z niezerowym kodem, gdy testy kończą się niepowodzeniem, co powoduje zatrzymanie potoku. Nie wykonaliśmy tego pliku przepływu pracy, więc dostosuj go do swojego projektu. Szczegóły znajdziesz w naszym przewodniku CI/CD dotyczącym działań w GitHub. Pytest sprawdza się również dobrze w testach przeglądarek, jak pokazują nasze samouczek Selenium Python i samouczek dotyczący modelu obiektu strony.

Podsumowanie

Masz teraz to, czego potrzebujesz do większości zestawów testów Pythona: zwykłe potwierdzenia, urządzenia do konfiguracji, parametryzacja dla odmian i kilka flag zwiększających szybkość. Zacznij od małych rzeczy. Wybierz jedną funkcję, w której ostatnio naprawiłeś błąd, i najpierw napisz test pod kątem tego błędu. Jeśli nie masz pewności, co przetestować na każdym poziomie, przeczytaj o testowaniu jednostkowym a integracyjnym.

Najczęstsze pytania

Do czego służy pytest?

Pytest to framework do testowania języka Python. Służy do testów jednostkowych, integracyjnych i API, dobrze współpracuje także z narzędziami przeglądarkowymi takimi jak Selenium i Playwright.

Czy pytest jest lepszy niż unittest?

Wiele zespołów woli go ze względu na prostszą składnię, terminy i wyraźniejsze awarie. unittest nie wymaga instalacji, a pytest może również uruchamiać istniejące testy jednostkowe.

Co to jest urządzenie w pytest?

Urządzenie to funkcja, która przygotowuje coś, czego potrzebuje test, na przykład dane lub połączenie. Testy odbierają go, nazywając go jako argument.

Co to jest conftest.py?

Jest to specjalny plik do udostępniania osprzętu i haków w plikach testowych. Pytest ładuje go automatycznie, więc jego urządzenia nie wymagają instrukcji importu.

Dlaczego pytest nie znajduje moich testów?

Zwykle jest to kwestia nazewnictwa. Pliki powinny mieć nazwę test_*.py lub *_test.py, a funkcje powinny zaczynać się od testu. Sprawdź także, czy uruchomiłeś go z odpowiedniego folderu.

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

Ściągawka dotycząca poleceń Git: polecenia, których faktycznie używasz, z przykładami

Ściągawka poleceń Git pogrupowana według zadań: konfiguracja, przemieszczanie, gałęzie, piloty, skrytka, historia i cofanie błędów, z danymi wyjścio…

Przeczytaj artykuł →
Tworzenie oprogramowania

Wyjaśnienie obietnic JavaScript: następnie catch, Promise.all i typowe błędy

Obietnice JavaScript wyjaśnione za pomocą uruchomionego przez nas kodu: stany, łańcuchy then i catch, obsługa błędów, Promise.all, allSettled, race …

Przeczytaj artykuł →
Tworzenie oprogramowania

Samouczek słownika języka Python: metody, przykłady i typowe wzorce

Samouczek słownika języka Python z uruchomionym przez nas kodem: tworzenie, odczytywanie i aktualizowanie słowników, metody kluczowych, łączenie, ro…

Przeczytaj artykuł →
Sztuczna inteligencja

Co to jest RAG? Generacja rozszerzona o wyszukiwanie wyjaśniona na przykładzie roboczym

Co to jest RAG? Generowanie wspomagane pobieraniem wyjaśnione krok po kroku: indeksowanie, fragmentowanie, osadzanie, pobieranie, mały działający pr…

Przeczytaj artykuł →
DevOps

Samouczek Terraform dla początkujących: Infrastruktura jako kod od pierwszego pliku do modułów

Samouczek Terraform dla początkujących: zacznij bez konta w chmurze, naucz się inicjowania, planowania i stosowania, a następnie zmiennych, wyników,…

Przeczytaj artykuł →
DevOps

Docker kontra Kubernetes: kluczowe różnice, jak ze sobą współpracują i czego potrzebujesz

Wyjaśniono Docker vs Kubernetes: co robi każdy z nich, ta sama aplikacja działa z obydwoma, porównanie Docker Compose i Swarm, zmiana podkładki dock…

Przeczytaj artykuł →
Automatyzacja testów

Samouczek Pytest dla początkujących: urządzenia, parametryzacja i prawdziwe przykłady

Samouczek pytest dla początkujących z testami, które przeprowadziliśmy na pytest 9.2: asercje, urządzenia, parametryzacja, conftest, znaczniki, tmp_…

Przeczytaj artykuł →
Testowanie oprogramowania

Cykl życia testowania oprogramowania (STLC): 6 faz, kryteria wejścia i wyjścia, przykład

Wyjaśniono cykl życia testowania oprogramowania: sześć faz STLC z kryteriami wejścia i wyjścia, elementy dostarczane, działający przykład funkcji lo…

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