Lg optimus l5 nl by Mikejohan198 5932 views
Ferenc Kovács , developer at ustream.tv
komajner
Tags php qa
1. Téma PHP alkalmazások minőségbiztosítása
2. Előadó ● Kovács Ferenc (Tyrael) ● Fejlesztési vezető @ Escalion ● QA wannabe többek között
3. PHP alkalmazások ● Webalkalmazások ● Cli alkalmazások ● Cronjobok ● Etc.
4. Mi az a minőség? ● Általánosságban: ● Az elvárásoknak való megfelelés foka. ● Részekre bontva: ● A tervezés minősége (Quality of design) ● A kivitelezés minősége (Quality of conformance) ● Néhány szempont: ● Használhatóság ● Teljesítmény ● Biztonságosság
5. Mit jelent nekünk a minőség? ● Projecttől függ. ● Fogalmazzuk meg, és dokumentáljuk le. ● A döntéseinknél vegyük figyelembe a minőségi elvárásainkat. ● Folyamatosan probáljunk javítani a minőségen, ehhez pedig folyamatosan javítani kell a munkafolyamatainkon is.
6. Mi az a minőségbiztosítás? ● Olyan eszközök és procedúrák, amik kidolgozásával, bevezetésével és betartásával biztosítani lehet az elvárt minőség elérését. ● Olyan buzzword, aminek keretében rengeteg pénzt ki lehet fizetni okos tanácsadó és auditor cégek számára azt gondolván, hogy csupán ettől, a hozzáállás, vagy a munkafolyamatok megváltoztatása nélkül javulni fog a kezünk közül kikerülő termékek minősége.
7. Miért van szükség a minőségbiztosításra?
8. Miért van szükség a minőségbiztosításra?
9. Miért van szükség a minőségbiztosításra?
10. Miért van szükség a minőségbiztosításra?
11. Miért van szükség a minőségbiztosításra? Általában inkább ezért: Roszabb esetben pedig ezért:
12. Mi az a hiba? ● A hiba az alkalmazás nem kívánt viselkedése. ● Vagy egy molylepke:
13. Mi a különbség a bug és a feature között?
14. Honnan jönnek a hibák? Kommunikációs problémák
15. Honnan jönnek a hibák? A tesztelés hiánya
16. Honnan jönnek a hibák? ● A jó fejlesztő nem feltétlenül jó tesztelő: ● Optimista fejlesztő: A pohár félig tele van. ● Pesszimista tesztelő: A pohár kétszer nagyobb, mint a specifikációban. ● Pláne ha nem is jó fejlesztő ● Az sem segít, ha közelít a határidő ● Ismeretlen terepen könnyű hibázni ● Főleg ha van néhány clever megoldás: ● if (statusIsNotValid.compareTo( Boolean.FALSE ) != 0) skipValidation = false;
17. A fejlesztők írjanak hibátlan kódot! ● Minden nem-triviális szoftver tartalmaz legalább egy hibát. ● 20 hiba 1000 soronként átlagosnak tekinthető ● PhpMyAdmin: 125KLOC ● WordPress: 88KLOC ● Drupal: 146KLOC ● Ez csak a PHP kód mennyisége
18. A fejlesztők írjanak hibátlan kódot! ● De az én kódom hibátlan! ● És az általad használt PHP libek? ● És a C libek? ● A PHP core? ● A C fordító? ● A fájlrendszer? ● A driverek? ● A kernel? ● A hardver? ● A többi gép, szolgáltatás, amivel kommunikálsz?
19. Mit tehetünk? ● Definiáljuk az elvárt viselkedést, és kezeljük a váratlan helyzeteket(fail-secure). ● A lehető legkevesebb hibát vezessük be. ● A hibákat a lehető legkorábbi fázisban találjuk meg és javítsuk ki. ● Kövessük nyomon a hibákat a bejelentéstől a javításig. ● Tegyünk róla, hogy a már kijavított hibák ne jelenhessenek meg újra (regresszió).
20. Definiáljuk a működést ● Követelményspecifikáció (SRS) ● Funkcionális követelmények: – User story – Use case – Unit test ● Nem-funkctionális követelmények – Rendelkezésreállás (SLA) – Teljesítmény – Skálázhatóság – Karbantarthatóság – Stb.
21. User story ● Scrum-ból már ismerős lehet ● Leírja az adott funkció/komponens/rendszer müködését a felhasználó szemszögéből. ● Általában a megrendelőtől érkezik, ennélfogva nagyon High level. ● Pl: Bejelentkezett felhasználóként ki kell tudjam tölteni a profilomat, és megtekinthetem mások profiljait, de nem szerkeszthetem őket. ● A teljes rendszer nagyon sok US-ból áll össze.
22. Use case ● Egy konkrét esemény leírása a rendszerben. ● Lehetőleg ne azt írja le, hogy hogyan, hanem hogy minek kell történnie. ● Ez már algoritmizálás. ● Pl: ● 1. A rendszer bekéri a belépési adatokat, ● 2. A felhasználó megadja a nevét és a jelszavát, ● 3. A rendszer leellenőrzi a megadott adatokat, ● 4. A rendszer belépteti a felhasználót.
23. Unit test ● Lehetővé teszi a kód legkisebb önálló egységeinek(függvény/metódus) a tesztelését. ● Definiálja a kód elvárt viselkedését. ● Megfelelő lefedettségnél segít észlelni a hibákat. ● PHPUnit – de facto standard. ● SimpleTest – érdeklődés hiányában elhunyt.
24. Unit test ● Önmagában megérne egy külön előadást. ● A QA eszköztárunk egyik legfontosabb eleme. ● Meg kell tanulni teszteket írni. ● Meg kell tanulni jó teszteket írni. ● Ideális esetben a Unit test írás a fejlesztés szerves részét képezi. ● Ha előbb írod a teszteket, mint a kódot, akkor beirhatod a CV-dbe a Test-driven Development kifejezést a tapasztalatok közé.
25. Nem funkcionális követelmények ● Rögzíteni kell a követelményeket. ● A tervezésnél figyelembe kell venni a követelményeket. ● A rendszer annyira robusztus, mint a leggyengébb összetevője: ● Nem tudsz 99.9999% rendelkezésre állást garantálni, ha az áramszolgáltatás csak 99.99%-ot tud. ● Folyamatosan monitorozni kell ezen feltételek teljesülését, és ha szükséges, módosítani a munkafolyamatokat.
26. Kezeljük a váratlan helyzeteket ● Hibakezelés, minden hibát logoljunk, elemezzünk. ● A felhasználók fele ne jelenítsünk meg hibákat. ● ErrorDocument(apache), error_page(nginx), fallback(ldirectord), etc. ● A php engine 500as hibát kuld ha: ● szabálytalanul fejeződik be a script futása ● és nincs bekapcsolva a hibakijelzes ● és nem lett kiküldve már kimenet ● ÉS nincs bekapcsolva az xdebug
27. A hibákat a lehető legkorábbi fázisban találjuk meg és javítsuk ki.
28. Issue tracking ● Minden feladat kerüljön bele. ● Megfelelően legyenek priorizálva a feladatok. ● Mindig a prioritás szerint foglalkozzunk a feladatokkal. ● Ne legyenek gazdátlan issuek. ● Tartsunk bugfix sprinteket. ● Nagyon fontos a jó, reprodukálható hibajegy, néha ez több munka, mint a javítás. ● Ne zárjuk le ész nélkül a hibákat invalid vagy worksforme jelzővel.
29. Regresszió ● A regresszió a hibák zombija, hiába öljük meg, mégis időről időre visszajön. ● Minden javított hiba után írjunk egy tesztet kifejezetten arra a hibára, és innentől kezdve nyugodtan alhatunk. ● Ha visszatér egy bug, vizsgáljuk meg, hogy mi okozhatta, és vegyük elejét az ilyen eseteknek. ● Nincs idegesítőbb, mint amikor sokadszorra jön elő ugyanaz a probléma.
30. Gyakorlati tanácsok ● Fejlesztői környezetek, configuráció kezelés ● Verziókezelés ● Adatbázis migráció ● Deployment ● Folyamatos Integráció ● Dokumentáció ● Statikus kódanalízis ● Tesztelés ● Refactorálás
31. Fejlesztői környezetek ● Devel: ● minden fejlesztőnek saját. ● ha linuxra fejlesztünk, akkor legyen linux. ● töredék méretű teszt adatokkal. ● Staging/Test: ● a produkciós környezethez a lehető legnagyobb mértékben hasonlító rendszer ● az adatok ideális esetben az élesről vannak tükrözve/replikálva.
32. Fejlesztői környezetek ● Live/production: ● Kód csak a deploy folyamaton keresztül kerülhet ki. ● A hibák nem kerülhetnek megjelenítésre a felhasználók számára (max karbantartás üzenet). ● A hibák logolásra kerülnek(központi logolás, mondjuk syslog-ng), és a fejlesztés/üzemeltetés értesül róla. ● Folyamatosan monitorozni kell a helyes működést, és követve az előre elkészített forgatókönyveket beavatkozni a hibás működés esetén.
33. Configuráció kezelés ● Az eltérő environmentekhez tartozó configokat lehetőleg kívülről injectáljuk be: ● környezeti változók ● auto_prepend_file ● hidef ● Mindig a produkciós környezet legyen az alapértelmezett. ● Figyeljünk oda a cli/cronjobokra, ha környezeti változó kell a futáshoz.
34. Configuráció kezelés ● A különböző konfigurációs állományok is legyenek verziókezelés alatt, ezáltal könyebb azonos beállításokra hozni több szervert, valamint könyebb követni a változások tényét és okait is (commit logok). ● Ne bízzunk a default configurációs beállításokban, általában a könnyű használhatóságra vannak optimalizálva, nem pedig a nagy teljesítményre, vagy biztonságos működésre.
35. Verziókezelés ● Commit szabályok ● Minden commit előtt update-elj. ● Minden commithoz adj meg commentet. ● Ne fogj össze egy commitba több feature-t, bugfixet. ● Commitolj sűrűn, de ne küldj be hibás kódot. ● Lehetőleg igyekezz a nap végére mindig commitolható állapotot kialakítani.
36. Verziókezelés ● Branchelés, mergelés ● Hoszabb, vagy elhúzódó refactornak csinálj feature branchet, így nem akadályozod a többiek munkáját. ● Mergelésnél amikor lehet igyekezz kézi feloldás nélkül megoldani a conflictokat (talán csak nem lett mergelve egy korábbi commit).
37. Verziókezelés ● Fejlesztési ágak ● Trunk/Head ● Testing/Staging ● Live/Production ● Feature branchek ● Hozd létre ha szükség van rá, mergeld vissza ha kész, majd nyugodtan töröld le. ● Tagelés ● Tageld az RC-ket, a release-eket, sose mozgass taget.
38. Commit hookok ● Pre-commit hook: ● Megkövetelhetjük, hogy legyen megadva commit comment, vagy hogy a módosított kód szintaktikailag helyes legyen (php -l). ● Post-commit hook: ● Küldhetsz emailt a commitról. ● Elindíthatod a CI buildet (lásd később). ● Elindíthatod az élesítést.
39. Adatbázis migráció ● Tartsd a schema-t a verziókezelőben. ● Figyelj oda, hogy a schema módosítás lockolja az adatbázist. ● Ha replikációt használsz, akkor figyelj oda a slave-lagra. ● Ha leállás nélkül akarsz migrálni, akkor jól jöhet a Master-Master replikáció, vagy valami schemaless nosql megoldás. ● Phing/dbdeploy.
40. Adatbázis migráció ● Kétfázisú migráció: először hozd létre az új oszlopot(prepare), aztán vidd ki a kódot(activate), ha nem jó rollback, ha megy, akkor a következő deploy eltávolíthatja a feleslegessé vált oszlopokat. ● Mindig legyen rollback/downgrade terved. ● Ha nem tudsz online migrálni, akkor még mindig üzemelhetsz read-only üzemmódban csökkentett funkcionalitással, amíg tart a migrálás.
41. Deployment ● Ne menjen eseményszámba, legyen rutinszerű. ● A Phing kényelmes, de nem nagy szám sajátot sem írni. ● Minél kevesebb dolgot módosítasz egy élesítéssel, annál kisebb az esélye, hogy eltörsz valamit, szóval élesíts gyakran kis módosításkészletet.
42. Deployment ● Figyelj oda arra, hogy a deploy folyamat atomi és konzisztens legyen a clusterben: ● Először vidd ki a lebuildelt kódot (prepare). ● Utána tereld rá a forgalmat (activate). ● Ezt meg lehet oldani többféleképpen is, jó esetben csak a loadbalancerrel kell újraolvastatni a configot. ● Ne felülírd a kint lévő kódot, hanem mindig a régi verziók mellé tedd le, ezáltal a rollback gyorsabb és nincs probléma a cache-ekkel.
43. Folyamatos Integráció (CI) ● „Buildbot” ● Megadott feltételek(x időnként, ha változik a kód a repóban, etc.) teljesülése esetén végrehajtja újrabuildeli a projectet. ● Általában az alap build taskok: ● Húzd ki a kódot a repóból. ● Futtasd le rajta a Unit teszteket. ● Készíts kimutatásokat az eredményről. ● Hiba esetén értesítsd a fejlesztőt.
44. Folyamatos Integráció (CI) ● Javaban íródott: ● Hudson (jelenleg talán a legjobb választás) ● PHPUnderControl(CruiseControl) ● Bamboo (Atlassian) ● PHPban íródott: ● Arbit (CI+issue tracking+wiki) ● Xinc (halódik)
45. Folyamatos Integráció (CI) ● PHPUnit ● pdepend : nice metrics (CylCo, NPath, etc.) ● phpcs : PHP Code Sniffer ● phpcpd : copy paste detector ● phpdcd : dead code detector ● PHP_CodeCoverage : code coverage :) ● phpdoc : documentation builder ● PHPMD : PHP Mess Detector (Cyclomatic Complexity, NPath Complexity)
46. Dokumentáció ● Dokumentációból is lehet túl sok, de ez ritka. :) ● Válasszuk szét aszerint, hogy kinek szól: ● Fejlesztői dokumentáció: ● Inline kommentek ● PHPDoc ● High-level rendszerterv ● Üzemeltetői ● Felhasználói dokumentáció
47. Statikus kódanalízis ● Bytekit/bytekit-cli: bytekód analízis, ki lehet vele pl. szűrni zend tokenekre (EVAL, PRINT). ● Phploc: kódméretet(KLOC, osztályok, függvények száma, tesztek) lehet vele becsülni ● Phantm: tipusellenorzes ● PADAWAN: PHP antipattern detector ● RIPS sebezhetőség detektor
48. Tesztelés ● Funkcionális: ● Unit tesztek ● Integrációs, rendszer tesztek ● Regressziós tesztek ● (User)Acceptance tesztek ● Selenium tesztek ● Nem funkcionális: ● Security tesztek(whitebox, blackbox) ● Teljesítmény tesztek
49. Unit Tesztelés ● Reflection: futásidőben manipulálhatóak az osztályok. ● Runkit: futásidőben manipulálhatóak a beépített függvények, osztályok, állandók. ● VfsStream: mockolható fájlrendszer ● mysqlnd_uh : userland mysql handler
50. Refactor ● Óvatosan! ● Ha van elegendő Unit test, akkor bátrabban lehet módosítani, hiszen jó eséllyel kiszúrod, ha valamit eltörsz a változtatással. ● Ha nincs elegendő, akkor írj! ● Ne írj újra egy teljes rendszert nulláról, ha nem muszáj. ● Szinte sosem muszáj. ● Egyszerre egy dolgot javíts ki, keresd a könnyű prédát és folytasd iteratívan.
51. Összefoglalás ● Legyen tervünk! ● Ismerje a tervet mindenki, akinek szükséges. ● Ragaszkodjunk a tervhez. ● De folyamatosan keressük a javítási lehetőségeket a tervben. ● Minden nagyobb probléma után vizsgáljuk meg, hogy mi okozta a problémát, és javítsuk a folyamatokat ennek megfelelően.
52. Vég(r)e! Kérdések? Köszönöm a figyelmet! info@tyrael.hu http://tyrael.hu http://twitter.com/Tyr43l
Lg optimus l5 nl