33
Framework-Qualit¨ at: Tests als utesiegel Benjamin Eberlei SimpleThings GmbH IPC Spring, Mai 2009 B. Eberlei (SimpleThings GmbH) Framework-Qualit¨ at IPC Spring, Mai 2009 1 / 33

Framework-Qualität: Tests als Gütesiegel

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Framework-Qualität: Tests als Gütesiegel

Framework-Qualitat: Tests alsGutesiegel

Benjamin Eberlei

SimpleThings GmbH

IPC Spring, Mai 2009

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 1 / 33

Page 2: Framework-Qualität: Tests als Gütesiegel

Uber Mich

Uber mich

I Volkswirt

I PHP seit 2001

I Software Entwickler beiSimpleThings GmbH

I Zend Framework Contributor

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 2 / 33

Page 3: Framework-Qualität: Tests als Gütesiegel

Warum Framework-Qualitat?

Warum sollte unsFramework-Qualitat interesieren?

I Framework soll Gewinn und keineLast sein

I Echten Mehrwert fur Programmiererschaffen

I Aber: Auch Frameworks haben Bugs!

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 3 / 33

Page 4: Framework-Qualität: Tests als Gütesiegel

Warum Framework-Qualitat?

Framework-Bugs

1. Bugs in fremden Code schwer zu finden

2. Framework-Code ist schwer zu debuggen

3. Komplexitat und Wartungsaufwand durch UserlandFixes

4. Konnen Fertigstellung von End-Anwendungenmassiv verzogern

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 4 / 33

Page 5: Framework-Qualität: Tests als Gütesiegel

Wie Framework Qualitat messen?

Wie Framework Qualitat messen?

1. Einstellung zu Tests & Qualitatssicherung

2. Große Zahl von Unittests

3. Wahl des Unit-Testing Frameworks

4. Hohe Code-Coverage der Tests

5. Tests als Dokumentation

6. Testing Bad-Practices

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 5 / 33

Page 6: Framework-Qualität: Tests als Gütesiegel

Einstellung zu Tests & Qualitatssicherung

Einstellung zu Tests & Qualitatssicherung

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 6 / 33

Page 7: Framework-Qualität: Tests als Gütesiegel

Einstellung zu Tests & Qualitatssicherung Zend Framework

Zend Framework

I Jede neue Komponente muss mindestens 80%Code-Coverage haben

I Fur jeden Bug mindestens 1 Regression-Test

I Wird leider nicht von allenKomponenten-Maintainern eingehalten

I Tests werden haufig erst nach der komplettenEntwicklung und wenige Tage vor dem Releasegeschrieben

I Coverage fur manche Komponenten sinkt nachRelease mit der Zahl neuer Features

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 7 / 33

Page 8: Framework-Qualität: Tests als Gütesiegel

Einstellung zu Tests & Qualitatssicherung eZ Components

eZ Components

I Aufwandige Design- und Konzeptionsphase, gefolgtvon Test-Driven Development

I Fur Bugs existieren Regression-Tests

I Ausgefallene Teststrategien

I Nur Release wenn alle Bugs gefixed sind

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 8 / 33

Page 9: Framework-Qualität: Tests als Gütesiegel

Einstellung zu Tests & Qualitatssicherung Symfony

Symfony

I Alle Komponenten weitestgehend gestestet

I Keine Regression-Tests fur Bugfixes - dievorhandene Testsuite soll nur nicht fehlschlagen

I Nur Release wenn keine Tests fehlschlagen

I Nicht nur Unit-Tests sondern auch eineTest-Anwendung fur Integrationstests

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 9 / 33

Page 10: Framework-Qualität: Tests als Gütesiegel

Einstellung zu Tests & Qualitatssicherung CakePHP

CakePHP

I Erst seit CakePHP 1.2.x uberhaupt Tests

I Viele Tests ruckwirkend auf existierenden Codeaufgesetzt

I Positiv: Seitdem Regressiontests fur behobene Bugs

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 10 / 33

Page 11: Framework-Qualität: Tests als Gütesiegel

Große Zahl von Unittests

Große Zahl von Unittests

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 11 / 33

Page 12: Framework-Qualität: Tests als Gütesiegel

Große Zahl von Unittests

Große Zahl von Unittests

Entwarnung: Alle großen Frameworks haben vieleUnittests!

I Zend Framework: 6000-10000 Tests (Je nachaktivierten Optionen)

I eZ Components: 6583 Tests

I Symfony: 500 Testsuites

I CakePHP: 88 Testsuites mit 1274 Tests

