Testowanie jednostkowe za pomocą modułu testów jednostkowych Pythona

Żaden dobry programista nie wdraża kodu bez dokładnych testów. Testowanie jednostkowe to proces testowania poszczególnych modułów dużego programu.

W tym artykule omówimy, jak wykonać testy jednostkowe kodu za pomocą modułu testu jednostkowego Pythona. Najpierw zrozummy, jakie są rodzaje testów.

Jeśli chodzi o testowanie, istnieje testowanie ręczne i testowanie automatyczne. Testowanie ręczne to technika testowania, w której ludzie wykonują test ręcznie po zakończeniu opracowywania. Testowanie automatyczne to technika testowania, w której programy automatycznie wykonują test i przekazują nam wyniki.

Zrozumiałbyś, że ręczne testowanie jest czasochłonne i trudne do wykonania. Deweloperzy piszą więc kod do wykonywania testów (testy automatyczne). W testowaniu automatycznym istnieją różne rodzaje testów. Niektóre z nich to testowanie jednostkowe, testowanie integrujące, testowanie od końca do końca, testowanie warunków skrajnych itp.,

Zobaczmy standardowy przebieg testowania.

  • Napisz lub zaktualizuj kod.
  • Napisz lub zaktualizuj testy dla różnych przypadków dla Twojego kodu.
  • Uruchom testy (ręcznie lub za pomocą testera).
  • Zobacz wyniki testu. Jeśli są jakieś błędy, napraw je i powtórz kroki.

Tutaj omówimy najistotniejszy i podstawowy typ testowania zwany testowaniem jednostkowym. Bez zbędnych ceregieli przejdźmy do samouczka.

Co to jest testowanie jednostkowe?

Testowanie jednostkowe to technika testowania małego bloku niezależnego kodu. Kod małego bloku będzie w większości przypadków funkcją. Słowo niezależny oznacza, że ​​nie zależy od innych fragmentów kodu w projekcie.

Powiedzmy, że musimy sprawdzić, czy ciąg jest równy „newsblog.pl”, czy nie. W tym celu napisaliśmy funkcję, która pobiera jeden argument i zwraca, czy jest on równy „newsblog.pl”, czy nie.

def is_equal_to_geekflare(string):
	return string == "newsblog.pl"

Powyższa funkcja nie jest zależna od żadnego innego kodu. Możemy więc przetestować go niezależnie, podając różne dane wejściowe. Niezależny fragment kodu może być używany w całym projekcie.

Znaczenie testów jednostkowych

Ogólnie rzecz biorąc, niezależny kod blokowy może być używany w całym projekcie. Musi więc być dobrze napisany i przetestowany. Testy jednostkowe to testy używane do testowania tych typów niezależnych bloków kodu. Co się stanie, jeśli nie użyjemy testów jednostkowych w naszym projekcie?

Załóżmy, że nie testowaliśmy małych bloków kodu, które są używane w całym projekcie. Wszystkie inne testy, takie jak testy integracyjne, testy typu end-to-end itp., wykorzystujące inne małe bloki kodu, mogą zakończyć się niepowodzeniem. To psuje aplikację. Dlatego podstawowe elementy kodu muszą być dobrze przetestowane.

Teraz wiemy, jak ważne są testy jednostkowe i pisemne testy jednostkowe dla wszystkich niezależnych bloków kodu. Ponieważ wykonaliśmy testy jednostkowe, inne testy, takie jak testy integracyjne, testy end-to-end itp., nie zakończą się niepowodzeniem z powodu niezależnego bloku kodów.

W kolejnych sekcjach zobaczymy, czym jest moduł test jednostkowy Pythona i jak używamy modułu testowego do pisania testów jednostkowych w Pythonie.

Uwaga: Zakładamy, że znasz klasy, moduły itp. Pythona. Jeśli nie znasz pojęć pośrednich Pythona, takich jak klasy, moduły itp., zrozumienie kolejnych rozdziałów może być trudne.

