Click here to load reader
Upload
vvinston
View
3.432
Download
5
Embed Size (px)
DESCRIPTION
Bevezető előadás, a tesztelés fontosságáról, motivációs és figyelemfelkeltő célokkal. Az elmondottakat a unit test-ek bemutatásával erősíti meg.
Citation preview
TESZT ALAPÚ FEJLESZTÉS
Simon Bence
Duodecad, 2010-09-28
MIRŐL LESZ MA SZÓ?
Miért fontos a tesztelés
Mi is az alapprobléma?
Hogyan tesztelünk?
Hogyan teszteljünk?
Egységtesztek
További lehetőségek
A MICROSOFT ZUNE ÚJ ÉVE
2008 szilveszter
30GB Zune
Mind meghalt
Dátumkezelés bug
AIR-TRAFFIC CONTROL SYSTEM, LA AIRPORT
1994 szeptember 9
Kapcsolatvesztés
Több, mint 400 repülő
AZ ARIANE 5 FELROBBANÁSA
1995
36 másodpercet repült
Hibás int kezelés
Több, mint 500m USD
kár
ÉS VELÜNK MI TÖRTÉNHET…
AKKOR MEKKORA IS LEHET A HIBA?
DEFEKTUS/KLOC
Vállalati standard: 15-50/1000
Microsoft standard: 10-20/1000
Space-shuttle software: 0/500.000
Nálunk vajon mennyi?
A PROBLÉMA MEGFOGALMAZÁSA
A komplex munka minden esetben hibával jár
A hibák számát és hatását minimalizálni kell Költséghatékonyság
Minden fázisban megfelelő „védekező mechanizmusok” Üzleti tervezés
Technikai tervezés
Fejlesztés
Minőség-ellenőrzés Thx Tyrael
CÉLUNK
A szoftverminőség biztosítása, és az
erőforrás-ráfordítás minimalizálása az
egész életciklusra nézve.
MIT TEHET A FEJLESZTŐ?
Tervezés
Implementálás
Ellenőrzés
Tesztelés
Karbantartás
TERVEZÉS
• Átgondoltság
• Megfelelő specifikálás
• Elvárt működés
• Tesztelhetőségi feltételek
Megfelelő struktúra
Static hívások kerülése
Dependency injection
ELLENŐRZÉS
Kódolás és tesztelés közti fázis
Indirekt
Csökkenti a tesztelés-javítás fázis idejét
Code review!
Építő jellegű kritika
TESZTELÉS
Adott rendszer adott körülmények között az
elvártaknak megfelelően reagál e.
MI A TESZTELÉS
A szoftvertesztelés a szoftverminőség-biztosítás
és így a szoftverfejlesztés részét képezi. A
tesztelés egy rendszer vagy program kontrollált
körülmények melletti futtatása, és az
eredmények kiértékelése. A hagyományos
megközelítés szerint a tesztelés célja az, hogy a
fejlesztés során létrejövő hibákat minél
korábban felfedezze, és ezzel csökkentse azok
kijavításának költségeit.
- Wikipedia
HIBAJAVÍTÁS KÖLTSÉGE
HOGY CSINÁLJUK TEHÁT EZT MOST?
KŐKOR
Mi az, amit most csinálunk?
Lefuttatjuk
echo, var_dump, trigger_error
debug() függvény
Problémák
Ad hoc
Módosítások a kódban (korrumpálhat)
Nehezen kezelhető
Kézzel kell futtatni a bemeneteket
ALAPELVEK
Megismételhetőség
Kiszámíthatóság
Tervezettség
Kicsitől a nagy fele (bottom-up)
Pareto-elv (80/20)
TESZTEK CSOPORTOSÍTÁSA I
Transzparensség
Blackbox
Whitebox
Scope
Egységteszt
Integrációs teszt
Rendszer teszt
Rendszer integrációs teszt
TESZTEK CSOPORTOSÍTÁSA II
Funkcionalitás
Funkcionális
Nem funkcionális
Felelős
Fejlesztő (Kivitelező)
Tesztelő
Igénylő
Harmadik személy (pl. felhasználó)
A TELJESSÉG IGÉNYE NÉLKÜL
Verifikációs teszt (a terméket jól készítettük e el?)
Validációs teszt (a megfelelő terméket készítettük e el?)
Elfogadási teszt
Terhelés teszt
Biztonsági teszt
Kódminőségi tesztek
Modul/Egységteszt
Scenario alapú tesztelés
GUI tesztelés Selenium
Komplex állapotterek problémája
MAI ELSŐDLEGES FÓKUSZUNK
Egységteszt Whitebox
Egység
Funkcionális
Fejlesztői
Jellemzői Általános elveknek való megfelelés
Egyszerűen írható és futtatható
A legkisebb egység (osztály) funkcionális vizsgálata
Alapelv Ha a részek hibásak, az egész sem lehet megfelelő
PHP UNIT TEST FRAMEROK-ÖK LISTÁJA
PHPUnit
Testilence
PHPSpec Behavior Driven Development
Lime Symfony
Apache-Test
Ojes Documentation Driven Testing
SimpleTest nem élő fejlesztés
SnapTest nem élő fejlesztés
Amock nem élő fejlesztés
PHPUNIT
Sebastian Bergmann
thePHP.cc
XUnit család
JUnit-ból
3.4-es verzió
PHP5
PEAR-ből installálható
De facto PHP szabvány
Kitünő manual
FUNKCIONÁLIS TESZTELÉS
<?php
$fixture = array();
echo count($fixture) == 0 ? ’ok\n’ : ’not ok\n’;
$fixture[] = ’element’;
echo count($fixture) == 1 ? ’ok\n’ : ’not ok\n’;
A példák a PHPUnit manualból vannak
ASSERT-EK
assertArrayHasKey()
assertClassHasAttribute()
assertClassHasStaticAttribute()
assertContains()
assertContainsOnly()
assertEqualXMLStructure()
assertEquals()
assertFalse()
assertFileEquals()
assertFileExists()
assertGreaterThan()
assertGreaterThanOrEqual()
assertLessThan()
assertLessThanOrEqual()
assertNull()
assertObjectHasAttribute()
assertRegExp()
assertSame()
assertSelectCount()
assertSelectEquals()
assertSelectRegExp()
assertStringEndsWith()
assertStringEqualsFile()
assertStringStartsWith()
assertTag()
assertThat()
assertTrue()
assertType()
assertXmlFileEqualsXmlFile()
assertXmlStringEqualsXmlFile()
assertXmlStringEqualsXmlString()
ASSERT-EK ALKALMAZÁSA
<?php$fixture = array();assertTrue(count($fixture) == 0);
$fixture[] = 'element';assertTrue(count($fixture) == 1);
function assertTrue($condition){
if (!$condition) {throw new Exception(’Assertion failed!’);
}}
ELSŐ UNITTEST-ÜNK
<?phprequire_once ’PHPUnit/Framework.php’;
class StackTest extends PHPUnit_Framework_TestCase{
public function testPushAndPop(){
$stack = array();$this->assertEquals(0, count($stack));
array_push($stack, ’foo’);$this->assertEquals(’foo’, $stack[count($stack)-1]);$this->assertEquals(1, count($stack));
$this->assertEquals(’foo’, array_pop($stack));$this->assertEquals(0, count($stack));
}}
OSZTÁLYOK TESZTELÉSE – AZ OSZTÁLY
<?php
class My_Fleet implements Countable
{
protected $ships = array();
public function addShip($shipName)
{
$this->ships[] = $shipName;
}
public function count()
{
return count($this->ships);
}
public function getShip($index)
{
return $this->ships[intval($index)];
}
}
A példa a Zend Devzone-ről származik
OSZTÁLYOK TESZTELÉSE – A TESZT
<?php
require_once 'PHPUnit/Framework.php';
require_once 'My/Fleet.php';
class MyFleetTest extends PHPUnit_Framework_TestCase
{
protected $fleet = null;
public function setUp()
{
$this->fleet = new My_Fleet;
}
public function tearDown()
{
unset($this->fleet);
}
public function testShouldNotHaveAnyShipsYetInIntitialState()
{
$this->assertEquals(0, count($this->fleet));
}
public function testAddingAShipWillIncrementCountByOne()
{
$this->fleet->addShip('USS Enterprise');
$this->assertEquals(1, count($this->fleet));
}
// …
}
MOCKING ÉS STUB-OK
<?php
require_once 'SomeClass.php';
class StubTest extends PHPUnit_Framework_TestCase{
public function testStub(){
// Create a stub for the SomeClass class.$stub = $this->getMock('SomeClass');
// Configure the stub.$stub->expects($this->any())
->method('doSomething')->will($this->returnValue('foo'));
// Calling $stub->doSomething() will now return// 'foo'.$this->assertEquals('foo', $stub->doSomething());
}}
HOVA TOVÁBB
Teszteléselmélet
Formális módszerek
Phing
Continious Integration
Hudson
PHPUnderControl
TDD
TIPIKUS PROBLÉMÁK
Nem megfelelő erőforrás-ráfordítás
Túl kevés
Túl sok
Lefedettség
Rejtett hibák
Immunissá válás
Többszörös hiba
Kontextus függőség
HÍVÓKÉRDÉS, VÉGSZÓ
Felelősség!
Fejlesztő
Management
KÖSZÖNÖM!
Kérdések?A dia elérhető: http://slideshare.net/vvinston