Rozdział 23 · Część V · Sprawdzamy i automatyzujemy

Pisanie pierwszych testów automatycznych

Testy działają SafeSort tylko w tymczasowym katalogu pytest – żaden z nich nie dotyka faktycznych plików użytkownika.

SafeSort · Część 5 z 6
Git i GitHubPlanowanieProjektWdrożenieTesty i CIPremiera

Wyobraźmy sobie: ktoś przypadkowo zepsuł klasyfikator — rozszerzenie .PDF wielkimi literami nie jest już uznawany za dokument. Jak się o tym dowiedzieć bez Sprawdzanie ręcznie za każdym razem?

~/safesort $ pytest tests/test_classifier.py -q
........F.
=================================== FAILURES ===================================
______________________ test_classify_is_case_insensitive _______________________
 
assert classify(".PDF", DEFAULT_EXTENSIONS) == "documents"
E AssertionError: assert 'other' == 'documents'
 
1 failed, 9 passed in 0.04s
RED – test wykrywał awarię przed osobą.

Przywrócić normalizację rejestrów — i ten sam test potwierdza rozwiązanie:

~/safesort $ pytest tests/test_classifier.py -q
..........
10 passed in 0.02s
GREEN – zachowanie ponownie odpowiada oczekiwaniom.

Kod, który sam sprawdza inny kod i informuje, jeśli zachowanie zmieniło się niezauważalnie dla człowieka, nazywa się automatycznym testem. W Python częściej całkowite użytkowanie pytest.

Terminal (środowisko aktywowane)
pip install -e ".[dev]"
pytest tests/ -v
Testy systemu plików nigdy nie używają rzeczywistych katalogów użytkownika
Test, który wywołuje apply bezpośrednio ~/Downloads, przy pierwszym nieudanym uruchomieniu może uszczekać prawdziwe pliki. Wszystkie testy SafeSort uruchamiać w tymczasowym katalogu, który pytest sam tworzy i usuwa za pomocą wbudowanej funkcji tmp_path — jest przekazywany do funkcji testowej jako parametr regularny:
Tylko czytać
KATALOG TYMCZASOWY /tmp/pytest-.../ – utworz, przenieść, usuń – usunięte automatycznie
Zmieniają pliki
PRAWDZIWE PLIKI UŻYTKOWNIKA ~/Downloads – tutaj nigdy nie są wykonywane testy
tests/test_classifier.py
from safesort.classifier import classify
from safesort.config import DEFAULT_EXTENSIONS

def test_classify_known_extension():
    #Arrange: rozszerzenie i reguła klasyfikacji są już gotowe, nie trzeba nic tworzyć
    # Act
    rezultat = classify(".pdf", DEFAULT_EXTENSIONS)
    # Assert
    assert rezultat == "documents"

Trzy części — Arrange (przygotowanie), Act (wywołać), Assert (sprawdzić) — pojawiają się prawie w każdym teście SafeSort. Funkcja classify() jest dobrym pierwszym testem nie bez powodu: jest czysty, nie dotyka systemu plików i nie zależy od niczego zewnętrznego. Następna strona jest przejmowana przez Bardziej złożone testy to te, które faktycznie tworzą pliki w tymczasowym katalogu.

Krótko

  • Test to kod, który sprawdza kod: wykonuje funkcję i porównuje wynik z oczekiwanym.
  • tmp_path jest tymczasowym katalogiem, który pytest tworzy i usuwa dla każdego testu.
  • Żaden SafeSort test nie ma dostępu do prawdziwego katalogu użytkowników, jak ~/Downloads.