Testowanie jednostkowe i walidacja

Skip to content

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!

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
# Installer pytest - pakiet do testowania

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" # 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.

Medium 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”?

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 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.

Unit Test Meme