Csak a tesztemen keresztül!

Szakmai gondolatok informatikai rendszerek teszteléséről.

Gazda

Friss topikok

  • Akron: @Verhás Péter: Az ügyfeled a cég (vezérigazgatóval, Józsi nénivel) A cég ellenőrzi le és veszi át ... (2018.01.31. 14:09) Miért UAT
  • Verhás Péter: @ hrgy: Egy kicsit felhúztam magam, de sebaj. A lényegi állításokban igazad van, ám a személyekre... (2011.10.09. 00:25) A tesztelés nem mindenható
  • crix: Ez a hozzáállás. Sajnos most is. Aztán csodálkoztak itt a népek, amikor bevállaltam a hétvégi munk... (2011.10.05. 16:56) Újra fizetni kell
  • crix: és milyen specifikáció mentén ment át az ügyfél? elég blind? (2011.10.05. 13:41) Ügyfélteszt
  • fqqdk: fitnesse, concordion, és cucumber integráció lesz? (2011.03.05. 13:42) Automatizált tesztelés és üzleti tesztelés

Társblogok

Jól beégünk

2009.07.15. 16:11 | Verhás Péter | 8 komment

Nyár van, és nemsokára elmegyek szabadságra, ezért nem adom fel a kérdést, hogy magyarázzátok meg ...

Szóval volt egy szoftver, ami a weben keresztül szolgált ki kéréseket. A válasz összeállítása X darab adatbázis kérés után alakult ki, de mindenképpen 2mp-en belül kellett lennie a válaszidőnek. Az volt a megoldás, hogy aszinkron elindul a "számolás" és ha nincs válasz 2mp-en belül, akkor egy majdnem ugyanolyan jó konzerv választ fog kapni a felhasználó, mint amilyen a pontosan kiszámolt lett volna.

Hogy ez milyen alkalmazásnál tehető meg? Pont annál amit írtunk. Mindegy.

Szóval a rendszer várt egy aszinkron szálra, és ha az nem futott le 2mp-en belül, akkor nem várta meg, hanem leállította, és adott egy konzerv választ.

A baj ott volt, hogy az aszinkron thread használt egy adatbázis kapcsolatot. Az az adatbázis kapcsolat pool, amivel teszteltünk egy idő után észrevette, hogy senki sem hivatkozik a kapcsolatra, és a GC során visszarakta az adatbázis kapcsolatot a pool-ba. Ezt jól le is teszteltük.

Aztán az éles rendszeren egy másik DB pool volt a rendszer alatt.

A rendszer pedig elindult. Amíg nem volt túlterhelve, addig nem volt gond, működött. Méretezve is úgy volt, hogy bírja a terhelést, és naponta úgy 10...15 alkalommal fordult csak elő, hogy nem sikerült válaszolni 2mp-en belül. A 200 kapcsolatos pool kb. egy hét alatt fogyott el. Ahogy fogyott a pool egyre többször adott a rendszer konzerv választ, de ez a meghalást, a pool fogyását nem gyorsította, mert sokszor úgy ölte meg a szálat, hogy az még meg sem kapta a connection-t.

A legszebb a dologban az volt, hogy a connection pool észrevette, hogy felszabadult a kapcsolat, és még le is loggolta, hogy visszarakta a pool-ba, de nem tette. Csak amikor elkezdtük loggolni a pool méretét, akkor derült ki, hogy hiába mondja azt, hogy visszarakta, az ilyenkor eggyel mindig csökkent, mint a szamárbőr.

A legcsúnyább pedig az volt a dologban, hogy gondoltunk rá, hogy ez lehet egy számunkra ismeretlen connection pool implementációval, és ezért a szoftverben volt egy

if( true ){

megöljük a thread-et

}

jellegű kód, és felette 10 sorban komment és magyarázat, hogy miért kell az 'if' után false-t írni, mert különben a szoftver elveszítheti a megölt thread-ben használt DB kapcsolatot, és inkább egyen még egy kis erőforrást a thread amíg lefut, mintsem elfogyjanak a kapcsolatok.

És néztük százszor, és néztük ezerszer a kódot, és csak éppen nem szúrta ki a szemünket, hogy a kommentben 'false' van írva, de a kódban 'true'. Két hétig. Stílusosan mondhatnám, hogy beégett a szemünkbe.

Ez történt.

Na és mi az a beégetéses teszt? Nem ez. A beégetéses teszt nem az, hogy jól beégünk, hanem az, hogy hajtjuk a szoftvert változó, de valamennyire reprodukálható inputtal, terheléssel, és nézzük, hogy nem ég-e be, bírja-e a terhelést, vagy rendszeresen újra kell indítani. Napokig, hetekig, hónapokig akár, attól függően, hogy mennyi az az időszak, ameddig a szoftvernek folyamatosan kell bírnia.

