Leseprobe. Sebastian Bergmann, Stefan Priebsch. Softwarequalität in PHP-Projekten ISBN: 978-3-446-41923-0



Ähnliche Dokumente
StuPro-Seminar Dokumentation in der Software-Wartung. StuPro-Seminar Probleme und Schwierigkeiten in der Software-Wartung.

Lineargleichungssysteme: Additions-/ Subtraktionsverfahren

Professionelle Seminare im Bereich MS-Office

Klassenentwurf. Wie schreiben wir Klassen, die leicht zu verstehen, wartbar und wiederverwendbar sind? Objektorientierte Programmierung mit Java

Leseprobe. Bruno Augustoni. Professionell präsentieren. ISBN (Buch): ISBN (E-Book):

Informationsblatt Induktionsbeweis

geben. Die Wahrscheinlichkeit von 100% ist hier demnach nur der Gehen wir einmal davon aus, dass die von uns angenommenen

infach Geld FBV Ihr Weg zum finanzellen Erfolg Florian Mock

Diplomarbeit. Konzeption und Implementierung einer automatisierten Testumgebung. Thomas Wehrspann. 10. Dezember 2008

Objektorientierte Programmierung für Anfänger am Beispiel PHP

Fehler und Probleme bei Auswahl und Installation eines Dokumentenmanagement Systems

Was bringt TDD wirklich?

Das System sollte den Benutzer immer auf dem Laufenden halten, indem es angemessenes Feedback in einer angemessenen Zeit liefert.

Persönliche Zukunftsplanung mit Menschen, denen nicht zugetraut wird, dass sie für sich selbst sprechen können Von Susanne Göbel und Josef Ströbl

Qualitätsmanagement im Projekt

Prozessbewertung und -verbesserung nach ITIL im Kontext des betrieblichen Informationsmanagements. von Stephanie Wilke am

Konzentration auf das. Wesentliche.

Zeichen bei Zahlen entschlüsseln

Testen mit JUnit. Motivation

SEP 114. Design by Contract

Was meinen die Leute eigentlich mit: Grexit?

40-Tage-Wunder- Kurs. Umarme, was Du nicht ändern kannst.

Die integrierte Zeiterfassung. Das innovative Softwarekonzept

«PERFEKTION IST NICHT DANN ERREICHT, WENN ES NICHTS MEHR HINZUZUFÜGEN GIBT, SONDERN DANN, WENN MAN NICHTS MEHR WEGLASSEN KANN.»

Komponententest. Testen von Software Systemen. Übung 02 SS 2009 Version:

Was ist Sozial-Raum-Orientierung?

Fachbericht zum Thema: Anforderungen an ein Datenbanksystem

Fachdidaktik der Informatik Jörg Depner, Kathrin Gaißer

Primzahlen und RSA-Verschlüsselung

Fortgeschrittenes Programmieren mit Java. Test Driven Development

Das große ElterngeldPlus 1x1. Alles über das ElterngeldPlus. Wer kann ElterngeldPlus beantragen? ElterngeldPlus verstehen ein paar einleitende Fakten

Vermeiden Sie es sich bei einer deutlich erfahreneren Person "dranzuhängen", Sie sind persönlich verantwortlich für Ihren Lernerfolg.

DER SELBST-CHECK FÜR IHR PROJEKT

Informationssystemanalyse Problemstellung 2 1. Trotz aller Methoden, Techniken usw. zeigen Untersuchungen sehr negative Ergebnisse:

Welchen Weg nimmt Ihr Vermögen. Unsere Leistung zu Ihrer Privaten Vermögensplanung. Wir machen aus Zahlen Werte

Leseprobe. Thomas Konert, Achim Schmidt. Design for Six Sigma umsetzen ISBN: Weitere Informationen oder Bestellungen unter

Einführung und Motivation

SEO Erfolg mit themenrelevanten Links

PTV VISWALK TIPPS UND TRICKS PTV VISWALK TIPPS UND TRICKS: VERWENDUNG DICHTEBASIERTER TEILROUTEN

Was versteht man unter Softwaredokumentation?

ONLINE-AKADEMIE. "Diplomierter NLP Anwender für Schule und Unterricht" Ziele

Nicht über uns ohne uns

Albert HAYR Linux, IT and Open Source Expert and Solution Architect. Open Source professionell einsetzen

Agile Enterprise Development. Sind Sie bereit für den nächsten Schritt?

AGROPLUS Buchhaltung. Daten-Server und Sicherheitskopie. Version vom b

Regeln für das Qualitäts-Siegel

Alle gehören dazu. Vorwort

ARCO Software - Anleitung zur Umstellung der MWSt

