6. gyakorlat¶
Szerkesztés alatt!
Az oldal további része szerkesztés alatt áll, a tartalma minden további értesítés nélkül többször, gyakran, jelentősen megváltozhat!
Library-k és virtuális környezetek¶
Csomagkezelés¶
Egy program futtatásához elég gyakran van szükség előre megírt library-kre, csomagokra.
Bizonyos rendszereken ezeket a csomagokat rendszer szinten tudjuk telepíteni.
Van viszont a Python-nak egy "saját" csomagkezelője, a pip
(vagy pip3
), melynek segítségével egyszerűen tudjuk az egyes Python csomagokat telepíteni (már ha a rendszer ezt engedi):
pip
csomagkezelő használata
1 2 3 4 |
|
A pip install PACKAGE
telepíteni fogja a PACKAGE
nevű legújabb verzióját, és az összes szükséges függőségét.
A pip list
listázza az adott környezetben telepített csomagokat.
A pip freeze
szintén a telepített csomagok neveit és pontos verzióját listázza olyan módon, hogy a kimenetét pl. egy requirements.txt
fájlba mentve a pip install -r requirements.txt
parancs (egy eredetileg "üres" környezetben kiadva) vissza tudja állítani a pontos környezetet.
Virtuális környezetek¶
Egy program futtatásához néha egész különleges bolygóegyüttállások szükségesek. Egy adott gépen futtatandó különböző programok különféle library-ket, sőt, azok különböző verzióit használhatják. Ha a gépen központilag telepítjük ezen library-ket, akkor lesz olyan programunk, amely az adott központi környezetben nem tud futni.
A megoldás a virtuális környezetek használata lehet.
A virtuális környezet használata
1 2 3 4 |
|
A python -m venv VENVNAME
parancs létrehoz egy VENVNAME
könyvtárat, benne egy virtuális környezetet.
(Erre a virtualenv
parancs is használható, ha telepítve van.)
Ezt a környezetet a . VENVNAME/bin/activate
(vagy source VENVNAME/bin/activate
) parancs segítségével tudjuk aktiválni Unix típusú rendszerek (Linux/MacOS) alatt, Windows alatt pedig a VENVNAME\Scripts\activate
paranccsal.
Ezek után bármilyen, a fejlesztői környezetet megváltoztató parancs (pl. pip install
) ebben a virtuális környezetben lesz érvényes.
A környezetet a deactivate
paranccsal tudjuk elhagyni.
Feladat: Virtuális környezet használata
Készíts egy virtuális környezetet, és aktiváld!
Telepítsd a rich
Python csomagot!
Futtasd a következő main_rich.py programot:
1 2 3 4 |
|
Python hibakezelés¶
TODO: try
, except
, finally
, else
Tesztelés¶
Mi a tesztelés?
A tesztelés az a tevékenység, amikor megnézzük, hogy ez elkészített szoftver megfelelően működik-e.
Az előző mondat kezdetnek nem rossz, de nem igaz: a tesztelés ennél sokkal-sokkal több, rengeteg formája, módja, szintje van. Tesztelés (verifikáció) az is, ha az első mondatnak megfelelően egy adott inputra lefuttatom a programomat, és megnézem, hogy a kapott eredmény az-e, amit vártam, de az is, ha átnézem a másik fejlesztő kódját (futtatás nélkül), hogy találok-e hibát valamelyik függvény megvalósításában. Ahogyan a követelményspecifikáció átnézése vagy a követelményeknek megfelelő program éles környezetben való kipróbálása is tesztelési tevékenység (validáció).
Alapelv, hogy a tesztelést minél korábban el kell kezdeni. Egy (szűken értelmezett) programozó esetében ez azt jelenti, hogy a megírt kódot minél hamarabb tesztelni kell, még akár az előtt, hogy a szoftver többi része is elkészülne. Vagyis, amint a szoftver egy részével, önálló egységével (ami a mi esetünkben most függvényt fog jelenteni, de lehetne akár osztály is) elkészülünk, azt -- a szoftver többi egységétől függetlenül -- le kell tesztelni. Ez az egységteszt, és ez programozói feladat (merthogy például egy függvény teszteléséhez kódra van szükség, olyan kódra, ami meghívja a függvényt és ellenőrzi az eredményét).
Ahhoz viszont, hogy a szoftver megfelelő legyen, ezeknek az egységeknek nem csak önmagukban kell jól működniük, hanem más egységekkel is megfelelően kell együttműködniük. Ezt szintén le kell ellenőrizni, úgynevetezz egység-integrációs tesztek segítségével. Ez még szintén eléggé forrásközeli dolog, tehát általában programozói feladat.
Az egység és egység-integrációs tesztelés között a gyakorlatban nincs éles határvonal. A valódi egységtesztekre rendkívül szigorú (elméleti) elkülönítési szabályok vonatkoznak, amiket a gyakorlatban egész egyszerűen nem mindig éri meg betartani.
Egységteszt keretrendszerek¶
Bárki tud olyan programot írni, amely meghív egy függvényt, és leellenőrzi annak visszatérési értéket; vagyis bárki tud egységtesztet készíteni. De ha rengeteg tesztelendő egységünk (függvényünk) van, akkor ez a program nagyon sok dolgot kell, hogy csináljon, a bővítése, módosítása igencsak nehézkessé válhat. Erre a problémára találták ki az egységteszt keretrendszereket. Ezek olyan library-k, amelyek lehetővé teszik a fejlesztő/tesztelő számára, hogy a lényegre, azaz a tesztesetek megírására koncentráljanak, az olyan dolgokat pedig, mint a tesztesetek összegyűjtése, lefuttatása, az eredmények összegyűjtése és mindenféle fancy riportok generálása, már egységesen a keretrendszer adja.
Különböző nyelvekhez különböző keretrendszerek vannak, Java-hoz például a JUnit, C-hez a CUnit, C++-hoz a cppunit vagy a gtest. Python-hoz többek között a unittest és pytest modulok használhatók. Utóbbi könnyen használható objektumorientált programozás nélkül is, ezért most ezzel fogunk kicsit jobban megismerkedni.
Pytest¶
A pytest modult a pip install pytest
paranccsal lehet telepíteni, telepítés után pedig a python -m pytest
paranccsal lehet futtatni.
A parancs futtatása után a pytest megkeresi a test_AKÁRMI
nevű függvényeket, és ezeket egységtesztként lefuttatja.
Az ilyen függvényekben kell, hogy legyen (legalább) egy assert
utasítás, ami a teszt ellenőrzését végzi.
Ha ennek az utasításnak az argumentuma hamis(ra értékelődik ki), akkor a teszt "bukik" vagy "törik"; ezt a pytest észleli és megjegyzi, az összes teszt lefuttatása után pedig egy riportot kapunk arról, hogy hány teszt és milyen eredményekkel (pass, fail, error) lett futtatva.
Ha a pytest egy fájlt kap paraméterként, akkor ebben keresi a tesztfüggvényeket.
Ha egy mappát kap, akkor ebben keresi a test_*.py
nevű fájlokat, és ezekben a tesztfüggvényeket.
Ha nem kap paramétert, akkor a test
nevű mappában kezd el keresgélni.
Feladat: készíts teszteket a chess
modulhoz
Adott a következő -- fejlesztés alatt álló, nem kész -- chess
python package:
chess/init.py
1 2 3 4 5 6 7 8 9 10 11 |
|
chess/board.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
|
chess/constants.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
|
chess/figures.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
|
Adott továbbá a csomaghoz pár kezdeti teszt:
test/test_figures.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
|
Először futtasd a teszteket a python -m pytest
paranccsal!
Milyen eredménnyel futottak a tesztek?
Készíts további teszteket a chess.figures
modul függvényeinek tesztelésére!
Próbáld meg kijavítani a modult, ha a tesztek alapján hibás!