Nem biztos, hogy az a cél, hogy ne kelljen újraindítani. (A mi esetünkben az volt, az üzleti konzekvenciákat nem írom le, de nem volt jó referencia.) Lehet az is, hogy egy 5x8-as szoftvernél elég ha egy napot kibír újraindítás nélkül, éjjel úgyis újra lehet indítani (esetleg automatikusan), és nem ad semmi előnyt azzal a költséggel szemben amit a hibakeresés mondjuk 3 mérnöknapja jelent. Elvileg. Gazdaságilag. Közgazdász szemmel. Aztán nekem az egyik szemem közgazdás, a másik meg mérnök. (Csak ezt kellene eldönteni, hogy melyik.)

Mindig benne van a (mérnök) emberben, hogy ha olyan hiba van a szoftverben, ami miatt minden éjjel újra kell indítani, akkor az más disznóságokat is csinálhat. De, mint tudjuk ilyen szoftverrel is lehet világbirodalmat építeni. Közgazdász szemmel.

Nekem viszont csak az egyik szemem a kancsal. A közgazdász, vagy a mérnök?

Azért a kommentekbe, ha veszi valaki a fáradtságot, kérem megfejtésnek egy francia író nevét.

A bejegyzés trackback címe:

https://csakatesztemenkeresztul.blog.hu/api/trackback/id/tr691247712

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

PeterBogyo · http://ujbuda.kutyaiskola.eu 2009.07.20. 11:07:13

Jóreggelt!
Valamiért azt gondolom h a fent leírt alkalmazás egy biztosítóé aki valós időben ad ajánlatot az online (mondjuk Netrisk) alkusznak. Sajnos már alapból azt hülyeségnek tartom h fals (nem valós) eredményt ad, ha nem jön válasz, mivel ha jól tudom ez ajánlattételnek is minősül és mint olyan az esetek többségében kamu (nem valósan számított) ajánlati értéket kapok.

Szerintem itt már az elején el lett tolva, ugyanis hagytátok megvezetni magatokat és nem mentetek a dolgok mélyére. Most, mint üzleti igény gondolok a megvezetésre. Tehát a cél az h 2 mp alatt menjen ajánlat. Tudom ,hogy van egy adatbázis ahonnan az adatok késve jönnek meg, tehát ezeket az adatokat pl óránként , rendezve, megfelelő struktúrába odateszem az alkalmazás alá. Így az adott érték valós lesz. Ráadásul nem lesznek a fenti gondok sem, mivel nem kell az adatért nyúlkálni mindenfele.

Az írt "elnézés" talán akkor lett volna felfedezhető, ha vki olyan is megnézi a kódot, aki nem ismeri csak mint laikus beleles. Ezért érdemes a whitebox teszteket is annak csinálni aki nem írt bele egy sort se a programba, így minden előítélettől mentesen elsőre kiszúrja, hogy itt a comment mást mond, mint amit a kód.

A beégetéses tesztel van egy gondom. Általában nem éri meg. Amikor azt nézem mennyit bír, általában vagy túl steril a környezet (teszt) vagy már élesben van. Túl sok minden befolyásolja, az uptimeot, sokszor olyan is, amire nincs ráhatásunk. Azt gondolom lehetetlen 100% hibatűrő programot írni és sajnos a reboot jelenleg is része a rszgazda életének. Nem megúszható, max kitolható. Ha magas rendelkezésre állásra van szükség akkor sem ez a jó megoldás, hanem cluster v egyéb technikákkal kell túlélővé tenni a rendszert, ami kibírja ha egy'smás elpukkan alatta.

Ezért aztán a "beégetéses" tesztnek nem sok értelme van... De cáfoljatok:)

Verhás Péter · http://csakatesztemenkeresztul.blog.hu 2009.07.20. 11:53:31

@Nuunius:

>Valamiért azt gondolom h a fent leírt alkalmazás egy biztosítóé aki valós

Nem tudom miért gondolod. Nem igaz!

>Szerintem itt már az elején el lett
>tolva, ugyanis hagytátok megvezetni
>magatokat és nem mentetek a dolgok
>mélyére.

Milyen kedves, hogy egy hibás feltevés alapján ilyen messzire jutsz a következtetésben :-)

Verhás Péter · http://csakatesztemenkeresztul.blog.hu 2009.07.20. 12:03:15

Amit "white box" tesztnek hívsz, azt inkább peer code review-nak nevezném.

Ezek szerint a te praxisodban még nem volt olyan, amikor a beégetéses teszt megérte. Nekem már volt.

>túl steril a környezet (teszt)

Szennyezd be. Tervezetten, reprodukálhatóan.

>sajnos a reboot jelenleg is része
>a rszgazda életének

Igen, de törekedni kell rá, hogy ne legyen az. Még akkor is ha ez nem érhető el, legyen minél kisebb az esélye egy pace maker reboot, légzsák félig nyílik ki, csernobil leolvad eseménynek.