I Viele andere bekanntere Frameworks haben einegroße Zahl von Unittests, z.B. FLOW3, Doctrine,Agavi, SolarPHP

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 12 / 33

Page 13: Framework-Qualität: Tests als Gütesiegel

Wahl des Unit-Testing Frameworks

Wahl des Unit-Testing Frameworks

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 13 / 33

Page 14: Framework-Qualität: Tests als Gütesiegel

Wahl des Unit-Testing Frameworks PHPUnit

PHPUnit

I Integriert sich hervorragend in ContinuousIntegration Tools

I Zahlreiche Qualitats-Reports und zeilenweiseCode-Coverage

I Verwendet von: Zend Framework, eZ Components(sowie Agavi, FLOW3, Doctrine 2, SolarPHP,u.v.m.)

I eZ Components leider mit einem unhandlichemeigenen Test-Runner, der Zugang zu neuerenFeatures von PHPUnit blockiert

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 14 / 33

Page 15: Framework-Qualität: Tests als Gütesiegel

Wahl des Unit-Testing Frameworks Lime

Lime

I Eigenbau fur das Symfony FrameworkI Nur fern verwandt mit xUnit Testing FrameworksI Code-Coverage nur auf Klassen-EbeneI Unubersichtliche prozedurale Test-Skripte

$t = new lime_test(2, new lime_output_color ());

$v = new sfValidatorPass ();

$t ->diag(’->clean ()’);$t ->is($v ->clean(’’), ’’, ’->clean () always returns

the value unmodified ’);$t ->is($v ->clean(null), null , ’->clean () always

returns the value unmodified ’);

sfValidatorPassTest.php, SVN Revision 9991

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 15 / 33

Page 16: Framework-Qualität: Tests als Gütesiegel

Wahl des Unit-Testing Frameworks SimpleTest

SimpleTest

I Wird verwendet von: CakePHP

I Lauft ebenso wie Cake auch unter PHP4

I CakePHP mit eigenem unausgereiften Test-Runnerim Web-Browser

I Nur Klassen/Datei basierte Test-Coverage

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 16 / 33

Page 17: Framework-Qualität: Tests als Gütesiegel

Hohe Code-Coverage der Tests

Hohe Code-Coverage der Tests

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 17 / 33

Page 18: Framework-Qualität: Tests als Gütesiegel

Hohe Code-Coverage der Tests

Hohe Code-Coverage der Tests

Coverage ist Abhangig von den installierten Extensions,Datenbank- und Serviceverbindungen

I Zend Framework: Viele Komponenten mit mehrals 80%, einige auch mit mehr als 90%

I Symfony: Durchschnitt 76% (Doctrine und PropelPlugins fast ungetestet)

I eZ Components: Alle Komponenten mit mehr als80-90%

I CakePHP: Funktioniert nicht fur alleKomponenten (Fatal Errors, Keine Ergebnisse)Coverage aber im Bereich 70-90%

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 18 / 33

Page 19: Framework-Qualität: Tests als Gütesiegel

Wenig Code-Duplikation in Tests

Wenig Code-Duplikation in Tests

PHP Copy Paste Detector

pear channel -discover pear.phpunit.depear install PHPUnit/PHPCPD

Test auf kleine Mengen an Copy Paste Code zurFixturegenerierung oder Assertions:

phpcpd --min -lines 4 --min -tokens 20 .

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 19 / 33

Page 20: Framework-Qualität: Tests als Gütesiegel

Wenig Code-Duplikation in Tests

Wenig Code-Duplikation in Tests

I symfony: 1.48% Duplikate bei 18.823 Codezeilen.

I Zend Framework: 6.04% Duplikate bei 238.844Codezeilen

I CakePHP: 10.02% Duplikate bei 74.015 Codezeilen

I eZ Components (ohne ezcWebdav): 12.39%Duplikate bei 168.321 Codezeilen

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 20 / 33

Page 21: Framework-Qualität: Tests als Gütesiegel

Subjektive Einschatzung

Subjektive Einschatzung

Einstellung

Unit-Tests

Testing-Framework

Coverage

Code-Duplikation

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 21 / 33

Page 22: Framework-Qualität: Tests als Gütesiegel

Tests als Dokumentation

Tests als Dokumentation

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 22 / 33

Page 23: Framework-Qualität: Tests als Gütesiegel

Tests als Dokumentation

Tests als Dokumentation

I Tests erlauben Verstandnis der API einesFrameworks

I Special Cases meist nur in Tests dokumentiert

I Schwer verstandliche Tests sind Argument gegenFramework

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 23 / 33

Page 24: Framework-Qualität: Tests als Gütesiegel

Tests als Dokumentation

