Hopp til innhold

Testy jednostkowe i walidacja

Skip to content

To jest tekst przetłumaczony maszynowo, który może zawierać błędy!

Testowanie jednostkowe i walidacja

Teraz, gdy stworzyliśmy klasy i pracowaliśmy nad walidacją, mamy solidną podstawę do rozpoczęcia testowania. Testowanie jest ważnym elementem procesu rozwoju i pomaga nam zapewnić, że nasz kod działa zgodnie z oczekiwaniami.

W jaki sposób możemy być pewni, że kod działa poprawnie, jeśli go nie przetestujemy?

Co to są testy jednostkowe?

Testy jednostkowe to metoda automatycznego i systematycznego testowania małych fragmentów naszego kodu. W Pythonie używamy modułu o nazwie pytest do pisania i uruchamiania testów. “Jednostka” to najmniejsza testowalna część aplikacji, często pojedyncza funkcja lub metoda. Korzystając z pytest, ważne jest, abyśmy przestrzegali właściwych konwencji nazewnictwa, aby pytest mógł znaleźć nasze testy, takich jak nazywanie plików testowych prefiksem test_, a funkcji testowych prefiksem test_.

Przykład testu jednostkowego:

def test_add():
    assert 0.3 + 0.3 + 0.3 == 0.9

Uruchamiane poprzez wpisanie pytest w terminalu.

Ciekawostka

Kod powyżej zawiedzie, ponieważ w Pythonie .3+.3+.3 daje wynik 0.8999999999!

Easy Zadanie 1 - Zainstaluj pytest

Zainstaluj pytest w swoim wirtualnym środowisku. Możesz to zrobić, uruchamiając następujące polecenie w terminalu:

pip install pytest

Easy Zadanie 2 - Utwórz test

Utwórz nowy plik w folderze projektu o nazwie test_data.py. W tym pliku utwórz test dla klasy Person, którą utworzyłeś w poprzednim module. Test powinien sprawdzać, czy Person może zostać utworzony z poprawnymi wartościami.

Przykład jak może wyglądać test:

from main import Person

def test_person_working():
    bob_kaare = Person(name="Bob Kåre",
                       eye_color=EyeColor.BLUE,
                       phone_number=PhoneNumber("12345678"),
                       email=Email("bob_kaare@example.com"))
    assert bob_kaare.name == "Bob Kåre"
    assert bob_kaare.eye_color == EyeColor.BLUE

Ten typ testów nazywa się testami „szczęśliwej ścieżki” (happy path), ponieważ sprawdzają one, czy wszystko działa prawidłowo przy podawaniu poprawnych wartości i nie są szczególnie użyteczne.

Medium Zadanie 3 – Testowanie walidacji

Utwórz kilka testów w pliku test_person.py, które sprawdzają, czy walidacja w klasach Email oraz PhoneNumber działa poprawnie. Przetestuj zarówno wartości prawidłowe, jak i nieprawidłowe. W tym celu należy użyć funkcji z biblioteki o nazwie pytest zwanej raises, która sprawdza, czy zostaje rzucony określony błąd.

import pytest

def test_exception():
    with pytest.raises(KeyError):
        my_dict = {"a": 1, "b": 2}
        value = my_dict["c"]  # To spowoduje wyjątek KeyError

Tip

Możesz tworzyć dowolną liczbę funkcji, pod warunkiem, że nazwa funkcji zaczyna się od test_.

Rozwiązanie: Przykład testu dla nieprawidłowego adresu e-mail
from main import Email

import pytest

def test_invalid_email():
    with pytest.raises(ValueError):
        email = Email("not-an-email")

Dlaczego to robić?

Dzięki posiadaniu dobrych testów dla naszego kodu możemy być pewni, że działa on tak, jak powinien, a także łatwo wykryć problemy w przypadku wprowadzania zmian w kodzie. Jest to szczególnie ważne przy dużych projektach, w których wielu programistów pracuje razem, co sprawia, że popełnianie błędów jest łatwe.

Wideo: Dlaczego testy chronią kod przed nowymi błędami

W wideo wyjaśniono, dlaczego testowanie jest ważne oraz w jaki sposób zautomatyzowane testy mogą wykrywać błędy po zmianach w kodzie.

Na przykład dzięki użyciu oprogramowania takiego jak Jest lub Selenium można automatycznie testować strony internetowe, co zapewnia, że wszystko działa prawidłowo po każdej zmianie w kodzie. Chcielibyśmy wiedzieć, czy „rejestracja użytkownika”, „płatność” i „logowanie” działają tak, jak powinny, prawda?

Zastanów się nad następującymi scenariuszami

Co się dzieje (lub powinno dziać) jeśli..:

  • Użytkownik próbuje zarejestrować się, używając adresu e-mail, który już jest w użyciu?
  • Użytkownik podaje datę urodzenia w przyszłości?
  • Użytkownik wpisuje imię i nazwisko “jOHN dOE”?

A software tester walks into a bar...

Hard Zadanie 4 - Automatyczne Testowanie (CI)

Kiedy publikujemy kod na GitHub, możemy skonfigurować coś, co nazywa się GitHub Actions, które mogą automatycznie uruchamiać nasze testy za każdym razem, gdy dokonujemy zmiany w kodzie. Nazywa się to Continuous Integration (CI) i pomaga nam upewnić się, że nasz kod zawsze działa zgodnie z oczekiwaniami.

Utwórz plik w folderze projektu o nazwie .github/workflows/pytest.yml. W tym pliku dodaj następujący kod:

name: Pytest

on: [push]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.11'
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install pytest
        # Zainstaluj wszelkie inne zależności, których potrzebuje Twój projekt
        pip install -r requirements.txt
    - name: Run tests with pytest
      run: pytest

Jeśli dodałeś go poprawnie, teraz zobaczysz nową kartę w swoim repozytorium na GitHubie o nazwie „Actions”. Tutaj możesz obserwować, jak Twoje testy są uruchamiane automatycznie za każdym razem, gdy dokonasz zmiany w kodzie, a otrzymasz powiadomienie, jeśli którykolwiek z testów się nie powiedzie (czerwone krzyżyk oraz przez e-mail).

Uwaga dotycząca struktury plików

Struktura Twoich plików zdecyduje o tym, czy GitHub Actions będzie działać, czy nie. Upewnij się, że folder .github znajduje się w głównym katalogu Twojego projektu, podobnie jak folder tests, w którym znajdują się Twoje pliki testowe.

Możesz ewentualnie zmienić plik pytest.yml, aby wskazywał na właściwy folder.

Pliki akcji mogą również służyć do testowania kodu w różnych wersjach języka Python lub systemów operacyjnych. Mogą być także używane do automatycznego budowania i publikacji oprogramowania, np. publikowania witryny internetowej lub aktualizowania aplikacji w App Store lub na Google Play.

Code Coverage

Istnieje również coś takiego jak „Code Coverage”, co może pomóc Ci zobaczyć, ile Twojego kodu jest faktycznie testowane. Może to być przydatne, aby dowiedzieć się, czy masz wystarczającą liczbę testów, czy też istnieją części Twojego kodu, które w ogóle nie są testowane.

Niektóre miejsca pracy wymagają, abyś miał pewien procent kodu pokryty testami przed wdrożeniem, aby upewnić się, że kod jest solidny i działa zgodnie z oczekiwaniami.

Unit Test Meme