pyTest Tutorial #1: Wstęp, Instalacja i Pierwszy Test
Pierwsza część Tutoriala pyTesta. Dowiesz się z niej co to jest pyTest, jak przejść przez proces Instalacji oraz uruchomisz pierwszy test!
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:
class BasicCalculator:
def __init__(self):
self.numbers = []
self.signs = []
self.result = 0
def provide_number(self, number):
self.numbers.append(number)
if len(self.signs) == 0:
self.result = number
else:
self.result = self.__calculate()
def provide_operand(self, operand):
self.signs.append(operand)
def __calculate(self):
if self.signs[-1] is '+':
return self.result + self.numbers[-1]
if self.signs[-1] is '-':
return self.result - self.numbers[-1]
if self.signs[-1] is '*':
return self.result * self.numbers[-1]
if self.signs[-1] is '/':
return self.result / self.numbers[-1]
def show_result(self):
self.signs.append('=')
sequence = ''
for i in range(len(self.numbers)):
sequence = sequence + '{} {} '.format(self.numbers[i], self.signs[i])
sequence += str(self.result)
print(sequence)
return self.result, sequence
Założenia do kalkulatora:
- bazuje na kolejności wprowadzania liczb (nie uwzględnia kolejności wykonywania działań),
- obsługuje liczby ujemne,
- nie jest zabezpieczony przed dzieleniem przez 0,
- nie jest zabezpieczony przed wprowadzaniem innych znaków zamiast liczb.
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:
from base import BasicCalculator
def test_addition():
object = BasicCalculator()
object.provide_number(10)
object.provide_operand('+')
object.provide_number(5)
assert object.show_result()[0] == 15
def test_subtraction():
object = BasicCalculator()
object.provide_number(13)
object.provide_operand('-')
object.provide_number(21)
assert object.show_result()[0] == -8
Nie wdając się w szczegóły pisania testów, które opiszę 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:
Kod(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 =======================================
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.