Co to jest test jednostkowy Pythona?

Python unittest to wbudowana platforma testowa do testowania kodu Pythona. Posiada runner testowy, który pozwala na przeprowadzanie testów bez większego wysiłku. Możemy więc użyć wbudowanego modułu unittest do testowania bez korzystania z modułów innych firm. Ale zmienia się w zależności od twoich wymagań. Wbudowany moduł unittest jest dobry do rozpoczęcia testowania w Pythonie.

Musimy wykonać poniższe kroki, aby przetestować kod Pythona za pomocą modułu unittest.

#1. Napisz kod.

#2. Zaimportuj moduł testów jednostkowych.

#3. Utwórz plik, zaczynając od testu słów kluczowych. Na przykład test_prime.py. Słowo kluczowe test służy do identyfikacji plików testowych.

#4. Utwórz klasę rozszerzającą klasę unittest.TestCase.

#5. Napisz metody (testy) wewnątrz klasy. Każda metoda zawiera różne przypadki testowe w zależności od wymagań. Musimy nazwać metodę zaczynając od słowa kluczowego test.

#6. Uruchom testy. Testy możemy przeprowadzić na różne sposoby.

  • Uruchom polecenie python -m unittest test_filename.py.
  • Uruchamiamy pliki testowe, takie jak ogólne pliki Pythona, za pomocą polecenia python nazwa_pliku.py. Aby ta metoda działała, musimy wywołać główną metodę testu jednostkowego w pliku testowym.
  • I wreszcie, korzystając z odkrycia. Możemy automatycznie uruchomić testy za pomocą polecenia python -m unittest discover bez podawania nazwy pliku testu. Znajdzie testy przy użyciu konwencji nazewnictwa, którą zastosowaliśmy. Dlatego na początku musimy nazwać nasze pliki testowe słowem kluczowym test.

Generalnie podczas testowania porównujemy wyjście kodu z oczekiwanym wyjściem. Tak więc, aby porównać wyniki, test jednostkowy zapewnia różne metody. Możesz znaleźć listę funkcji porównujących tutaj.

Możesz je łatwo zrozumieć bez żadnych trudności. Są proste.

To dużo teorii. Musimy teraz zająć się kodowaniem.

Uwaga: Jeśli masz jakiekolwiek pytania dotyczące modułu testu jednostkowego, możesz przejść do dokumentacja i rozwiej swoje wątpliwości. Bez dalszej zwłoki skorzystajmy z modułu unittest.

Testy jednostkowe w Pythonie przy użyciu unittest

Najpierw napiszemy kilka funkcji, a potem skupimy się na pisaniu testów. Najpierw otwórz folder w swoim ulubionym edytorze kodu. I utwórz plik o nazwie utils.py. Wklej następujący kod do pliku.

import math


def is_prime(n):
    if n < 0:
        return 'Negative numbers are not allowed'

    if n <= 1:
        return False

    if n == 2:
        return True

    if n % 2 == 0:
        return False

    for i in range(2, int(math.sqrt(n)) + 1):
        if n % i == 0:
            return False
    return True


def cubic(a):
    return a * a * a


def say_hello(name):
    return "Hello, " + name

W pliku utils.py mamy trzy różne funkcje. Teraz musimy przetestować każdą funkcję w różnych przypadkach testowych. Napiszmy testy dla pierwszej funkcji is_prime.

#1. Utwórz plik o nazwie test_utils.py w przykładowym folderze jako utils.py.

#2. Zaimportuj narzędzia i moduł testów jednostkowych.

#3. Utwórz klasę o nazwie TestUtils rozszerzającą klasę unittest.TestCase. Nazwa klasy może być dowolna. Spróbuj nadać klasie znaczącą nazwę.

#4. Wewnątrz klasy napisz metodę o nazwie test_is_prime, która przyjmuje self jako argument.

