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

Blog

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

A minőségi szoftverhez három dolog kell: tesztelés, tesztelés és tesztelés.

Így tesztelünk mi.

Linkblog

Pali és a kamatok

2009.06.01. 10:00 | Verhás Péter | 7 komment

Először két idézet a kommentlőktől a korábbi bejegyzésekre:

fqqdk 2009.05.30. 15:45:22

"Ami azt illeti, az egységteszteket a programozónak kell írnia"
 

brslc 2009.05.11. 10:54:00

"legjobban a program írója tudja tesztelni a programját, mégpedig úgy hogy a csak tesztelésre használható rutinokat ír"

Ahogy a nagykönyvben meg van írva:

  1. Elkészítjük a dokumentációt, hogy a rutin mit fog végrehajtani. Java esetében ez a kód elé írt JavaDoc dokumentáció és a metódus feje.

  2. Elkészítjük a unit teszteket, amelyek a dokumentáció alapján használják a metódusokat és tesztelik azokat.

  3. Elkészítjük a metódust, és futtatjuk a unit tesztet, és addig javítjuk a kódot, amíg a unit tesztek le nem futnak.

Mi a valóság, a gyakorlat?

  1. Ez OK, ez így van

  2. Ha fegyelmezettek vagyunk, akkor előre megírjuk a teszteket, de mivel már ismerjük, hogy mi jön a következő pontban, inkább csak utólag.

  3. Elkészítjük a metódust, és tapasztaljuk, hogy nem csak a metódusban, hanem a unit tesztben is vannak hibák, ezért addig reszeljük a kódot, és a tesztelő kódot, amíg azok meg nem felelnek egymásnak.

 

Jó ez így? Maradjunk abban, hogy nem rossz, és ha nem sikerül nagyon fegyelmezettnek lenni, akkor ez az elérhető legjobb.

 

És most akkor a tanmese

 

Főhősünket nevezzük Palinak a példa kedvéért, meg mert ez egy jó név, meg speciel tényleg így hívják: Pál.

 

Pál feladata volt egyebek mellett, hogy írjon egy kamatszámító metódust, aminek volt három paramétere: kamatperiódus kezdete, kamatperiódus vége és kamatozó összeg.

 

/**

* javadoc

*/

ForintÖsszeg kamatSzámítóMetódus(Időpont periódusVége,

                                                    Időpont periódusKezdete,

                                                    ForintÖsszeg forintÖsszeg){

. . .

}

 

 

A valóságban voltak még paraméterek, de a példa szempontjából mindegy. A kamatszámító kódban a periódus kezdetét és végét jelentő változók meg voltak cserélve, és emiatt (átadás után funkcionális integrációs tesztelésen derült ki) negatív kamatok jöttek ki. Ennek a hitelesek speciel örültek volna, és nem tudom, hogy Palinak van-e hitele az adott banktól …

Hibabejelentés, hibajegy, feladat diszpécselés (ki javítsa ki), javítás, új teszt, release gyártás, release szállítás, mintegy laza egy óra munka két változó megcserélése a kódban.

De ez hogy fordulhatott elő? Nem volt unit teszt?

De volt. A unit tesztben is meg voltak cserélve a változók a paraméter listában. És akkor most gondolkodjunk el a fent idézett két kommenten. Nem gondolom, hogy nincs igazuk. Nem gondolom, hogy igazuk van. Csak erősen gondolkodom...

A bejegyzés trackback címe:

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

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.

fqqdk 2009.06.01. 12:55:29

Kezdjük a gonoszabb részével a dolgoknak, méghozzá azzal, hogy a fenti rendszer tervezőjének bár volt annyi esze, hogy ne "double forintÖsszeg" jellegű felületet írjon, hanem alkalmazta a csodálatos Money tervezési mintát, ami ugye azért kell, hogy a átváltogatásokat, meg a tzedeseket meg hasonlókat kezelő logika egy helyen legyen (pl most a ForintÖsszeg osztályban), de fel nem merült benne, hogy ugyanezt érdemelnék a dátum intervallumok is. Pedig ez a hiba jó eséllyel elő nem fordulhatott volna, ha a fenti metódus mondjuk úgy néz ki, hogy
ForintÖsszeg kamatSzámítóMetódus(DátumIntervallum intervallum, ForintÖsszeg forintÖsszeg).
Mondjuk nehéz is elhinni, hogy egy ilyen rendszerben a kamatszámító metódus az egyetlen, ahol két dátum mint egy intervallum fordul elő. És akkor már el is lehet mondani azt, hogy a TDD-nek lett volna esélye megakadályozni a fenti problémát: például azzal, hogy a refaktorálás szakasznál rájön szépen Pali, hogy már harmadszor írja le ugyanazt, azaz hogy Dátum intervallumKezdete, Dátum intervallumVége, és következetesen végrehajtja az "eliminite duplication" nevű igen hasznos lépést.

