Testování jednotek pomocí modulu unittest Pythonu

Žádný dobrý vývojář nenasadí kód bez důkladného testování. Unit testing je proces testování jednotlivých modulů velkého programu.

Tento článek pojednává o tom, jak můžete provést testování jednotek kódu pomocí modulu unittest Pythonu. Nejprve si ujasněme, jaké jsou typy testování.

Pokud jde o testování, existuje ruční testování a automatické testování. Manuální testování je testovací technika, kdy lidé provádějí test ručně po dokončení vývoje. Automatizované testování je testovací technika, kdy programy provádějí test automaticky a dávají nám výsledky.

Pochopili byste, že ruční testování zabírá čas a je těžké ho provést. Vývojáři tedy píší kód pro provádění testů (automatické testování). V automatizovaném testování existují různé druhy testování. Některé z nich jsou testování jednotek, integrační testování, end-to-end testování, zátěžové testování atd.,

Podívejme se na standardní průběh testování.

  • Napište nebo aktualizujte kód.
  • Napište nebo aktualizujte testy pro různé případy vašeho kódu.
  • Spusťte testy (buď ručně nebo pomocí testovacího běhu).
  • Podívejte se na výsledky testu. Pokud se vyskytnou nějaké chyby, opravte je a opakujte kroky.

Zde budeme diskutovat o nejzákladnějším a základním typu testování nazývaném testování jednotek. Bez dalších okolků se pojďme ponořit do skutečného tutoriálu.

Co je Unit Testing?

Unit testing je technika pro testování malého bloku nezávislého kódu. Malý blokový kód bude ve většině případů funkcí. Slovo nezávislý znamená, že nezávisí na jiných částech kódu v projektu.

Řekněme, že musíme zkontrolovat, zda je řetězec roven „etechblog.cz“ nebo ne. Za tímto účelem jsme napsali funkci, která vezme jeden argument a vrátí, zda je roven „etechblog.cz“ nebo ne.

def is_equal_to_geekflare(string):
	return string == "etechblog.cz"

Výše uvedená funkce není závislá na žádném jiném kódu. Můžeme to tedy otestovat nezávisle zadáním různých vstupů. Nezávislý kus kódu lze použít v celém projektu.

Význam Unit testování

Obecně platí, že kód nezávislých bloků lze použít v celém projektu. Takže to musí být dobře napsané a otestované. Unit testy jsou testy používané k testování těchto typů nezávislých bloků kódu. Co se stane, když pro náš projekt nepoužijeme unit testy?

  Odeslání můžete vrátit zpět v aplikaci Outlook, stejně jako v Gmailu

Předpokládejme, že jsme netestovali malé bloky kódu, které se používají v celém projektu. Všechny ostatní testy, jako jsou integrační testy, end-to-end testy atd., používající další malé bloky kódu, mohou selhat. Tím se aplikace přeruší. Proto je třeba dobře otestovat základní stavební kameny kódu.

Nyní víme, jak je důležité testování jednotek a písemné testy jednotek pro všechny nezávislé bloky kódu. Vzhledem k tomu, že jsme provedli unit testy, další testy, jako jsou integrační testy, end-to-end testy atd., se nezdaří kvůli nezávislému bloku kódů.

V následujících částech uvidíme, co je modul unittest v Pythonu a jak používáme modul unittest k psaní unit testů v Pythonu.

Poznámka: Předpokládáme, že jste obeznámeni s třídami, moduly atd. Pythonu. Pokud neznáte středně pokročilé koncepty Pythonu, jako jsou třídy, moduly atd., může být pro vás obtížné porozumět nadcházejícím oddílům.

Co je unittest Pythonu?

Python unittest je vestavěný testovací rámec pro testování kódu Pythonu. Má testovací běžec, který nám umožňuje provádět testy bez velkého úsilí. Můžeme tedy použít vestavěný modul unittest pro testování bez použití modulů třetích stran. Ale mění se na základě vašich požadavků. Vestavěný modul unittest je dobré začít s testováním v Pythonu.

Při testování kódu Pythonu pomocí modulu unittest musíme postupovat podle níže uvedených kroků.

#1. Napište kód.

#2. Importujte modul unittest.

#3. Vytvořte soubor začínající testem klíčových slov. Například test_prime.py. Klíčové slovo test se používá k identifikaci testovacích souborů.

#4. Vytvořte třídu rozšiřující třídu unittest.TestCase.

#5. Napište metody (testy) uvnitř třídy. Každá metoda obsahuje různé testovací případy na základě vašeho požadavku. Metodu musíme pojmenovat začínající klíčovým slovem test.

