| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Erfahrener Benutzer | Generell sollte man immer a) pro Klasse und b) pro Methode testen. Es spricht nichts dagegen, parentMethod als solches zu testen ohne zu mocken. Voraussetzung: Man testet childPeter und childKlaus, sowie etwaige ifs etc. darin auch wirklich nochmal separat durch. Ich persönlich tendiere immer dazu, nur die externen Klassenabhängigkeiten zu mocken bei Unit-Tests. Abhängigkeiten, die sich aus privaten/protected Methoden oder aus Vererbungen ergeben, werden nicht separat gemockt. Das ist jedoch eine Frage der Philosophie oder der Paranoia. Testfälle sind ja immer im Gut-Fall aufgebaut. Heisst: Wenn du nicht erwartest, dass _childPeter eine Exception wirft, dann brauchst du das auch in parentMethod nicht prüfen. Testest du _childPeter alleine, stellt PhpUnit sicher, dass unerwartete Exceptions auf einen Fehler laufen und damit ist das Thema erledigt. Ob parentMethod damit richtig umgeht, kann dir eigentlich egal sein, da _childPeter den Vertrag nicht eingehalten hat und damit auch der Fehler woanders liegt. Ist _childPeter hingegen beispielsweise eine DB-Zugriffsmethode, die eine Exception werfen darf (NoConnection oder sowas), dann musst du auch verifizieren, wie parentMethod mit dieser Exception "klar kommt". Egal ob du nun _childPeter mockst um diese Exception zu werfen (was im Zweifelsfall wohl die klügste Variante ist) oder ob du was anderes mockst um den regulären Code aus _childPeter die Exception werfen zu lassen. Natürlich bauen Unit-Tests immer auf zwei Dingen auf: - Den Vertrag (Api-Beschreibung u.ä.), den eine Klasse bzw. Methode eingeht - Der Arbeitsweise in der Methode Alle anderen Ansätze, also beispielsweise fachliche Tests, dienen nicht dazu, eine hohe Code-Abdeckung zu erreichen, sondern sind logisch begründete Tests zum Zusammenspiel mehrerer Komponenten. Streng genommen sind das keine Unit-Tests mehr, auch wenn man sie technisch per PhpUnit abbildet
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih |
| | |
| | |
| Erfahrener Benutzer | Normalerweise genau das erstere, also die zu testende Klasse mocken und gezielt die beiden Methoden dabei überschreiben. Das mit den Abhängigkeiten sehe ich prinzipiell auch anders. Das liegt aber am Testansatz. Betrachtest du deine Klasse als API und willst die öffentliche Schnittstelle testen oder willst du eine komplexe Implementierung testen? Im Prinzip sollte man immer beides machen. Unit-Tests gehen auf Komponentenebene, auf Klassenebene aber ebend - wie der Autor es machen will - auf Methodenebene. Ich gehe generell so vor: 1. Testen auf Methodenebene 2. Testen auf Klassenebene (Zusammenspiel der Methoden) 3. Testen auf Komponentenebene (Zusammenspiel mehrerer Klassen einer Komponente) 4. Testen auf fachlicher Ebene (Selenium/Bildschirme usw.)
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih |
| | |
| | |
| Erfahrener Benutzer | Kann nur von Flow3 sprechen, das leitet das aber im Prinzip auch an die Mocking-Tools von PhpUnit weiter. Vom Grundprinzip her kannst beim Mock in Flow3 (und hoffentlich damit in PhPUnit selbst) angeben, welche Methoden gemockt werden. Das sieht dann etwa so aus: PHP-Code: Aber es geht ja nur um eine theoretische Diskussion und nicht um lauffähigen Code.Wie ich Eingangs bereits sagte. Wenn man Unit-Tests auf Methodenebene macht und dazu die abhängigen Methoden mocken will, spricht nichts dagegen. Und natürlich musst du die gemockten nochmal isoliert ine inem zweiten Tesfall testen, sagte ich auch bereits (auch wenns erste Post evtl. unverständlich war). Es ist eine Frage der Philosophie. Je feiner und kleiner die zu testende Unit ist, desto leichter findet man Fehler, desto höher ist der Testabdeckungsgrad (alles positiv). Aber: Desto höher ist der Aufwand, desto höher ist der notwendige Umbau bei Umbau der zu testenden Klassen (alles negativ). Aber das sind gefühlte Faktoren, keine harten No-Gos. Wer sich en Aufwand machen will, wer sich (wie beim Zend Framework beispielsweise) eine 100% Code-Abdeckung in den Kopf gesetzt hat, der wird deutlich feiner aufgebaute Testfälle haben. Was man nie machen sollte: Das große Ganze zu vernachlässigen. Selbst wenn jede Methode für sich getestet wurde, sollte man immer auch noch Testfälle machen, die die gesamte Klasse testen. Man sollte Testfälle machen, die eine ganze Komponente, also mehrere Klassen testen. Aus zwei Gründen: Nach einem größeren Umbau hat man zumindest noch diese größeren Testfälle, die funktionieren müssen. Und zudem treten viele Fehler auch erst auf, wenn die Klassen miteinander agieren. Bei feinen Unit-Tests auf Methodenebene werden immer mal Konstellationen übersehen. Aber mal einen praktischen Nutzen davon: -> Gegeben sei eine abstrakte Datenbank-Basisklasese. Diese kann eine Entität aus einer Datenbanktabelle auslesen und in sie zurückschreiben. -> Um die ID eines Objektes rauszufinden interagiert diese Basisklasse relativ komplex mit der Persistenzschicht (Neues Objekt? Gelöschtes Objekt? usw.) Wenn man nun die Datenbankzugriffsklasse testet und eine andere Methode im Sinn hat, die lediglich die ID des Objektes abfragt um damit weiter zu hantieren, hat man die Wahl zwischen: a) Mocken der Persistenzschicht inklusive der 10 Aufrufe dahin. b) Mocken der Methode "GetID" um eine erwartete ID einfach direktzurückzugeben und damit die eigentliche Methode hantieren zu lassen. Dass GetID die richtige ID aus der Persistenzschicht abfragt, das wird von separaten Testfällen des Basisframeworks abgedeckt und ist dami nicht im Fokus der eigenen Testfälle. Ich hoffe, dass dieses Beispiel das Mocken von zumindest protected Methoden rechtfertigt. Im Extremfall auch das Mocken von Private-Methoden.
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih Geändert von mepeisen (15.04.2011 um 00:55 Uhr). |
| | |
| | |||
| Erfahrener Benutzer | Zitat:
![]() Im Ernst. Ich definiere zuerst das Testziel. Und baue darauf die Tests auf. In vielen meiner Projekte habe ich den Anspruch, 100% Code-Abdeckung zu erreichen. Dennoch entscheide ich von Fall zu Fall ob mehrere Methoden gemeinsam getestet werden oder ebend nicht. Die API zu testen und damit quasi ohne Implementierungswissen zu testen, kommt immer zusätzlich oben drauf. Ich teste gewissermassen beides: Sowohl die Klasse, wie sie als Blackbox funktionieren sollte, als auch die Implementierung dahinter. Ich bin mir bewusst, dass dies bei einem Refactoring zusätzlichen Aufwand bedeutet. Aber generell gilt bis zu einem gewissen Grad (Ja, irgendwann wirds kontraproduktiv): Den Aufwand, den man am Anfang in einen Testfall reinsteckt, den spart man sich bei Erweiterungen und bei der Wartung usw. Refactoring ist für mich kein Argument, da ich generell nur 10%, maximal 20% meines Codes jemals einem Refactoring unterwerfe (Leistungserweiterungen, wie neue Attribute in einer Entität zähle ich mal nicht zum Refactoring). Zitat:
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih | ||
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| performante Verknüpfung von Tabellen?? | Gimpel | Datenbanken | 13 | 27.02.2010 14:57 |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| testkonzept beispiel, mocken stubben, private methoden mocken, beispiel testkonzept, java junit testkonzept, phpunit private methode mocken, tesfall methoden, unit test php, abstract methoden testen \code coverage\ php, testkonzept standard, php funktionen mocken, java stubben von methoden, vorteil von unit test in der zu testenden klasse, selenium testkonzept, testkonzepte schreiben, mocken von private methoden, protected methoden im modultest, junit testkonzept, nunit test privater methoden, phpunit parent methode mocken |