>a "beégetéses" tesztnek
>nem sok értelme van

Értem amit mondasz, de inkább úgy fogalmaznék, hogy nem olcsó, és ezért sokszor nem éri meg.

PeterBogyo · http://ujbuda.kutyaiskola.eu 2009.07.20. 12:24:59

@Verhás Péter:
"Valamiért azt gondolom h a fent leírt alkalmazás egy biztosítóé aki valós"

csak azért gondoltam mert ott vannak ilyen elvárások általában.. és ott gondolják h a kb valós=valós. Bár lehet h messzire ment a következtetésem, de attól még érdemes elgondolkodni azon, h ha ennyire gáz ez a kapcsolat, akkor érdemes áttervezni esetleg megnézni mi az eredeti igény, mert a megrendelő gyakran megvezet egy olyan megoldással ami elsőre igaz, de nem a gyökérokból indult ki.

Nekem már volt olyan ,hogy egy teszt kihozott olyat ami miatt aztán át kellett tervezni az alkalmazást.

Nem bánátsiból, csak egy ötlet vol h lehet a tervezés is hibás és a tesztetek erre mutat rá.. Az már döntés kérdése h megéri e áttervezni, h ne legyen ilyen korlát...

PeterBogyo · http://ujbuda.kutyaiskola.eu 2009.07.20. 12:33:34

A évgével egyetértek. Kicsit talán túlzás h nincs értelme, inkább igaz h általában nem éri meg...

A másik
>túl steril a környezet (teszt)
Itt arra gondolok h pl a hálón sok más is rohangál, a szervert, db stb más is terheli.. és erre jön rá h az adatok se mindig tiszták.. Szóval ez együtt ami nincs (általában) jelen a tesztben.

és igy van ahogy mondod, nekem amikor csináltam még sosem érte meg. Nem azért mert ne hozott volna ki eredményt amiből lehetett volna messzemenő következtetéseket levonni, hanem mert a következtetés az votlamit fent is írtam. Át kellene tervezni.. És sajnos az ilyet egy cég se vállalja be. Ilyenkor jön a hiszti és a vége az, hogy marad ahogy volt. (Igaz h nem ilyen többhétig futó teszt volt, csak 4 órát futott:))

Maradjunk annyiban ,hogy ha jó (igaziszerű) a környezet és az adatok, akkor megéri hosszabb (8-10 óra) tesztfutást is nézni, aztán leírni a tapasztalatokat és abból levonni a következtetéseket. Sajnos általában ez már késő, és ritkán lesz a kiváltó ok megszűntetve. Az lenne a jó, ha ilyen már a megvalósítás első szakaszában tudna futni, de ilyenkor még a funkcionális hibák elviszik az egészet..

Ez egy ilyen sport:)

fqqdk 2009.07.20. 13:29:07

Ez a beégetéses teszt dolog úgy tűnik tényleg rendkívül költséges. Ahhoz, hogy egyáltalán azt tesztelje, amit akarsz (mármint hogy reteksok használat után valami hibás erőforrásmenedzsment jellegű dolog miatt szétrohad-e a rendszer), csinálnod kell "piszkos" környezetet, ami nem hinném, hogy triviális probléma. És ezek után rettenetsokáig pörgetned kell, miközben nyilván nem csak ülsz és malmozol, de akkoris.
A TDD-s csókáknak teljesen igazuk van, amikor azt sulykolják, hogy RAPID FEEDBACK. Minél gyorsabb a visszacsatolás, annál hamarabb látod, hogyha elcsesztél valamit, és minél hamarabb látod, hogy elcsesztél valamit, annál valószínűbb, hogy még elég olcsó lesz javítani.
Úgyhogy továbbra is úgy gondolom, hogy a legfontosabb tesztek a fejlesztői tesztek, azok közül is azok, amik 2 ms alatt lefutnak. :)
Persze továbbra sem próbálom azt állítani, hogy más teszt nem is kell.
A fejlesztőnek tesztelnie kell, és ahhoz hogy a teszteknek, amiket ír, értelme legyen, ahhoz el kell sajátítania a tesztelés kultúráját. Mert a tesztelés valójában kultúra, legalább annyira, mint az, hogy visszahajtod-e a vécédeszkát (hogy a lehúzásról ne is beszéljünk...)
És ennek a kultúrának nagyon fontos eleme, hogy a fejlesztő tisztában legyen a jó objektumorientált fejlesztés alapjaival, a tervezési mintákkal, a kódszagokkal, refaktorálással, miegyébbel. Még ma is baromi sok fejlesztő van, aki számára a tesztelés valami olyan dolog, amit majd megcsinál valaki más, és így aztán nagyon könnyű eljutni oda, hogy van valami olyan végterméke amire hónapokon belül mindenki, aki csak látja, azt sikítja, hogy egyszerűbb lenne újraírni nulláról.
süti beállítások módosítása