Aztán persze az is igaz, hogy némileg félreértjük egymást, azzal kapcsolatban, hogy mit nevezünk egységtesztnek, ami nem meglepő, mert ez egy globális jelenség, a szakma angol anyanyelvű része is ezen izgulászik:
http://www.infoq.com/news/2008/06/hill-microtesting
Amikor én egységteszteket mondok, akkor ezekre a mikrotesztekre gondolok, amik nem piszkálnak adatbázist, fájlrendszert, más relatíve lassú erőforrást, és az egységeket önmagukban tesztelik, nem pedig a kollaborátoraikkal. Ezeket a fejlesztőnek kell megírnia, hisz arról szól a dolog, hogy ezeket minden egyes kódváltoztatásnál le kell futtatni. Ezek nélkül nem lehetséges megbízhatóan refaktorálni, tehát a kód belső minőségét állandóan, és megbízhatóan javítani.
A mikrotesztek rendszerint nem tesztelik az egyes egységek együttműködését, tehát szigorú értelemben véve esélyük nincs elkapni a fenti hibát.

Az egyes modulok együttműködését az integrációs teszteknek kell vizsgálnia, azaz a fenti esetben pl egy olyan, szintén junit tesztesetként megfogalmazható tesztnek, ami a kliens kódot és a kamatszámító kódot egyszerre teszteli. Ha a két fél nem ugyanúgy gondolkozik a paraméterek sorrendjéről, az Pali kommitja után mondjuk egy órával kiderül, amikorra a kontinyusz integrésön szerver lefuttatta az összes integrációs tesztet. Meg acceptance tesztet. Vagy ha nem kommit után rögtön, akkor mondjuk éjszaka. Vagy minden kedden meg csütörtökön.
De az, hogy az egységteszt utáni következő minőségellenőrzési réteg az ÁTADÁS UTÁNI, felhasználó általi tesztelés, az szégyen, és nem annyira Palira nézve.

Verhás Péter · http://csakatesztemenkeresztul.blog.hu 2009.06.01. 13:30:04

@fqqdk: Kösz a kommentet, nagyon fontos gondolatokat pedzegetsz. Bár sok olyasmire hivatkozol, ami nincs is benne a bejegyzésben azért érdemes elgondolkodni ezeken a felvetéseken.

Való igaz, hogy jól tervezett interfészeket jobban lehet tesztelni. Ha a megrendelő rendszerébe beleillő kódot kell készíteni, akkor ezek az interfészek adottak.

Ettől még a unit teszt, ami az én fejemben is pontosan az, amit te is leírsz még ki deríthette volna a hibát. Nem integrációs volt a probléma, nem az volt a gond, hogy másképp hívták meg a modult, mint ahogy azt kellett volna. Pontosan úgy lett meghívva, mint ahogy az definiálva volt. Csak nem úgy működött.

A mikrotesztnek igenis van esélye elkapni a fenti hibát, ha csak nem tartalmazza a mikroteszt kód is ugyanazt a hibát, mint a tesztelt kód. Aminek, mint látjuk van esélye, ha ugyanaz írja a mikrotesztet, mint a kódot. És még akkor is, ha nem ugyanaz írja.

Mivel nem a projekt részletes leírása volt a cél, ezért a blogból nem derült ki, de jelen esetben az átadás után a funkcionális tesztelés, az általunk szállított kód funkcionális tesztelését jelentette, ami kb. megfelel annak az integrációs tesztnek amit leírsz a kommentedben. Csak azt éppen nem mi végeztük, hanem a fővállalkozó (számunkra megrendelő, de nem ügyfél), aki, ellentétben velünk rendelkezett is az által írt és a mi kódunkkal integrálandó kóddal.

Nil sine labore. Hiba se.

Verhás Péter · http://csakatesztemenkeresztul.blog.hu 2009.06.01. 13:35:23

A bejegyzésben kijavítottam a funkcionálist integrációsra, mert valóban nem jó szó a konkrét esetben funkcionális tesztről beszélni.

fqqdk 2009.06.01. 14:21:03

Én már csak ilyen troll vagyok, a tények soha nem állnak a véleményem útjába. :)

Verhás Péter · http://csakatesztemenkeresztul.blog.hu 2009.06.01. 16:40:52

@Verhás Péter: oooppsss
>számunkra megrendelő, de nem ügyfél

Hogy ne lenne ügyfél!!! Helyesen

számunkra megrendelő, de nem felhasználó

vicziani · http://jtechlog.hu 2009.06.01. 23:01:23

Erről egy dolog jutott eszembe, ami nagyon tetszett ezzel kapcsolatban. A unit teszteket lehet dokumentációs célokra használni. Ez kicsit hasonlít ahhoz a felfogáshoz, hogy nem kell részletes dokumentáció, mert a program a legteljesebb, legjobban leíró és legfrissebb dokumentáció (csak beszédes neveket használj). E mentén a unit tesztel meg dokumentálhatod, hogy milyen bemenetre milyen kimenetet várunk el. Nem tudom, hogy van-e erre automatizmus, ezt kigenerálni olvashatóbb formátumban.
süti beállítások módosítása