Memeo Instant Backup Kurzleitfaden. Schritt 1: Richten Sie Ihr kostenloses Memeo-Konto ein

Warum sich das Management nicht für agile Softwareentwicklung interessieren sollte - aber für Agilität

ZfP-Sonderpreis der DGZfP beim Regionalwettbewerb Jugend forscht BREMERHAVEN. Der Zauberwürfel-Roboter. Paul Giese. Schule: Wilhelm-Raabe-Schule

CONTINUOUS LEARNING. Agile Anforderungsanalyse mit Impact Mapping

Ist Fernsehen schädlich für die eigene Meinung oder fördert es unabhängig zu denken?

SDD System Design Document

Was sind Jahres- und Zielvereinbarungsgespräche?

Leseauszug DGQ-Band 14-26

TYPO3 CMS 6.2 LTS. Die neue TYPO3- Version mit Langzeit- Support

Softwarequalität: Zusammenfassung und Ausblick. 17. Juli 2013

1. Weniger Steuern zahlen

Bernadette Büsgen HR-Consulting

Projektmanagement in der Spieleentwicklung

[Customer Service by KCS.net] KEEPING CUSTOMERS SUCCESSFUL

ERGEBNISSE DER CW-MARKTSTUDIE COLLABORATION AUS DER CLOUD IM UNTERNEHMENSEINSATZ IN TABELLARISCHER FORM

Robot Karol für Delphi

Wir erledigen alles sofort. Warum Qualität, Risikomanagement, Gebrauchstauglichkeit und Dokumentation nach jeder Iteration fertig sind.

DAS PARETO PRINZIP DER SCHLÜSSEL ZUM ERFOLG

Info zum Zusammenhang von Auflösung und Genauigkeit

Autoformat während der Eingabe

Speicher in der Cloud


Meet the Germans. Lerntipp zur Schulung der Fertigkeit des Sprechens. Lerntipp und Redemittel zur Präsentation oder einen Vortrag halten

Kulturelle Evolution 12

Pflegende Angehörige Online Ihre Plattform im Internet

Der Schutz von Patientendaten

Die Post hat eine Umfrage gemacht

Mehr Geld verdienen! Lesen Sie... Peter von Karst. Ihre Leseprobe. der schlüssel zum leben. So gehen Sie konkret vor!

agitat Werkzeuge kann man brauchen und missbrauchen - vom Einsatz von NLP in der Führung

Wichtige Forderungen für ein Bundes-Teilhabe-Gesetz

Inhalt. 1 Einleitung AUTOMATISCHE DATENSICHERUNG AUF EINEN CLOUDSPEICHER

Kundenbefragung als Vehikel zur Optimierung des Customer Service Feedback des Kunden nutzen zur Verbesserung der eigenen Prozesse

Java Entwicklung für Embedded Devices Best & Worst Practices!

Grundlagen der Theoretischen Informatik, SoSe 2008

REQUIREMENTS ENGINEERING KONSTRUKTIVE QS REQUIREMENTS ENGINEERING 1

Volksbank BraWo Führungsgrundsätze

Content Management System mit INTREXX 2002.

50 Fragen, um Dir das Rauchen abzugewöhnen 1/6

Klausur Software-Engineering SS 2005 Iwanowski

Leseprobe - Seite 5 - Kapitel 5 Fragetechniken - Einfürung

.. für Ihre Business-Lösung

a) Bis zu welchem Datum müssen sie spätestens ihre jetzigen Wohnungen gekündigt haben, wenn sie selber keine Nachmieter suchen wollen?

GPP Projekte gemeinsam zum Erfolg führen

Taking RM Agile. Erfahrungen aus dem Übergang von traditioneller Entwicklung zu Scrum

Mobile Intranet in Unternehmen

Das Leitbild vom Verein WIR

Traditionelle Suchmaschinenoptimierung (SEO)

E-Learning für Mitarbeiter: Lufthansa Technik

Cad-OasEs Int. GmbH. 20 Jahre UG/NX Erfahrung prägen Methodik und Leistungen. Nutzen Sie dieses Wissen!

Agile Vorgehensmodelle in der Softwareentwicklung: Scrum

Installationsanleitung Maschinenkonfiguration und PP s. Release: VISI 21 Autor: Anja Gerlach Datum: 18. Dezember 2012 Update: 18.

Hinweise in Leichter Sprache zum Vertrag über das Betreute Wohnen

Transkript:

Leseprobe Sebastian Bergmann, Stefan Priebsch Softwarequalität in PHP-Projekten ISBN: 978-3-446-41923-0 Weitere Informationen oder Bestellungen unter http://www.hanser.de/978-3-446-41923-0 sowie im Buchhandel. Carl Hanser Verlag, München

