Test Metrics.

Python Code Coverage

Python az egyik legnépszerűbb jelenleg elérhető programozási nyelv. Általános célú jellegéből adódóan a Python számos szoftverfejlesztési felhasználási esetben talál alkalmazást, az egyszerű szkripteléstől kezdve a webszervereken át az olyan keretrendszerekig, mint a Django.

Mindenesetre, mint más programozási nyelvek esetében, a tesztelés a Pythonban is a szoftverfejlesztés egyik legfontosabb szempontja marad.

Ebben a bejegyzésben megnézünk néhány eszközt a Python kód tesztesetek lefedettségének mérésére és írására.

Unittest

A Python szabványkönyvtárában előre be van építve egy unittest nevű modul. A JUnit és más nagyobb programozási nyelvek egységtesztelési keretrendszerei által inspirált unittest egy tesztelési keretrendszer, amely lehetővé teszi a tesztek automatizálását, a tesztek közös beállítását és leállítási kódját és még sok minden mást.

Az unittest egyik fontos funkciója a test fixture, azaz az egy vagy több teszt futtatásához szükséges beállítás és a kapcsolódó takarítási műveletek. A text fixture segítségével az olyan tevékenységek, mint az ideiglenes vagy proxy adatbázisok, könyvtárak létrehozása vagy egy szerverfolyamat elindítása, egyetlen helyen intézhetők.

Vegyünk néhány mintatesztet, és nézzük meg, hogyan valósíthatóak meg az unittest segítségével:

import unittest

class TestStringMethods(unittest.TestCase):

def test_upper(self):
self.assertEqual(‘foo’.upper(), ‘FOO’)

def test_isupper(self):
self.assertTrue(‘FOO’.isupper())
self.assertFalse(‘Foo’.isupper())

def test_split(self):
s = ‘hello world’
self.assertEqual(s.split(), )
# check that s.split sikertelen, ha az elválasztó nem string
with self.assertRaises(TypeError):
s.split(2)

if __name__ == ‘__main__’:
unittest.main()

Teszteset létrehozása az unittest.TestCase alosztályozásával. Ezután metódusokkal definiálhatjuk az egyes teszteket. Vegye figyelembe, hogy a teszteset neveinek a test szóval kell kezdődniük. Ez a névadási konvenció tájékoztatja a tesztfuttatót arról, hogy mely metódusok képviselik a teszteket.

A tesztfuttató az a komponens, amely a tesztek végrehajtását megszervezi, és az eredményt a felhasználó rendelkezésére bocsátja. Megvalósítása változó, használhat grafikus felületet, szöveges felületet, vagy visszaadhat egy speciális értéket a tesztek végrehajtásának eredményének jelzésére.

Pytest

A Pytest egy harmadik féltől származó Python tesztelési keretrendszer. Célja, hogy keretrendszert biztosítson a tesztek hatékony megírásához, eltávolítva a tesztek létrehozásának összes rezsiköltségét. A Pytestet támogatja a Python 2.7, 3.4, 3.5, 3.6, Jython, PyPy-2.3 Unix/Posix és Windows rendszereken.

Nézzük meg, hogyan kezdjünk neki a Pytestnek.Először is töltsük le a legújabb verziót és telepítsük pip segítségével:

pip install -U pytest

A telepített verziót ellenőrizhetjük:

pytest -version

Most vegyünk egy mintafüggvényt és a hozzá tartozó tesztesetet.

# a test_sample.py tartalma
def func(x):
return x + 1def test_answer():
assert func(3) == 5

A func függvény x bemenetet fogad és x + 1 értéket ad vissza. A tesztesetben azt állítjuk, hogy a func függvény 3 bemenetet fogad és 5 értéket ad vissza. Ez a teszteset várhatóan sikertelen lesz. A teszt futtatásához egyszerűen írjuk be a pytest-et abba a könyvtárba, amelyben a test_sample.py fájl található.

$ pytest
=========================== teszt munkamenet indul ============================
platform linux – Python 3.x.y, pytest-3.x.y, py-1.x.y, pluggy-0.x.y
rootdir: $REGENDOC_TMPDIR, inifile:
collected 1 itemtest_sample.py F ================================= FAILURES =================================
_______________________________ test_answer ________________________________

