pyTest Tutorial #1: Wstęp, Instalacja i Pierwszy Test

pyTest Tutorial #1: Wstęp, Instalacja i Pierwszy Test

Poziom trudności
2/5

Pierwszy artykuł z serii pyTest Tutorial, w którym przeprowadzimy cię po kolei przez wiele meandrów pisania testów w Python’ie. W części pierwszej, jako krótki wstęp, przedstawimy garść informacji o samym framework’u, jego instalacji oraz pokażemy pierwszy test! Temat ten został już lekko nakreślony w:

Pisanie testów w Python’ie przy użyciu pyTest’a jest stosunkowo łatwe i intuicyjne. Jeśli chcesz poznać działanie pyTesta na przykładach, zapraszam do zapoznania się z artykułami

Jeśli jednak jest to dla ciebie za mało — jesteś w dobrym miejscu. Większość przykładów w tym tutorial’u, będzie się opierało na systemie Linux Ubuntu w wersji 18.04.3, Python’ie w wersji 3.6.9 oraz pyTest’cie w wersji 5.3.5. W całej serii artykułów dotyczących pyTest’a, pokażemy jak sporo przykładów, co powinno znacznie ułatwić przyswojenie wiedzy.

Wstęp

Na początek może kilka słów na temat samego framework’a, dlaczego właśnie ten jest wyjątkowy. Główne zadania tego narzędzia to znajdywanie napisanych przez nas testów (zgodnych z wymogami pyTest‚a), uruchomienie ich, a następnie przedstawienie wyników w formie krótkiego podsumowania. Wydawać się może, że to nic nadzwyczajnego. Jeśli jednak dodamy do tego model testów opartych na asercjach, jedyną w swoim rodzaju obsługę za pomocą fixture‚ów, a także szeregu wewnętrznych czy zewnętrznych plugin’ów, możemy sobie zdać sprawę z jakim, można by rzec, kombajnem mamy do czynienia. Kolejną cechą pyTest‚a, zresztą zgodną z założeniami Python’a jest czytelność i przejrzystość testów, nawet tych bardziej złożonych. Dzięki ujednoliconym asercjom śmiało wykorzystujemy tylko jedno słowo kluczowe assert — w przeciwieństwie do Unittest, gdzie mamy różne rodzaje asercji np. assertTrue(), assertEqual() itd.

Instalacja pyTesta

Przejdźmy do pierwszego, można by rzec, najważniejszego kroku, czyli instalacji testowego framework‚a. PyTest’a instalujemy przy użyciu narzędzia do instalacji pakietów Python’owych, czyli pip, ewentualnie pip3. Komenda do instalacji pyTest’a wygląda następująco:

(env) qabrio@test:~$ pip3 install pytest

Jeśli jednak w odpowiedzi otrzymamy:

Command 'pip' not found, but can be installed with:
apt install python-pip
Please ask your administrator.

niezbędne będzie doinstalowanie narzędzia pip:

(env) qabrio@test:~$ sudo apt-get install python-pip

Oczywiście zaleca się, aby wszystkie operacje wykonywać na środowiskach wirtualny Python’a, dzięki czemu unikniemy późniejszego bałaganu. Więcej o środowiskach wirtualnych na:

Testowany kod

Aby łatwiej było zobrazować działania pyTest’a, wszystkie testy w tym tutorialu będą testowały poniższy kod zwykłej klasy BasicCalculator, która symuluje działanie kalkulatora. Kod ten zapiszcie w pliku base.py:

  1. class BasicCalculator:
  2. def __init__(self):
  3. self.numbers = []
  4. self.signs = []
  5. self.result = 0
  6. def provide_number(self, number):
  7. self.numbers.append(number)
  8. if len(self.signs) == 0:
  9. self.result = number
  10. else:
  11. self.result = self.__calculate()
  12. def provide_operand(self, operand):
  13. self.signs.append(operand)
  14. def __calculate(self):
  15. if self.signs[-1] is '+':
  16. return self.result + self.numbers[-1]
  17. if self.signs[-1] is '-':
  18. return self.result - self.numbers[-1]
  19. if self.signs[-1] is '*':
  20. return self.result * self.numbers[-1]
  21. if self.signs[-1] is '/':
  22. return self.result / self.numbers[-1]
  23. def show_result(self):
  24. self.signs.append('=')
  25. sequence = ''
  26. for i in range(len(self.numbers)):
  27. sequence = sequence + '{} {} '.format(self.numbers[i], self.signs[i])
  28. sequence += str(self.result)
  29. print(sequence)
  30. return self.result, sequence

Założenia do kalkulatora:

Pierwszy Test

Na zakończenie pierwszej części napiszmy dwa proste testy weryfikujące działanie dodawania oraz odejmowania dwóch liczb dodatnich, oraz umieśćmy je w pliku test_calc.py:

  1. from base import BasicCalculator
  2. def test_addition():
  3. object = BasicCalculator()
  4. object.provide_number(10)
  5. object.provide_operand('+')
  6. object.provide_number(5)
  7. assert object.show_result()[0] == 15
  8. def test_subtraction():
  9. object = BasicCalculator()
  10. object.provide_number(13)
  11. object.provide_operand('-')
  12. object.provide_number(21)
  13. assert object.show_result()[0] == -8

Nie wdając się w szczegóły pisania testów, które zostaną opisane dokładnie w kolejnych częściach, myślę, że test jest czytelny i łatwy do zrozumienia. W pierwszej kolejności jest tworzony obiekt naszego kalkulatora, następnie podana jest wartość 10, znak działania, oraz wartość 5. Kolejna czynność znajduje się w asercji, której zadaniem jest weryfikowanie, czy rezultat zwrócony przez kalkulator jest zgodny z oczekiwanym.

Uruchamianie testu

Spróbujmy jeszcze uruchomić ten test. Uczynić to można, we wręcz banalny sposób, wpisując w konsoli słowo kluczowe pytest z nazwą pliku. Jedynym warunkiem, aby test uruchomił się prawidłowo, to znajdowanie się w folderze gdzie jest ulokoway plik z testem. Z racji, że nasz plik z testem nazywa się calc_test.py, całość będzie wyglądała następująco:

(env) qabrio@test:~/basic_calculator$ pytest test_calc.py
========================================= test session starts ==========================================
platform linux -- Python 3.6.9, pytest-5.3.5, py-1.8.1, pluggy-0.13.1
rootdir: /home/qabrio/basic_calculator, inifile:
collected 2 item
test_calc.py .. [100%]
======================================= 1 passed in 0.00 seconds =======================================
(env) qabrio@test:~/basic_calculator$

Jak widzimy, udało nam się stworzyć, a następnie uruchomić pierwszy test. W kolejnych częściach skupię się na szczegółach pisania oraz uruchamiania testów za pomocą pyTest’a.

Ten post ma 2 komentarzy

  1. Ania

    Witam serdecznie i proszę o pomoc 🙁
    Po uruchomieniu testu wyświetla mi się komunikat: no test ran.. file not found: calc_test.py mimo, że wszystko zrobiłam jak w artykule.
    Może wiecie, gdzie tkwi błąd?
    Z góry dziękuję i pozdrawiam serdecznie.
    Ania

    1. Wojciech

      Proszę sprawdź czy nie zrobiłaś literówki w nazwach testów. Ważne aby testy zaczynały się od ‚test_’. Dzięki takiemu przedrostkowi funkcje stają się widoczne jako testy dla pyTesta.

Dodaj komentarz