4. Technikai megvalósítás & tesztelési terv - SoosSarolta/ITSecHW_Virucid GitHub Wiki
Az alábbiakban az online webshop megvalósításának technikai részleteit és technológiai döntéseit tárgyaljuk, kitérve arra is, hogy az egyes komponenseket milyen eszközökkel és módszerekkel tervezzük tesztelni.
Az egyedi formátumú CAFF fájlok feldolgozását, illetve parsolását végző natív komponenst teljesítménymegfontolásból C++ nyelven valósítjuk meg. Ezen egység feladatai közé tartozik a CAFF fájlból egy előnézet generálása is, melyet a webshopban a képek közötti tallózáskor jelenítünk meg.
Az egyes animált képek, illetve a rendszer felhasználóinak információit MySQL adatbázisban tervezzük tárolni, melyhez JavaSpring technológia segítségével férhetünk hozzá. A távoli szolgáltatáshoz továbbá egy Angular webes kliens is tartozni fog, mely főként a felhasználói interakciók kezeléséért, illetve a megjelenítésért lesz felelős.
Az egyes komponensek implementálása során igyekszünk majd az adott nyelvben elfogadott legjobb gyakorlatokat követni. Mint minden programozási nyelv, a C++ is számtalan kódolási standard-ot definiál. Ezek legfőbb célja egy olyan szabályrendszer felállítása, melynek követésével a fejlesztők biztonságosabb módon, gyorsabban és magabiztosabban valósíthatják meg az ötleteiket. Számítógép-biztonság tárgy révén, ezen dokumentumban mi most a teljes készletből néhány biztonsági szempontból is fontos best practise-t emelnénk ki, melyeket a szoftver megvalósítása során is szeretnénk majd szem előtt tartani:
- Használjunk const módosítót: Egy konstans változó vagy függvény megváltoztathatatlan (immutable); így a compiler könnyebben optimalizál, a fejlesztő számára pedig egyértelműen látszik, ha egy függvénynek mellékhatása van. Mindemellett, a const & típus alkalmazása megelőzi, hogy a compiler feleslegesen másoljon adatot.
- Ha egy függvény visszatérési értékét csak kiolvassuk, vagy megfigyeljük, adjunk vissza referenciát, vagy const & típusú változót. Továbbá, szálbiztosság szempontjából mindig jobb, ha érték szerint térünk vissza.
- A memóriaszivárgás elkerülése érdekében mindig óvakodjunk a nyers, explicit memóriahozzáféréstől.
- A C típusú tömbök helyett használjunk std::array és std::vector típusokat.
- Alkalmazzunk exception-öket, hogy a hibák ne kerüljék el a figyelmünket.
- A C stílusú cast helyett alkalmazzunk static, illetve dynamic cast-olást.
Az Angular keretrendszer segítségével a webfejlesztés számos kényelmetlen problémájától megszabadulhatunk. Az említett nyelv az egyik leggyorsabban fejlődő és legelterjedtebb rendszer, melynek használatával front-end, cross-platform webalkalmazások készíthetők. Mindemellett számos kész megoldást is biztosít; mint például a routing szolgáltatás, a függőséginjektálás, vagy az űrlapkezelés. Használata rákényszerít a TypeScript nyelv alkalmazására, amely statikusan típusos, így könnyebben elkerülhetőek a futásidejű hibák. Eme széleskörű funkcionalitása miatt az Angular kiváló jelölt vállalati megoldásokhoz is, azonban ahhoz, hogy a segítségével készült alkalmazások jó minőségűek legyenek, néhány jó gyakorlat követése elengedhetetlen: A fejlesztés kezdetétől fogva fontos szem előtt tartani, hogy a kód strukturált és rendezett maradjon. A házi feladat projekt során igyekszünk ügyelni arra, hogy javítsuk a kód olvashatóságát, skálázhatóságát, karbantarthatóságát és nem utolsó sorban a teljesítményét. Mindezek segítenek, hogy minimalizálhassuk a debuggolással eltöltött időt. Az alábbiakban néhány olyan Angular kódolási standardot sorolunk fel, melyek megkönnyítik az alkalmazások implementálását:
- Minden komponens csakis egy szerepkörért legyen felelős. Komponensenként ajánlott maximum 500 soros kódot írni. A felelősségekre bontás segíti a verziókövetést, illetve a csapattagok közötti kényelmes munkafelosztást is.
- A függvények legyenek minél rövidebbek a könnyebb tesztelhetőség érdekében. Így a rejtett hibák száma is csökken.
- Használjunk a fejlesztés során TSLintet, amely egy statikus kódanalizáló eszköz, s segítségével megnézhetjük, hogy a megfelelő coding rule-ok teljesülnek-e.
- Az RxJS beépített könyvtár megkönnyíti a munkát, ha aszinkron adatfolyamokkal dolgozunk.
- Lazy Loading támogatás használatával felgyorsíthatjuk az alkalmazás indulási idejét, mivel nem kell kezdetben betölteni olyan modulokat, amelyeket akkor még nem is jelenítünk meg.
- Használjunk életciklus-függvényeket a fontos események kezelésére.
A C++ nyelven megvalósítandó, CAFF fájl-feldolgozást végző natív komponenst a következő technológiák segítségével szeretnénk tesztelni:
- Valgrind: Fő feladata a memóriamenedzsment; segítségével kiküszöbölhető az esetleges memória-szivárgás, az inicializálatlan memóriahasználat, illetve a nem megfelelő helyre való írás és a nem megfelelő helyről való olvasás is.
- Fuzzing (AFL): Különböző véletlenszerű, váratlan, vagy akár érvénytelen bemenetekkel tesztelhető a program tűrőképessége.
- SonarQube: Statikus analízist végez; elsődleges célja a forráskód minőségének ellenőrzése.
A JPA adatbázis-hozzáférést, illetve az információmenedzsmentet unit tesztek segítségével szeretnénk ellenőrizni, használva a Mockito keretrendszert.
Az Angular alapú webes kliens tesztelését az alábbi technológiák alkalmazásával tervezzük elvégezni:
- Karma: Könnyen és gyorsan használható, teszt-futtatást végző keretrendszer.
- SonarQube: Statikus analízishez szintén ezen eszközt szeretnénk igénybe venni.