36

Click here to load reader

Teszt alapú fejlesztés

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

Page 1: Teszt alapú fejlesztés

TESZT ALAPÚ FEJLESZTÉS

Simon Bence

Duodecad, 2010-09-28

Page 2: Teszt alapú fejlesztés

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

Page 3: Teszt alapú fejlesztés

A MICROSOFT ZUNE ÚJ ÉVE

2008 szilveszter

30GB Zune

Mind meghalt

Dátumkezelés bug

Page 4: Teszt alapú fejlesztés

AIR-TRAFFIC CONTROL SYSTEM, LA AIRPORT

1994 szeptember 9

Kapcsolatvesztés

Több, mint 400 repülő

Page 5: Teszt alapú fejlesztés

AZ ARIANE 5 FELROBBANÁSA

1995

36 másodpercet repült

Hibás int kezelés

Több, mint 500m USD

kár

Page 6: Teszt alapú fejlesztés

ÉS VELÜNK MI TÖRTÉNHET…

Page 7: Teszt alapú fejlesztés

AKKOR MEKKORA IS LEHET A HIBA?

Page 8: Teszt alapú fejlesztés

DEFEKTUS/KLOC

Vállalati standard: 15-50/1000

Microsoft standard: 10-20/1000

Space-shuttle software: 0/500.000

Nálunk vajon mennyi?

Page 9: Teszt alapú fejlesztés

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

Page 10: Teszt alapú fejlesztés

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.

Page 11: Teszt alapú fejlesztés

MIT TEHET A FEJLESZTŐ?

Tervezés

Implementálás

Ellenőrzés

Tesztelés

Karbantartás

Page 12: Teszt alapú fejleszté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

Page 13: Teszt alapú fejlesztés

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

Page 14: Teszt alapú fejlesztés

TESZTELÉS

Adott rendszer adott körülmények között az

elvártaknak megfelelően reagál e.

Page 15: Teszt alapú fejlesztés

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

Page 16: Teszt alapú fejlesztés

HIBAJAVÍTÁS KÖLTSÉGE

Page 17: Teszt alapú fejlesztés

HOGY CSINÁLJUK TEHÁT EZT MOST?

Page 18: Teszt alapú fejlesztés

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

Page 19: Teszt alapú fejlesztés

ALAPELVEK

Megismételhetőség

Kiszámíthatóság

Tervezettség

Kicsitől a nagy fele (bottom-up)

Pareto-elv (80/20)

Page 20: Teszt alapú fejlesztés

TESZTEK CSOPORTOSÍTÁSA I

Transzparensség

Blackbox

Whitebox

Scope

Egységteszt

Integrációs teszt

Rendszer teszt

Rendszer integrációs teszt

Page 21: Teszt alapú fejlesztés

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ó)

Page 22: Teszt alapú fejlesztés

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

Page 23: Teszt alapú fejlesztés

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ő

Page 24: Teszt alapú fejlesztés

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

Page 25: Teszt alapú 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

Page 26: Teszt alapú fejlesztés

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

Page 27: Teszt alapú fejlesztés

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()

Page 28: Teszt alapú fejlesztés

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!’);

}}

Page 29: Teszt alapú fejlesztés

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));

}}

Page 30: Teszt alapú fejlesztés

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

Page 31: Teszt alapú fejlesztés

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));

}

// …

}

Page 32: Teszt alapú fejlesztés

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());

}}

Page 33: Teszt alapú fejlesztés

HOVA TOVÁBB

Teszteléselmélet

Formális módszerek

Phing

Continious Integration

Hudson

PHPUnderControl

TDD

Page 34: Teszt alapú fejlesztés

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

Page 35: Teszt alapú fejlesztés

HÍVÓKÉRDÉS, VÉGSZÓ

Felelősség!

Fejlesztő

Management

Page 36: Teszt alapú fejlesztés

KÖSZÖNÖM!

Kérdések?A dia elérhető: http://slideshare.net/vvinston