#6. Spusťte testy. Testy můžeme provádět různými způsoby.

  • Spusťte příkaz python -m unittest test_filename.py.
  • Testovací soubory spouštíme jako obecné Python soubory pomocí příkazu python test_filename.py. Aby tato metoda fungovala, musíme v testovacím souboru vyvolat hlavní metodu unittestu.
  • A nakonec pomocí objevu. Testy můžeme automaticky spouštět pomocí příkazu python -m unittest discover bez uvedení názvu souboru testu. Najde testy pomocí konvence pojmenování, kterou jsme dodržovali. Musíme tedy pojmenovat naše testovací soubory klíčovým slovem test při spuštění.
  5 nejlepších školicích kurzů Microsoft Teams pro týmové administrátory

Obecně při testování porovnáváme výstup kódu s očekávaným výstupem. Pro porovnání výstupů tedy unittest poskytuje různé metody. Seznam srovnávacích funkcí naleznete tady.

Snadno je bez problémů pochopíte. Jsou přímočaré.

To je hodně teorie. Nyní se musíme pustit do kódování.

Poznámka: Pokud máte nějaké dotazy ohledně modulu unittest, můžete přejít na stránku dokumentace a vyjasněte své pochybnosti. Bez dalšího zdržování použijme modul unittest.

Unit Testy v Pythonu pomocí unittestu

Nejprve napíšeme nějaké funkce a poté se zaměříme na psaní testů. Nejprve otevřete složku ve svém oblíbeném editoru kódu. A vytvořte soubor s názvem utils.py. Vložte následující kód do souboru.

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

V souboru utils.py máme tři různé funkce. Nyní musíme každou funkci otestovat v různých testovacích případech. Pojďme napsat testy pro první funkci is_prime.

#1. Ve vzorové složce vytvořte soubor s názvem test_utils.py jako utils.py.

#2. Importujte modul utils a unittest.

#3. Vytvořte třídu s názvem TestUtils rozšiřující třídu unittest.TestCase. Název třídy může být jakýkoli. Zkuste dát třídě smysluplný název.

#4. Uvnitř třídy napište metodu nazvanou test_is_prime, která akceptuje self jako argument.

#5. Napište různé testovací případy s argumenty pro is_prime a porovnejte výstup s očekávaným výstupem.

#6. Příklad testovacího případu self.assertFalse(utils.is_prime(1)).

#7. Očekáváme, že výstup is_prime(1) bude ve výše uvedeném případě nepravdivý.

#8. Podobně jako ve výše uvedeném případě provedeme různé testovací případy na základě funkce, kterou testujeme.

  Co jsou to sluchátka Dolby Dimension?

Podívejme se na 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()

Vyvoláváme hlavní metodu unittest modulu ke spuštění testů pomocí příkazu python filename.py. Nyní spusťte testy.

Uvidíte výstup podobný výstupu níže.

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

OK

Nyní zkuste napsat testovací případy i pro další funkce. Vymyslete různé případy funkcí a napište pro ně testy. Podívejte se na následující testy, které jsou přidány k výše uvedené třídě.

...


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("etechblog.cz"), "Hello, etechblog.cz")
        self.assertEqual(utils.say_hello("Chandan"), "Hello, Chandan")
        self.assertNotEqual(utils.say_hello("Chandan"), "Hi, Chandan")
        self.assertNotEqual(utils.say_hello("Hafeez"), "Hi, Hafeez")


...

Použili jsme pouze některé porovnávací funkce z modulu unittest. Kompletní seznam najdete tady.

Naučili jsme se psát unit testy pomocí modulu unittest. Nyní je čas podívat se na různé způsoby spuštění testů.

Jak spustit testy pomocí unittest

Ve výše uvedené části jsme již viděli způsob, jak spustit testovací případy. Podívejme se na další dva způsoby spuštění testů pomocí modulu unittest.

#1. Pomocí názvu souboru a modulu unittest.

V této metodě použijeme ke spuštění testů modul unittest a název souboru. Příkaz pro spuštění testů je python -m unittest filename.py. V našem případě je příkaz ke spuštění testů python -m unittest test_utils.py.

#2. Pomocí metody discover

Použijeme metodu discover modulu unittest k automatické detekci všech testovacích souborů a jejich spuštění. Abychom automaticky detekovali testovací soubory, musíme je pojmenovat počínaje testem klíčových slov.

Příkaz ke spuštění testů pomocí metody discover je python -m unittest discover. Příkaz detekuje všechny soubory, jejichž názvy začínají na test, a spustí je.

Závěr 👩‍💻

Unit testy jsou základním testováním ve světě programování. V reálném světě existuje spousta dalších testů. Zkuste se je naučit jeden po druhém. Doufám, že vám tento tutoriál pomůže napsat základní testy v Pythonu pomocí modulu unittest. Existují knihovny třetích stran jako pytest, Robot Framework, nose, nose2, slash atd. Můžete je prozkoumat na základě požadavků vašeho projektu.

Příjemné testování 😎

Také by vás mohly zajímat Otázky a odpovědi na rozhovory v Pythonu.