Tomasz Gądek Home Page

tgadek.bitbucket.io

Testowanie i Jakość Oprogramowania

Laboratorium 7: Atrapy.

Atrapy

W testach jednostkowych często spotykamy się z sytuacją, gdzie metoda, którą testujemy, zależy od innej klasy lub modułu. Nie zawsze jednak chcemy (lub możemy) testować całą aplikację naraz. W takich przypadkach używamy atrap (stub, mock), czyli obiektów zastępczych symulujących rzeczywiste zachowanie.

Do czego służą atrapy?

Atrapy pozwalają nam:

  • testować kod bez faktycznej implementacji zależności,
  • uniknąć wywołań rzeczywistych operacji, np. zapytań do bazy, API, czy obliczeń,
  • skupić się na samej logice testowanej funkcji.

W Pythonie do tworzenia atrap wykorzystujemy moduł unittest.mock, a w szczególności Mock().

Co to jest Mock()?

Obiekt Mock() jest dynamiczną atrapą, która udaje prawdziwy obiekt i pozwala kontrolować jego zwracane wartości oraz sprawdzać, czy był wywoływany.

Możemy np.:

  • ustawić wartość zwracaną przez funkcję (mock.return_value = 42),
  • sprawdzić, ile razy była wywołana (mock.call_count),
  • zweryfikować z jakimi argumentami była wywołana (mock.assert_called_with("Hello")).

Przykład

Mamy klasę Counter, która używa klasy Operation. Nie mamy implementacji count(), ale chcemy przetestować Counter. Zastosujemy Mock() jako atrapę zamiast faktycznej klasy Operation.

Następnie zaimplementujemy testy, które nie wymagają rzeczywistej implementacji metody count().

Dobrze przeanalizuj kod i zastanów się.

Zadanie

Tworzysz system zarządzania książkami w bibliotece. Aktualnie nie ma jeszcze implementacji systemu, ale został zdefiniowany interfejs oraz wstępna implementacja operacji.

  • W pierwszym kroku zaimplementujesz klasę LibraryRepository, ale zamiast rzeczywistej bazy danych użyjesz słownika (dict - InMemoryRepository) jako magazynu danych.
  • W drugim kroku zamiast prawdziwego repozytorium użyj Mock do testowania interakcji między Library a LibraryRepository.

Wiem, że nic nie wiem

~Sokrates