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!
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
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.
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”?
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.