Obskure und Gigantische Tests

I Obskure Tests sind sehr komplex undunverstandlich

I Giant Tests sind sehr groß und daherunverstandlich

I Beispiel: CakePHP Model Test

I Beispiel: Zend Soap AutoDiscover

I Beispiel: Symfony Form Test

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 24 / 33

Page 25: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices

Testing Bad-Practices

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 25 / 33

Page 26: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices Testgeruche

Integration-, Web-Surfer-, Slow-Test

Zend Service Amazon OnlineTestpublic function setUp() {

$this ->_amazon = new Zend_Service_Amazon(TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID

);$this ->_query = new Zend_Service_Amazon_Query(

TESTS_ZEND_SERVICE_AMAZON_ONLINE_ACCESSKEYID);

$this ->_httpClientAdapter = newZend_Http_Client_Adapter_Socket ();

$this ->_amazon ->getRestClient ()->getHttpClient ()->setAdapter($this ->_httpClientAdapter);

// terms of use compliance: no more than onequery per second

sleep (1);}

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 26 / 33

Page 27: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices Testgeruche

Web-Surfer-, Assertionless

Zend Service Amazon OnlineTest

public function testItemSearchMusicMozart (){

$resultSet = $this ->_amazon ->itemSearch(array(’SearchIndex ’ => ’Music’,’Keywords ’ => ’Mozart ’,’ResponseGroup ’ => ’Small ,Tracks ,Offers ’));

foreach ($resultSet as $item) {$this ->assertTrue(

$item instanceof Zend_Service_Amazon_Item);

}}

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 27 / 33

Page 28: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices Testgeruche

Global State

Zend Controller Action Helper ViewRendererTest

protected function setUp (){$this ->request=new Zend_Controller_Request_Http ();$this ->response=new Zend_Controller_Response_Http ();$this ->front=Zend_Controller_Front :: getInstance ();$this ->front ->resetInstance ();$this ->front ->addModuleDirectory($this ->somePath)

->setRequest($this ->request)->setResponse($this ->response);

$this ->helper = newZend_Controller_Action_Helper_ViewRenderer ();

Zend_Controller_Action_HelperBroker :: addHelper($this->helper);

}

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 28 / 33

Page 29: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices Testgeruche

Fragile and Indirect Tests

ezcMvcToolsConfigurableDispatcherTest

function testExternalRedirect (){

$config = new simpleConfiguration ();$config ->route = ’IRController ’;$dispatcher =

new ezcMvcConfigurableDispatcher($config);$dispatcher ->run();

self:: assertEquals("BODY: Name: name , Vars: array ([CR] "." ’nonRedirVar ’ => 4,[CR] "." ’ReqRedirVar ’ => 4,[CR])",$config ->store

);}

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 29 / 33

Page 30: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices Testgeruche

Assertionless

Zend Pdf DrawingTest

public function testDrawing (){

$pdf = new Zend_Pdf ();

// Etwa 150 Zeilen Bilder , Text usw. hinzufuegen

$pdf ->save(dirname(__FILE__) . ’/_files/output.pdf’);

unset($pdf);

$pdf1 = Zend_Pdf ::load(dirname(__FILE__) . ’/_files/output.pdf’);

$this ->assertTrue($pdf1 instanceof Zend_Pdf);unset($pdf1);

unlink(dirname(__FILE__) . ’/_files/output.pdf’);}

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 30 / 33

Page 31: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices Testgeruche

Erkenntnisse

I Vor der Nutzung von Framework Komponenten indie Tests schauen

I Eigene Tests fur Anforderungen schreiben und wennmoglich zum Framework beisteuern

I Bei kritischen Business-Anwendungen eines schlechtgetesteten Frameworks nach Alternativen umsehenoder selber implementieren

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 31 / 33

Page 32: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices Testgeruche

Attribution

I Snetterton Classic Car Racing, Martin Pettitthttp://www.flickr.com/photos/mdpettitt/2659028559/

I House No More, nukeit1http://www.flickr.com/photos/nukeit1/33325525/

I March of the Baby Turtles, clearlyambiguoushttp://www.flickr.com/photos/clearlyambiguous/48185613/

I Cannon and Meade, unforthhttp://www.flickr.com/photos/unforth/3414535842

I Swiss Knife, airosanhttp://www.flickr.com/photos/airosan/2232394342

I Pile of Paper, pburghsteverhttp://www.flickr.com/photos/pburghstever/3328140917

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 32 / 33

Page 33: Framework-Qualität: Tests als Gütesiegel

Testing Bad-Practices Testgeruche

Thank You!

B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 33 / 33