Kapitel 1 Software-Qualität Qualität ist das Maß der Nichtabweichung des Ists vom Soll. Klaus Franz 1.1 Was ist Software-Qualität? Dieses Buch behandelt das Thema Software-Qualität in PHP-Projekten. Doch was verstehen wir eigentlich unter der Qualität von Software? Das bei Hewlett- Packard entwickelte FURPS [Grady 1987] ist ein Beispiel für ein Software- Qualitätsmodell, das verschiedene Aspekte von Software-Qualität berücksichtigt. Die Buchstaben des Akronyms stehen für Functionality (Funktionalität) Usability (Gebrauchstauglichkeit) Reliability (Zuverlässigkeit) Performance (Effizienz) Supportability (Wartbarkeit) Neben den Qualitätsmerkmalen von FURPS, die für sämtliche Arten von Software gelten, werden von einer Webanwendung zusätzlich unter anderem Auffindbarkeit, Barrierefreiheit sowie Rechtskonformität verlangt [Franz 2007]. Auch in der Einleitung von [Liggesmeyer 2009] kann man lesen, dass Software-Qualität facettenreich ist:

4 1 Software-Qualität Jedes Unternehmen, das Software entwickelt, bemüht sich, die beste Qualität auszuliefern. Man kann ein Ziel aber nur dann nachweisbar erreichen, wenn es präzise definiert ist, und das gilt für den Begriff beste Qualität nicht. Software- Qualität ist facettenreich. Viele Eigenschaften einer Software ergeben gemeinsam die Software-Qualität. Nicht alle diese Eigenschaften sind gleichermaßen für den Benutzer und den Hersteller einer Software wichtig. Die Benutzer einer Software haben also eine andere Sicht auf die Qualität als die Entwickler, wir sprechen von externer beziehungsweise interner Qualität. Nigel Bevan erläutert diesen Ansatz aus [ISO/IEC 9126-1] in [Bevan 1999]. Im Folgenden wollen wir diese unterschiedlichen Sichtweisen genauer betrachten. 1.1.1 Externe Qualität Der Kunde beziehungsweise der Benutzer einer Anwendung interessiert sich für diejenigen Qualitätsaspekte, die für ihn greifbar sind. Diese machen die sogenannte externe Qualität der Anwendung aus und umfassen unter anderem: Funktionalität bezeichnet die Fähigkeit der Anwendung, die von ihr erwarteten Aufgaben den Anforderungen entsprechend zu erfüllen. Gebrauchstauglichkeit meint, dass ein Nutzer eine Anwendung effizient, effektiv und zufriedenstellend nutzen kann. Hierzu gehört auch die Barrierefreiheit. Reaktionsfreudigkeit Die Zufriedenheit der Benutzer mit der Antwortzeit der Anwendung kann über Erfolg und Misserfolg einer Anwendung entscheiden. Sicherheit, gerade auch die gefühlte Sicherheit der Benutzer, ist ein weiterer wichtiger Faktor für den Erfolg einer Anwendung. Verfügbarkeit und Zuverlässigkeit sind im Umfeld von Web-Plattformen mit hohem Nutzeraufkommen wichtige Themen. Die Anwendung muss auch unter großer Last funktionstüchtig sein und selbst in ungewöhnlichen Situationen sinnvoll funktionieren. Den Aspekten der externen Qualität ist gemeinsam, dass sie durch End-to-End- Tests, also Tests, die eine gesamte Anwendung testen, überprüft werden können. So können beispielsweise die Anforderungen, die der Kunde an sein Produkt stellt, in sogenannten Akzeptanztests aufgeschrieben werden. Diese Akzeptanztests verbessern zum einen die Kommunikation zwischen dem Kunden und dem Entwickler der Software, zum anderen lässt sich mit ihnen automatisch verifizieren, ob die Anwendung die an sie gestellten funktionalen Anforderungen erfüllt. Für Verbesserungen in Bezug auf die Reaktionsfreudigkeit ist unter anderem das Messen der Antwortzeit relevant. Man benötigt Werkzeuge und Techniken, mit denen man diejenigen Optimierungen finden kann, die bei minimalem Aufwand und minimalen Kosten den größten Nutzen versprechen. Sowohl Administrato-