def test_answer():
> assert func(3) == 5
E assert 4 == 5
E + ahol 4 = func(3)

test_sample.py:5: AssertionError
========================= 1 failed in 0.12 seconds =========================

Coverage.py

Coverage.py az egyik legnépszerűbb kódlefedettségi eszköz Pythonhoz. A Python szabványos könyvtárában található kódelemző eszközöket és nyomkövetési horgokat használja a lefedettség mérésére. A CPython, PyPy, Jython és IronPython főbb verzióin fut. A Coverage.py-t mind az unittesttel, mind a Pytesttel használhatja.

A Coverage legújabb verzióját letöltheti és kézzel telepítheti, vagy telepítheti a pip segítségével mint:

$ pip install coverage

Most futtassa a programját a coverage segítségével mint

$ coverage run my_program.py arg1 arg2

A következő lépésben a lefedettségi adatok kinyeréséhez hajtsa végre

$ coverage report -m

Itt egy minta a lefedettségi adatok kimenetéről

$ coverage report -m
Name Stmts Miss Cover Missing
——————-
my_program.py 20 4 80% 33-35, 39
my_other_module.py 56 6 89% 17-23
——————-
TOTAL 76 10 87%

A jelentés generálása html fájlban:

$ coverage html

Ez a Coverage.py által generált HTML jelentés mintája. Tartalmazza a Modul, utasítások, hiányzó, kizárt, ágak, részleges és a lefedettséget.

Pytest-cov

A Pytest-cov egy Python plugin a lefedettségi jelentések generálásához. A coverage parancs által támogatott funkcionalitások mellett támogatja a központosított és az elosztott tesztelést is. Támogatja az alfolyamatok lefedettségét is.

Mihelyt a Pytest segítségével megírta a szükséges teszteseteket, a Pytest-cov segítségével lefuttathatja az összes tesztet és jelentést készíthet a lefedettségről.

Az induláshoz telepítse a Pytest-cov-ot a következőképpen:

$ pip install pytest-cov

Centralizált tesztelés

A központosított tesztelés a főfolyamat és az összes alfolyamat együttes lefedettségét jelenti. A központosított tesztelést a következővel futtathatjuk:

$ py.test -cov= tests/

elosztott tesztelés

A pytest-xdist telepítése, az elosztott rendszerek támogatásához:

$ pip install pytest-xdist

A elosztott tesztelés kétféle üzemmódban végezhető, a dist beállítása load és each. Load-ra állítva az összes slave együttes lefedettségét jelenti az elosztott tesztelés során. A slave-ek tetszőleges számú hoszton oszthatók el, és minden slave bárhol elhelyezkedhet a fájlrendszeren. Minden egyes szolga alfolyamatai mérésre kerülnek.

A pytest-cov az elosztott tesztelés során mindkét módban az összes szolga együttes lefedettségéről is jelentést készít. Mivel minden szolga az összes tesztet futtatja, ez lehetővé teszi egy kombinált lefedettségi jelentés generálását több környezetre

Összefoglalás

Ebben a bejegyzésben megismerkedtünk a különböző Python egységtesztelési és kódlefedettségi keretrendszerekkel. Bár ezek a keretrendszerek megkönnyítik a tesztelési folyamatot, a teszteket továbbra is meg kell írni. Íme néhány legjobb gyakorlat, amit figyelembe kell vennünk az egységtesztek írása során.

  • Hosszú, leíró neveket használjunk. Ez gyakran szükségtelenné teszi a tesztmódszerekben szereplő tanításokat.
  • A teszteknek izoláltnak kell lenniük. Ne lépjenek kölcsönhatásba valódi adatbázissal vagy hálózattal. Használjon külön tesztadatbázist, amelyet leszerelnek, vagy használjon mock objektumokat.
  • Fókuszáljon a funkcionalitás egy aprócska darabjára.
  • A tesztnek gyorsnak kell lennie, de egy lassú teszt jobb, mint a teszt hiánya.
  • Gyakran van értelme, ha egyetlen teszteset osztálya van egyetlen osztályhoz vagy modellhez.

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.