Teszt alapú fejlesztés
Upcoming SlideShare
Loading in...5
×
 

Teszt alapú fejlesztés

on

  • 3,862 views

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.

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.

Statistics

Views

Total Views
3,862
Views on SlideShare
3,859
Embed Views
3

Actions

Likes
4
Downloads
18
Comments
0

1 Embed 3

http://vvinston.posterous.com 3

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Teszt alapú fejlesztés Teszt alapú fejlesztés Presentation Transcript

  • 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-TrafficControl 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
    ThxTyrael
  • 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
    Dependencyinjection
  • 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
    Codereview!
    É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étké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
    BehaviorDrivenDevelopment
    Lime
    Symfony
    Apache-Test
    Ojes
    DocumentationDriven 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 ’ : ’not ok ’; $fixture[] = ’element’;echo count($fixture) == 1 ? ’ok ’ : ’not ok ’;
    A példák a PHPUnitmanualbó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
    classMy_FleetimplementsCountable
    {
    protected$ships = array();
    publicfunctionaddShip($shipName)
    {
    $this->ships[] = $shipName;
    }
    publicfunctioncount()
    {
    returncount($this->ships);
    }
    publicfunctiongetShip($index)
    {
    return$this->ships[intval($index)];
    }
    }
    A példa a ZendDevzone-ről származik
  • Osztályok tesztelése – a teszt
    <?php
    require_once'PHPUnit/Framework.php';
    require_once'My/Fleet.php';
    classMyFleetTestextendsPHPUnit_Framework_TestCase
    {
    protected$fleet= null;
    publicfunctionsetUp()
    {
    $this->fleet= newMy_Fleet;
    }
    publicfunctiontearDown()
    {
    unset($this->fleet);
    }
    publicfunctiontestShouldNotHaveAnyShipsYetInIntitialState()
    {
    $this->assertEquals(0, count($this->fleet));
    }
    publicfunctiontestAddingAShipWillIncrementCountByOne()
    {
    $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
    ContiniousIntegration
    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