Framework-Qualitat: Tests alsGutesiegel
Benjamin Eberlei
SimpleThings GmbH
IPC Spring, Mai 2009
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 1 / 33
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
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
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
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
Einstellung zu Tests & Qualitatssicherung
Einstellung zu Tests & Qualitatssicherung
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 6 / 33
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
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
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
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
Große Zahl von Unittests
Große Zahl von Unittests
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 11 / 33
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
Wahl des Unit-Testing Frameworks
Wahl des Unit-Testing Frameworks
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 13 / 33
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
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
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
Hohe Code-Coverage der Tests
Hohe Code-Coverage der Tests
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 17 / 33
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
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
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
Subjektive Einschatzung
Subjektive Einschatzung
Einstellung
Unit-Tests
Testing-Framework
Coverage
Code-Duplikation
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 21 / 33
Tests als Dokumentation
Tests als Dokumentation
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 22 / 33
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
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
Testing Bad-Practices
Testing Bad-Practices
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 25 / 33
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
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
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
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
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
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
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
Testing Bad-Practices Testgeruche
Thank You!
B. Eberlei (SimpleThings GmbH) Framework-Qualitat IPC Spring, Mai 2009 33 / 33