#5. Napisz różne przypadki testowe z argumentami do is_prime i porównaj dane wyjściowe z oczekiwanymi danymi wyjściowymi.

#6. Przykładowy przypadek testowy self.assertFalse(utils.is_prime(1)).

7. Spodziewamy się, że wyjście is_prime(1) będzie fałszywe w powyższym przypadku.

#8. Podobnie jak w powyższym przypadku, będziemy różne przypadki testowe w zależności od testowanej funkcji.

Zobaczmy testy.

import unittest

import utils


class TestUtils(unittest.TestCase):
    def test_is_prime(self):
        self.assertFalse(utils.is_prime(4))
        self.assertTrue(utils.is_prime(2))
        self.assertTrue(utils.is_prime(3))
        self.assertFalse(utils.is_prime(8))
        self.assertFalse(utils.is_prime(10))
        self.assertTrue(utils.is_prime(7))
        self.assertEqual(utils.is_prime(-3),
                         "Negative numbers are not allowed")


if __name__ == '__main__':
    unittest.main()

Wywołujemy główną metodę unittest modułu, aby uruchomić testy za pomocą polecenia python nazwapliku.py. Teraz uruchom testy.

Zobaczysz wynik podobny do poniższego.

$ python test_utils.py 
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK

Teraz spróbuj napisać przypadki testowe również dla innych funkcji. Pomyśl o różnych przypadkach dla funkcji i napisz dla nich testy. Spójrz na poniższe testy, które zostały dodane do powyższej klasy.

...


class TestUtils(unittest.TestCase):
    def test_is_prime(self):
        ...

    def test_cubic(self):
        self.assertEqual(utils.cubic(2), 8)
        self.assertEqual(utils.cubic(-2), -8)
        self.assertNotEqual(utils.cubic(2), 4)
        self.assertNotEqual(utils.cubic(-3), 27)

    def test_say_hello(self):
        self.assertEqual(utils.say_hello("newsblog.pl"), "Hello, newsblog.pl")
        self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan")
        self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan")
        self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez")


...

Użyliśmy tylko niektórych funkcji porównujących z modułu unittest. Możesz znaleźć pełną listę tutaj.

Nauczyliśmy się pisać testy jednostkowe za pomocą modułu unittest. Teraz nadszedł czas, aby zobaczyć różne sposoby przeprowadzania testów.

Jak uruchamiać testy za pomocą unittest

Widzieliśmy już sposób na uruchomienie przypadków testowych w powyższej sekcji. Zobaczmy dwa pozostałe sposoby uruchamiania testów za pomocą modułu unittest.

#1. Używając nazwy pliku i modułu unittest.

W tej metodzie do uruchomienia testów użyjemy modułu unittest i nazwy pliku. Polecenie do uruchomienia testów to python -m unittest nazwapliku.py. W naszym przypadku poleceniem do uruchomienia testów jest python -m unittest test_utils.py.

#2. Korzystanie z metody odkrywania

Użyjemy metody Discover modułu unittest, aby automatycznie wykryć wszystkie pliki testowe i uruchomić je. Aby automatycznie wykryć pliki testowe, musimy nazwać je zaczynając od słowa kluczowego test.

Polecenie do uruchomienia testów przy użyciu metody Discover to python -m unittest discover. Polecenie wykryje wszystkie pliki, których nazwy zaczynają się od test i wykona je.

Wniosek 👩‍💻

Testy jednostkowe to podstawowe testy w świecie programowania. W prawdziwym świecie jest wiele innych testów. Postaraj się nauczyć ich jeden po drugim. Mam nadzieję, że ten samouczek pomoże ci pisać podstawowe testy w Pythonie za pomocą modułu unittest. Istnieją biblioteki innych firm, takie jak pytest, Robot Framework, nose, nose2, slash itp. Możesz je przeglądać na podstawie wymagań projektu.

Miłego testowania 😎

Możesz być także zainteresowany Pytaniami i Odpowiedziami na Wywiad w Pythonie.