To jest tekst przetłumaczony maszynowo, który może zawierać błędy!
Ponieważ stworzyliśmy klasy i pracowaliśmy nad walidacją, mamy dobre podstawy do rozpoczęcia testowania. Testowanie jest ważną częścią procesu tworzenia oprogramowania i pomaga nam upewnić się, że nasz kod działa zgodnie z oczekiwaniami.
Jak możemy być pewni, że kod działa zgodnie z przeznaczeniem, 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():
# Sjekker om addisjon fungerer som forventet.
# Sprawdza, czy dodawanie działa zgodnie z oczekiwaniami.
assert 0.3 + 0.3 + 0.3 == 0.9
Uruchamiane poprzez wpisanie pytest w terminalu.
Fun fact
Powyższy kod zawiedzie, ponieważ .3+.3+.3 staje się 0.8999999999 w Pythonie!
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
# Installer pytest - pakiet do testowania
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" # Sprawdza, czy imię jest poprawne
assert bob_kaare.eye_color == EyeColor.BLUE # Sprawdza, czy kolor oczu jest poprawny
Ten typ testowania nazywany jest testowaniem “ścieżki szczęścia”, ponieważ testujemy, czy wszystko działa zgodnie z oczekiwaniami, gdy podajemy prawidłowe wartości i nie jest szczególnie przydatny.
Zadanie 3 - Test walidacji
Utwórz więcej testów w test_person.py, które sprawdzają, czy walidacja w Email i PhoneNumber działa zgodnie z oczekiwaniami. Przetestuj zarówno poprawne, jak i niepoprawne wartości. W tym celu musisz użyć funkcji w pytest o nazwie raises, która sprawdza, czy wystąpił 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 "podniesienie" wyjątku KeyError
Tip
Możesz tworzyć dowolną liczbę funkcji, pod warunkiem, że nazwa funkcji zaczyna się od test_.
Løsning: Eksempel på test 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, i możemy łatwo ustalić, czy coś poszło nie tak, jeśli wprowadzimy zmiany w kodzie. Jest to szczególnie ważne w większych projektach, gdzie wielu programistów pracuje razem i łatwo popełnić błędy.
Na przykład, używając oprogramowania takiego jak Jest lub Selenium, można automatycznie testować strony internetowe, a tym samym upewnić się, że wszystko działa zgodnie z oczekiwaniami po każdej zmianie w kodzie. Chcielibyśmy wiedzieć, że „rejestracja użytkownika”, „płatność” i „logowanie” działają prawidłowo, 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 wszystko zostało poprawnie skonfigurowane, powinieneś teraz zobaczyć nową zakładkę w swoim repozytorium GitHub o nazwie “Actions”. Tam będziesz mógł zobaczyć, że twoje testy są uruchamiane automatycznie za każdym razem, gdy wprowadzisz zmianę w kodzie, i zostaniesz powiadomiony, jeśli którykolwiek z testów nie przejdzie (czerwony krzyżyk i przez e-mail).
Merknad om filstruktur
Struktura plików zdecyduje o tym, czy GitHub Actions będzie działać, czy nie. Upewnij się, że folder .github znajduje się w katalogu głównym twojego projektu, a także folder tests, w którym znajdują się twoje pliki testowe.
Możesz opcjonalnie zmodyfikować plik pytest.yml, aby wskazywał właściwy folder.
Pliki Actions mogą być również używane do testowania kodu w wielu wersjach Pythona lub systemów operacyjnych, mogą być również używane do automatycznego budowania i publikowania oprogramowania, np. publikowania strony internetowej lub aktualizowania aplikacji w App Store lub 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.

