Wir arbeiten derzeit an einem mittleren / großen PHP / MySQL-Projekt. Wir führen Unit-Tests mit PHPUnit & QUnit durch und haben zwei Vollzeit-Tester, die die Anwendung manuell testen. Unsere Testdaten (Mock-Daten) werden derzeit mit SQL-Skripten erstellt.
Wir haben Probleme mit der Verwaltung von Skripten für Testdaten. Die Geschäftslogik ist ziemlich komplex und eine "einfache" Änderung der Testdaten führt häufig zu mehreren Fehlern in der Anwendung (die keine echten Fehler sind, sondern nur das Produkt ungültiger Daten). Dies ist für das gesamte Team zu einer großen Belastung geworden, da wir ständig Tabellen erstellen und ändern.
Ich sehe keinen Sinn darin, die Testdaten in den Skripten zu verwalten, da mit der Benutzeroberfläche alles in etwa 5 Minuten manuell in die Anwendung eingefügt werden kann. Unser PM ist anderer Meinung und sagt, dass es eine schlechte Praxis ist, ein Projekt zu haben, das wir nicht mit Testdaten bereitstellen können.
Sollten wir die Wartung der Skripte mit Testdaten abbrechen und die Tester die Anwendung ohne Daten testen lassen? Was ist die beste Vorgehensweise?
quelle
Ja, Unit-Tests und Datenmodelle sind eine bewährte Methode. Der Projektmanager ist korrekt. Da eine "einfache" Änderung der Testdaten häufig zu Fehlern führt, ist dies der Kern des Problems.
Der Code muss verbessert werden. Dies nicht zu tun (zu sagen, hey, wir brauchen keine Tests) ist keine Lösung, das bedeutet einfach, technische Schulden hinzuzufügen . Teilen Sie den Code in kleinere, besser testbare Einheiten auf, da es ein Problem ist, Einheiten ohne Bruch nicht identifizieren zu können.
Starten Sie einen Refactor. Halten Sie die Verbesserungen klein, damit sie überschaubar sind. Suchen Sie nach Anti-Mustern wie Gottesklassen / -methoden, die nicht DRY, Einzelverantwortung usw. folgen.
Schauen Sie sich zum Schluss TDD an , um zu sehen, ob es für das Team funktioniert. TDD funktioniert gut, um sicherzustellen, dass Ihr gesamter Code testbar ist (weil Sie die Tests zuerst schreiben) und um sicherzustellen, dass Sie schlank bleiben, indem Sie gerade genug Code schreiben, um die Tests zu bestehen (Minimierung über das Engineering hinaus).
Wenn eine Reihe komplexer Geschäftslogikprozesse einen Datensatz erzeugt, sehe ich dies im Allgemeinen als Bericht an. Kapsel den Bericht. Führen Sie den Bericht aus und verwenden Sie das resultierende Objekt als Eingabe für den nächsten Test.
quelle
Dies ist ein sehr häufiges und auch sehr schwieriges Problem. Automatisierte Tests, die für eine Datenbank ausgeführt werden (selbst für eine In-Memory-Datenbank wie HSQLDB ), sind normalerweise langsam, nicht deterministisch und, da ein Testfehler nur darauf hinweist, dass irgendwo in Ihrem Code oder in Ihren Daten ein Problem vorliegt, sind sie es nicht viel informativ.
Nach meiner Erfahrung besteht die beste Strategie darin, sich auf Komponententests für die Geschäftslogik zu konzentrieren. Versuchen Sie, so viel wie möglich von Ihrem Kerndomänencode abzudecken. Wenn Sie dieses Teil richtig machen, was selbst eine ziemliche Herausforderung darstellt, erzielen Sie das beste Kosten-Nutzen-Verhältnis für automatisierte Tests. Was die Persistenzschicht betrifft, investiere ich normalerweise viel weniger Aufwand in automatisierte Tests und überlasse sie dedizierten manuellen Testern.
Wenn Sie jedoch Persistenztests wirklich automatisieren möchten (oder müssen), würde ich Ihnen empfehlen, Growing Object-Oriented Software, Guided by Tests, zu lesen . Dieses Buch enthält ein ganzes Kapitel über Persistenztests.
quelle