1.1 Was ist Software-Qualität? 5 ren als auch Entwickler sind beim Capacity Planning dafür verantwortlich, diejenigen Teile der Anwendung zu identifizieren, die zukünftig möglicherweise zu Flaschenhälsen werden können, wenn die Anwendung geändert wird oder das Nutzeraufkommen wächst. Diese Informationen sind unverzichtbar, um die Qualität einer Anwendung in Bezug auf Verfügbarkeit und Zuverlässigkeit dauerhaft zu sichern. 1.1.2 Interne Qualität Die Bedürfnisse der Entwickler beziehungsweise der Administratoren einer Anwendung machen deren interne Qualität aus. Für Entwickler ist es beispielsweise wichtig, dass der Code einfach zu lesen, zu verstehen, anzupassen und zu erweitern ist. Ist dies nicht der Fall, so wird es mit der Zeit immer schwieriger und damit teurer, die kontinuierlich gestellten und meist unvorhersehbaren Änderungswünsche des Kunden umzusetzen. Die Gefahr wächst, dass selbst minimale Änderungen zu unerwarteten Seiteneffekten führen. Die interne Qualität von Software ist für die Auftraggeber und Endbenutzer zunächst kaum wahrnehmbar. Für den Endbenutzer muss Software primär die an sie gestellten funktionalen Anforderungen zumindest weitestgehend erfüllen, und sie muss leicht zu bedienen sein. Sofern das Produkt bei der Abnahme dann noch schnell genug ist, sind viele Auftraggeber zufrieden. Erst auf längere Sicht wird mangelnde interne Qualität spürbar. Man stellt nämlich fest, dass es lange dauert, bis scheinbar triviale Fehler behoben sind. Änderungen oder Erweiterungen sind nur mit großem Aufwand zu realisieren. Oftmals bitten die Entwickler früher oder später um Spielräume, um den Code zu refaktorieren, also aufzuräumen. Meist wird eine Refaktorierung des Codes allerdings nicht genehmigt, weil Auftraggeber oder Management keinen Nutzen sehen, der die entstehenden Kosten rechtfertigt. Refaktorierung Eine ÄnderunganderinternenStruktureinerSoftware[...]ohneihrbeobachtbares Verhalten zu ändern. [Fowler 2000] Automatisierte Entwicklertests auf Modulebene (englisch: Unit-Tests), wie wir sie im nächsten Kapitel diskutieren werden, ermöglichen die unmittelbare Überprüfung, ob durch eine Änderung neue Fehler eingeführt wurden. Ohne sie ist die Refaktorierung von Code nur schwer möglich. Ein Ziel der Qualitätssicherung, oder genauer genommen des Qualitätsmanagements, muss daher sein, für alle am Projekt beteiligten Parteien die Kosten und den Nutzen von interner Qualität transparent zu machen. Gelingt es, die Kosten zu quantifizieren, die durch schlechte interne Qualität langfristig entstehen, kann man davon ausgehend im Rückschluss die Kostenersparnis aufzeigen, die Code

6 1 Software-Qualität von hoher interner Qualität ermöglichen würde. Nur so kann es gelingen, das Management beziehungsweise den Auftraggeber zu einem Umdenken zu bewegen, damit diese ein Budget für Code-Refaktorierung genehmigen. 1.2 Technical Debt Auf Ward Cunningham geht der Begriff der technischen Schulden (englisch: Technical Debt) [Cunningham 1992] zurück: Although immature code may work fine and be completely acceptable to the customer, excess quantities will make a program unmasterable, leading to extreme specialization of programmers and finally an inflexible product. Shipping first time code is like going into debt. A little debt speeds development so long as it is paid back promptly with a rewrite. Objects make the cost of this transaction tolerable. The danger occurs when the debt is not repaid. Every minute spent on not-quiteright code counts as interest on that debt. Entire engineering organizations can be brought to a stand-still under the debt load of an unconsolidated implementation, object-oriented or otherwise. Cunningham vergleicht schlechten Code mit einem Darlehen, für das Zinsen fällig werden. Es kann durchaus sinnvoll sein, ein Darlehen aufzunehmen, wenn dadurch das Produkt schneller vermarktungsfähig ist. Wird aber das Darlehen nicht getilgt, indem die Codebasis refaktoriert und damit die interne Qualität erhöht wird, dann entstehen langfristig erhebliche Kosten für die Zinszahlungen. Häufen sich die Schulden erst einmal an, dann nehmen einem die Zinszahlungen jeden Spielraum, bis man schließlich Konkurs anmelden muss. Bezogen auf die Softwareentwicklung bedeutet dies, dass eine Anwendung unwartbar geworden ist. Die Kosten für jede noch so kleine Änderung sind so hoch geworden, dass es nicht mehr wirtschaftlich ist, den Code weiter zu pflegen. Mangelnde interne Qualität von Software wird oft besonders dann ein Problem, wenn die Entwicklung einer Anwendung an externe Dienstleister ausgelagert wird. Da die Qualitätssicherung und insbesondere das Schreiben von Unit-Tests die Kosten im Projekt zunächst erhöhen, ohne dass dem ein unmittelbar messbarer Nutzen gegenübersteht. Ist dem Auftraggeber primär an niedrigen Kosten und einer kurzen Time-to-Market gelegen, ist der Dienstleister daher nicht motiviert, qualitativ hochwertigen Code zu liefern. Den Schaden hat der Auftraggeber in Form von längerfristig deutlich höheren Wartungskosten. Es ist daher für jedes Softwareprojekt und insbesondere beim Outsourcing besonders wichtig, dass nicht nur die zu erfüllenden Kriterien bezüglich der externen Qualität festgelegt werden, sondern vom Auftraggeber auch ein sinnvolles Maß an interner Qualität gefordert wird. Selbstverständlich muss der Auftraggeber dazu dem Dienstleister im Projekt auch einen gewissen finanziellen und zeitlichen Spielraum zugestehen.

1.2 Technical Debt 7 Relative cost of a bugfix 0 50 100 150 1x 5x 10x 20x 50x > 150x Requirements Design Code Developer Tests Acceptance Tests Operations Abbildung 1.1: Relative Kosten von Fehlerbehebungen nach [Boehm 2008] Die Betriebs- und Wartungskosten für Software werden zumeist unterschätzt. Ein mittelgroßes Softwareprojekt dauert vielleicht ein oder zwei Jahre an, die entstandene Anwendung ist aber Jahrzehnte in Betrieb, zumeist viel länger als ursprünglich gedacht 1.Dergrößte Kostenblock für langlebige Anwendungen sind meist der Betrieb und die Wartung, insbesondere für Anwendungen, die häufig geändert werden müssen. Gerade für Webanwendungen sind häufige Änderungen typisch und letztlich einer der stärksten Motivatoren, diese in dynamischen Sprachen wie PHP umzusetzen. Andere Anwendungen, beispielsweise solche für Großrechner im Finanzsektor oder hochverfügbare Telefonvermittlungen, müssen dagegen nur selten geändert werden. Während hier eine Änderung pro Quartal schon hektisch wirkt, sind für viele Webanwendungen mehrere Releases pro Monat schon längst die Regel. [Jeffries 2010] mahnt uns, nicht an der internen Qualität zu sparen, um die Entwicklung zu beschleunigen: If slacking on quality makes us go faster, it is clear evidence that there is room to improve our ability to deliver quality rapidly. Es liegt auf der Hand, dass der Wert von interner Qualität mit zunehmender Änderungshäufigkeit von Anwendungen deutlich zunimmt. Die Abbildung 1.1 zeigt, dass die relativen Kosten für das Beheben eines Fehlers in der Code-Phase zehnmal, in der Operations-Phase sogar mehr als hundertmal höher sind als in der Requirements-Phase. Das zeigt, dass es schon rein betriebswirtschaftlich gesehen nicht sinnvoll ist, Kosten in einem Softwareprojekt dadurch in die Zukunft zu verlagern, dass man notwendige Tätigkeiten aufschiebt. 1 Erinnern Sie sich noch an das Jahr 2000-Problem?

8 1 Software-Qualität 1.3 Konstruktive Qualitätssicherung Die Capability Maturity Model Integration (CMMI) 1 und die Software Process Improvement and Capability Determination (SPICE) [ISO/IEC 15504] sowie [ISO/IEC 12207] fassen den Begriff der Qualitätssicherung enger, als er oft verwendet wird, denn das Testen wird nicht eingeschlossen [Foegen 2007]. Die Maßnahmen von CMMI und SPICE für die Aufbau- und Ablauforganisation sind jedoch die Voraussetzung für den Erfolg von analytischen Maßnahmen wie Test und Review der fertigen Software sowie konstruktiven Maßnahmen der Qualitätssicherung. [Schneider 2007] definiert konstruktive Qualitätssicherung als Maßnahmen, die bereits bei der Konstruktion von Software auf die Verbesserung ausgewählter Qualitätsaspekte abzielen und nicht erst nachträglich durch Prüfung und Korrektur. Die Erkenntnis, dass das Vermeiden von Fehlern besser ist als das nachträgliche Finden und Beheben von Fehlern, ist nicht neu. Schon in [Dijkstra 1972] können wir lesen: Those who want really reliable software will discover that they must find means of avoiding the majority of bugs to start with, and as a result the programming process will become cheaper. If you want more effective programmers, you will discover that they should not waste their time debugging they should not introduce bugs to start with. Ein Ansatz, der das Schreiben von fehlerhafter Software verhindern soll, ist die Test-First-Programmierung. Sie gehört zu den technisch geprägten Praktiken, die als Bestandteil moderner Software-Entwicklungsprozesse zur konstruktiven Qualitätssicherung beitragen. Der Testcode wird hierbei vor dem getesteten Code, dem sogenannten Produktionscode, geschrieben. Die hierauf aufbauende testgetriebene Entwicklung (englisch: Test-Driven Development) führt im Idealfall dazu, dass... es keinen Produktionscode gibt, der nicht durch einen Test motiviert ist. Dies reduziert das Risiko, Produktionscode zu schreiben, der nicht benötigt wird. es keinen Produktionscode gibt, der nicht durch mindestens einen Test abgedeckt (Code-Coverage) ist, und damit Änderungen am Produktionscode nicht zu unbemerkten Seiteneffekten führen können. testbarer Produktionscode, und damit sauberer Code (siehe unten), geschrieben wird. die Schmerzen, die bestehender schlechter Code verursacht, verstärkt werden, da dieser nicht oder nur mit unverhältnismäßig hohem Aufwand getestet werden kann. Dies motiviert dazu, bestehenden schlechten Code durch Refaktorierung konsequent zu verbessern. 1 http://www.sei.cmu.edu/cmmi/

1.4 Sauberer Code 9 Studien wie [Janzen 2006] zeigen, dass die testgetriebene Entwicklung zu signifikanten Verbesserungen der Produktivität der Entwickler sowie der Software- Qualität führen kann. Der Übergang zwischen konstruktiver Qualitätssicherung und normaler Softwareentwicklung ist fließend. So wird die Anpassbarkeit der Software beispielsweise durch den Einsatz von objektorientierter Programmierung und die Verwendung von Entwurfsmustern verbessert. Das Schreiben von sauberem Code (siehe nächster Abschnitt) sowie die Verwendung von Konzepten wie Drei-Schichten-Architektur oder Model-View-Controller (siehe nächstes Kapitel) führen, sofern sie richtig umgesetzt werden, zu deutlichen Verbesserungen in Bezug auf Testbarkeit, Wartbarkeit und Wiederverwendbarkeit der einzelnen Komponenten der Software. 1.4 Sauberer Code Die Frage Was ist sauberer Code? lässt Robert C. Martin in seinem Buch Clean Code [Martin 2008] unter anderem Dave Thomas beantworten: Sauberer Code kann von anderen Entwicklern gelesen und verbessert werden. Er verfügt über Unit- und Acceptance-Tests. Er enthält bedeutungsvolle Namen. Er stellt zur Lösung einer Aufgabe nicht mehrere, sondern eine Lösung zur Verfügung. Er enthält minimale Abhängigkeiten, die ausdrücklich definiert sind, und stellt ein klares und minimales API zur Verfügung. Steve Freeman und Nat Pryce führen den Gedanken in [Freeman 2009] mit der Aussage fort, dass Code, der einfach zu testen ist, gut sein muss: For a class to be easy to unit-test, the class must have explicit dependencies that can easily be substituted and clear responsibilities that can easily be invoked and verified. In software-engineering terms, that means that the code must be loosely coupled and highly cohesive in other words, well-designed. Im Folgenden wollen wir diese Punkte genauer betrachten. 1.4.1 Explizite und minimale Abhängigkeiten Die Abhängigkeiten einer zu testenden Methode müssen klar und explizit in der API definiert sein. Das bedeutet, dass benötigte Objekte entweder an den Konstruktor der entsprechenden Klasse oder an die Methode selbst übergeben werden müssen (Dependency Injection). Die benötigten Objekte sollen nicht im Rumpf der Methode erzeugt werden, da die Abhängigkeiten sonst nicht gekapselt sind und daher nicht gegen Mock-Objekte ausgetauscht werden können. Je weniger Abhängigkeiten eine Methode hat, desto einfach gestaltet sich das Schreiben ihrer Tests.

10 1 Software-Qualität 1.4.2 Klare Verantwortlichkeiten Das Single Responsibility Principle (SRP) [Martin 2002] verlangt, dass eine Klasse nur eine fest definierte Aufgabe zu erfüllen hat und lediglich über Methoden verfügen soll, die direkt zur Erfüllung dieser Aufgabe beitragen. Es sollte nie mehr als einen Grund geben, eine Klasse zu ändern. Ist die Verantwortlichkeit einer Klasse klar definiert und lassen sich ihre Methoden einfach aufrufen und über ihre Rückgabewerte verifizieren, so ist das Schreiben der entsprechenden Unit-Tests einfach. 1.4.3 Keine Duplikation Eine Klasse, die versucht, zu viel zu tun, und keine klare Verantwortlichkeit hat, ist eine hervorragende Brutstätte für duplizierten Code, Chaos und Tod [Fowler 2000]. Duplizierter Code erschwert die Wartung der Software, da die Konsistenz zwischen den einzelnen Duplikaten gewährleistet sein muss und ein Fehler, der in dupliziertem Code gefunden wird, nicht nur an einer einzigen Stelle behoben werden kann. 1.4.4 Kurze Methoden mit wenigen Ausführungszweigen Eine Methode ist umso schwerer zu verstehen, je länger sie ist. Eine kurze Methode lässt sich nicht nur einfacher verstehen und wiederverwenden, sondern ist auch einfacher zu testen. Je weniger Ausführungspfade eine Methode hat, desto weniger Tests werden benötigt. 1.5 Software-Metriken Für das Messen der internen Qualität gibt es verschiedene Software-Metriken. Sie sind eine Grundlage für das Quantifizieren der Kosten, die durch schlechte interne Qualität langfristig entstehen. Software-Metrik Eine Software-Metrik ist allgemein eine Funktion, die eine Softwareeinheit in einem Zahlenwert abbildet. Dieser Wert ist interpretierbar als der Erfüllungsgrad eines Qualitätsziels für die Softwareeinheit. [Schneider 2007] Testbarkeit ist ein wichtiges Kriterium für die Wartbarkeit im Software-Qualitätsmodell von [ISO/IEC 9126-1]. [Bruntink 2004] und [Khan 2009] sind Beispiele für Ansätze zur Quantifizierung von Testbarkeit basierend auf objektorientierten Software-Metriken. Einen Überblick über objektorientierte Software-Metriken

1.5 Software-Metriken 11 gibt beispielsweise [Lanza 2006]. Im Folgenden betrachten wir einige Software- Metriken, die für die Testbarkeit besonders relevant sind. 1.5.1 Zyklomatische Komplexität und NPath-Komplexität Die zyklomatische Komplexität (englisch: Cyclomatic Complexity) ist die Anzahl der möglichen Entscheidungspfade innerhalb eines Programms beziehungsweise innerhalb einer Programmeinheit, normalerweise einer Methode oder Klasse [McCabe 1976]. Sie wird durch Zählen der Kontrollstrukturen und booleschen Operatoren innerhalb der Programmeinheit berechnet und sagt etwas über die strukturelle Schwierigkeit einer Programmeinheit aus. McCabe geht davon aus, dass die einfache Abfolge von sequenziellen Befehlen einfacher zu verstehen ist als eine Verzweigung im Programmfluss. Eine hohe zyklomatische Komplexität ist ein Indikator dafür, dass eine Programmeinheit anfällig für Fehler und schwer zu testen ist. Je mehr Ausführungspfade eine Programmeinheit hat, desto mehr Tests werden benötigt. Die NPath- Komplexität [Nejmeh 1988] zählt die azyklischen Ausführungspfade. Um die Anzahl der Ausführungspfade endlich zu halten und redundante Informationen auszuschließen, berücksichtigt die NPath-Komplexität nicht jeden möglichen Schleifendurchlauf. 1.5.2 Change Risk Anti-Patterns (CRAP) Index Der Change Risk Anti-Patterns (CRAP) Index, ursprünglich als Change Risk Analysis and Predictions Index bekannt, sagt nicht direkt etwas über die Testbarkeit aus. Er soll an dieser Stelle aber nicht unerwähnt bleiben, da er sich neben der Cyclomatic Complexity auch aus der durch die Tests erreichten Code-Coverage berechnet. Code, der nicht zu komplex ist und über eine ausreichende Testabdeckung verfügt, weist einen niedrigen CRAP-Wert auf. Das Risiko, dass Änderungen an diesem Code zu unerwarteten Seiteneffekten führen, ist geringer als bei Code, der einen hohen CRAP-Wert aufweist. Letzteres ist für komplexen Code mit wenigen oder sogar gar keinen Tests der Fall. Der CRAP-Wert kann entweder durch das Schreiben von Tests oder durch eine geeignete Refaktorierung gesenkt werden. Beispielsweise helfen die Refaktorierungen Methode extrahieren und Bedingten Ausdruck durch Polymorphismus ersetzen dabei, eine Methode zu verkürzen und die Anzahl der möglichen Entscheidungspfade und damit die zyklomatische Komplexität zu verringern.

12 1 Software-Qualität 1.5.3 Non-Mockable Total Recursive Cyclomatic Complexity Miško Hevery definiert für den von ihm entwickelten Testability Explorer 1,ein Werkzeug, das die Testbarkeit von Java-Code misst, unter anderem die Non- Mockable Total Recursive Cyclomatic Complexity-Software-Metrik. Der Name setzt sich wie folgt zusammen: Cyclomatic Complexity Die strukturelle Schwierigkeit einer Methode (siehe oben) Recursive Wir betrachten nicht nur die zyklomatische Komplexität einer einzelnen Methode, sondern beziehen auch die zyklomatische Komplexität des von einer Methode aufgerufenen Codes mit in die Berechnung ein. Total Wir beziehen die strukturelle Schwierigkeit der Objekterzeugung ebenfalls mit in die Berechnung ein. Non-Mockable Code von Abhängigkeiten, die durch ein Mock-Objekt ersetzt werden können, wird für die Berechnung nicht betrachtet. Ein Mock- Objekt ersetzt ein reales Objekt zu Testzwecken (siehe Kapitel 2). Die Non-Mockable Total Recursive Cyclomatic Complexity misst also die Menge an komplexem Code, der für Unit-Tests nicht durch Mock-Objekte ersetzt werden kann. Diese komplexen Abhängigkeiten, von denen eine zu testende Programmeinheit nicht durch Verwendung eines Mock-Objekts isoliert werden kann, führen zu Schmerzen beim Testen. Durch entsprechende Refaktorierungen, beispielsweise durch Einführung von Dependency Injection, sollten diese Abhängigkeiten gekapselt und gegen Mock-Objekte austauschbar gemacht werden. 1.5.4 Global Mutable State Bei der Global Mutable State-Metrik handelt es sich um eine weitere Software- Metrik, die Miško Hevery für den Testability Explorer definiert hat. Sie zählt die Bestandteile des Global State, auf den eine Programmeinheit verändernd zugreift beziehungsweise zugreifen kann. Hierzu gehören in PHP globale und superglobale Variablen sowie statische Attribute in Klassen. Änderungen am Global State sind ein Seiteneffekt, der nicht nur einen einzelnen Test erschwert, sondern von dem sämtliche anderen Tests zu isolieren sind. Hierfür bietet PHPUnit beispielsweise die Möglichkeit, eine Sicherung von globalen und superglobalen Variablen sowie statischen Attributen in Klassen vor jedem Test anzulegen und nach jedem Test wiederherzustellen, damit die Änderungen eines Tests am Global State nicht zu einem Fehlschlagen eines anderen Tests führen. Diese Isolation, die durch die Ausführung jedes Tests in einem jeweils eigenen PHP-Prozess noch weiter getrieben werden kann, ist jedoch ressourcenintensiv und sollte vermieden werden, indem man auf Global State verzichtet. 1 http://code.google.com/p/testability-explorer/

1.6 Werkzeuge 13 1.5.5 Kohäsion und Kopplung Ein System mit starker Kohäsion besteht aus Komponenten, die nur für genau eine spezifizierte Aufgabe zuständig sind. Eine lose Kopplung ist dann erreicht, wenn Klassen voneinander weitgehend unabhängig sind und nur durch wohldefinierte Schnittstellen miteinander kommunizieren [Yourdon 1979]. Das Gesetz von Demeter (englisch: Law of Demeter) [Lienberherr 1989] verlangt, dass eine Methode eines Objekts nur Methoden desselben Objekts sowie von an die Methode per Parameter übergebenen und in der Methode erzeugten Objekten aufrufen darf. Die Einhaltung dieses Gesetzes führt zu klaren Abhängigkeiten und loser Kopplung. Dies macht die Abhängigkeiten gegen Mock-Objekte austauschbar und erleichtert so das Schreiben von Tests. 1.6 Werkzeuge So facettenreich wie die Software-Qualität ist, so vielfältig sind die Werkzeuge, die PHP-Entwicklern zur Verfügung stehen, um die Software-Qualität von PHP- Projekten zu messen und zu verbessern. PHPUnit PHPUnit 1 ist der De-facto-Standard für Unit-Tests in PHP. Das Framework unterstützt das Schreiben, Organisieren und Ausführen von Tests. Beim Schreiben der Tests können die Entwickler unter anderem auf Mock-Objekte (siehe Kapitel 2 und Kapitel 9) und Funktionalität für das Testen von Datenbank-Interaktionen (siehe Kapitel 10) sowie eine Integration mit Selenium (siehe Kapitel 11) für browser-gestützte End-to-End-Tests zurückgreifen. Für die Verwendung in der kontinuierlichen Integration können die Testergebnisse als JUnit XML und die Code-Coverage als Clover XML protokolliert werden (siehe Kapitel 12). phploc phploc 2 misst mithilfe unterschiedlicher Ausprägungen der Lines of Code (LOC) Software-Metrik den Umfang eines PHP-Projekts. Darüber hinaus zählt es die Anzahl der Namensräume, Klassen, Methoden und Funktionen in einem Projekt und berechnet Werte wie durchschnittliche Komplexität und Länge von Klassen und Methoden. Kapitel 12 zeigt ein Beispiel für die Verwendung von phploc. 1 http://phpun.it/ 2 http://github.com/sebastianbergmann/phploc