Podstawy testów jednostkowych w Pythonie cz.2

Na podstawie napisanego skryptu testującego możemy napisać plik employee.py tzn.

class Employee():
    bonus = 0

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary
    
    def get_email(self):
        pass

    def set_bonus(self, bonus):
        pass

    def get_full_salary(self):
        pass

    @classmethod
    def from_full_name(cls, first_name, last_name, salary):
        name = '{}.{}'.format(first_name, last_name)
        return cls(name, salary)

Tak utworzony zrąb klasy Employee po uruchomieniu testów generuje 2 niepowodzenia w przeprowadzonych testach (pomimo obecności kilku asercji w jednym teście). Uzupełnienie metod klasy Employee spowoduje poprawne przejście 2 testów tzn.

class Employee():
    bonus = 0

    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def get_email(self):
        return '{}@company.com'.format(self.name)

    def set_bonus(self, bonus):
        self.bonus = bonus

    def get_full_salary(self):
        return self.salary + self.salary * self.bonus / 100

    @classmethod
    def from_full_name(cls, first_name, last_name, salary):
        name = '{}.{}'.format(first_name, last_name)
        return cls(name, salary)

Oprócz sprawdzania równości assertEqual(x, y) możemy sprawdzać różnego rodzaju asercje np.

  • assertNotEqual(x, y) #sprawdza, czy x != y
  • assertIsNone(x) #sprawdza, czy x jest wartością None
  • assertTrue(x) #sprawdza czy bool(x) jest wartością True

Metoda setUp() z modułu unittest jest uruchamiana każdorazowo przed wykonaniem kolejnego testu. Podobnie istnieje metoda tearDown(), która jest wykonywana po zakończeniu każdego testu.

Istnieją również metody klasowe setUpClass() oraz tearDownClass(), które są uruchamiane przed rozpoczęciem i po zakończeniu wszystkich testów np. w celu zainicjowania a następnie zamknięcia połączenia z bazą danych.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *