Der Leiter der Softwareentwicklung meines Unternehmens ist gerade "zurückgetreten" (dh entlassen), und wir versuchen nun, die Entwicklungspraktiken in unserem Unternehmen zu verbessern. Wir wollen Unit-Tests in jeder Software implementieren, die von hier an erstellt wird.
Das Feedback der Entwickler lautet wie folgt:
- Wir wissen, dass das Testen wertvoll ist
- Sie ändern jedoch ständig die technischen Daten, sodass Zeitverschwendung entsteht
- Und Ihre Fristen sind so eng, dass wir sowieso nicht genug Zeit zum Testen haben
Das Feedback des CEO lautet wie folgt:
- Ich möchte, dass unser Unternehmen automatisierte Tests durchführt, weiß aber nicht, wie ich das erreichen kann
- Wir haben keine Zeit, umfangreiche Spezifikationsdokumente zu schreiben
Wie bekommen Entwickler die Spezifikationen jetzt? Mundpropaganda oder PowerPoint-Folie. Das ist natürlich ein großes Problem. Mein Vorschlag ist folgender:
- Geben wir den Entwicklern auch eine Reihe von Testdaten und Unit-Tests
- Das ist die Spezifikation. Es ist Sache des Managements, klar und quantitativ darüber zu entscheiden, was es will.
- Die Entwickler können festlegen, welche andere Funktionalität sie benötigen, und diese muss nicht durch Tests abgedeckt werden
Wie haben Sie das Problem gelöst, wenn Sie jemals in einem Unternehmen tätig waren, das sich in dieser Situation befand? Scheint dieser Ansatz vernünftig?
unit-testing
tdd
Pete SupportMonica
quelle
quelle
Antworten:
Es scheint, dass Sie zwei verschiedene Arten von Tests miteinander verwechseln: Komponententests und System- / Abnahmetests . Erstere arbeiten auf einer niedrigeren Ebene und testen kleine Codeteile (normalerweise einzelne Methoden), die sich normalerweise tief im Programm befinden und für die Benutzer nicht direkt sichtbar sind. Letzteres testet das gesamte Programm aus Sicht seiner Benutzer auf einer viel höheren Granularitätsebene. Somit kann nur letzteres auf irgendeiner Form von Systemspezifikation basieren.
Die Trennung der beiden Probleme erleichtert den Übergang zu einem verbesserten Entwicklungsprozess. Starten Sie Unit - Tests zu schreiben , so bald wie möglich , unabhängig davon , wie die Software ist (nicht) auf hohem Niveau festgelegt. Wann immer ein Entwickler eine Methode erstellt oder ändert, tut er etwas Konkretes, was Unit-getestet werden kann (und sollte). Nach meiner Erfahrung wirken sich selbst sich ändernde Anforderungen auf hoher Ebene in der Regel nicht dramatisch auf diese Codeblöcke auf niedrigerer Ebene aus: Der Code muss meistens neu angeordnet werden, anstatt weggeworfen oder vollständig umgeschrieben zu werden. Folglich laufen die meisten der vorhandenen Komponententests problemlos weiter.
Eine wichtige Voraussetzung für Unit-Tests ist, dass die Fristen nicht vom Management im Voraus festgelegt werden, sondern auf Arbeitsschätzungen der Entwickler basieren (die wiederum die Zeit für die Erstellung der richtigen Unit-Tests in ihre Schätzung einbeziehen sollten). Oder, wenn die Frist feststeht, sollte der Lieferumfang verhandelbar sein. Keine Menge an (Fehl-) Management kann die fundamentale Wahrheit ändern, dass eine bestimmte Anzahl von Entwicklern nur eine bestimmte Menge an qualitativ hochwertiger Arbeit in einer bestimmten Zeit liefern kann.
Besprechen Sie parallel dazu, wie Sie Anforderungen am besten klären, dokumentieren und in Abnahmetests auf hohem Niveau umsetzen können. Dies ist ein längerer Prozess der sukzessiven Verfeinerung, der Jahre in Anspruch nehmen kann, um einen besseren, stabilen Zustand in der gesamten Organisation zu erreichen. Eine Sache scheint aus Ihrer Beschreibung ziemlich sicher zu sein: Der Versuch, ständig wechselnde Anforderungen zu korrigieren, indem Sie große Spezifikationsdokumente im Voraus schreiben, wird einfach nicht funktionieren . Stattdessen wird empfohlen, agiler vorzugehen, mit häufigen Software-Releases und Demonstrationen für Benutzer und vielen Diskussionen darüber, was sie tatsächlich wollen. Der Benutzer hat das Recht, seine Meinung zu den Anforderungen jederzeit zu ändern - jede Änderung hat jedoch ihre Kosten (in Bezug auf Zeit und Geld). Die Entwickler können die Kosten für jede Änderungsanforderung schätzen, wodurch der Benutzer / Product Owner fundierte Entscheidungen treffen kann. "Diese Funktionsänderung wäre sicherlich nett ... aber wenn sie die Veröffentlichung dieser anderen wichtigen Funktion verzögert und so viel kostet, sollten wir sie vorerst in den Rückstand aufnehmen."
Benutzer dazu zu bringen, Akzeptanztestfälle zu definieren und Testdaten zu erstellen, ist eine großartige Möglichkeit, sie stärker einzubeziehen und das gegenseitige Vertrauen zwischen Benutzern und Entwicklern zu stärken. Dies zwingt beide Parteien, sich auf konkrete, messbare und überprüfbare Akzeptanzkriterien zu konzentrieren und Use Cases viel detaillierter als üblich zu durchdenken. Auf diese Weise können Benutzer den aktuellen Status der Entwicklung mit jedem Release aus erster Hand überprüfen, und Entwickler erhalten ein konkreteres und greifbareres Messfeedback zum Status des Projekts. Beachten Sie jedoch, dass dies ein größeres Engagement der Benutzer und neue Bedienungsweisen erfordert, die möglicherweise nur schwer akzeptiert und erlernt werden können.
quelle
Meine Erfahrung mit dem Übergang
Viele Jahre lang hatte ich das Missverständnis, dass ich nicht genug Zeit hatte, Komponententests für meinen Code zu schreiben. Wenn ich Tests schrieb, waren sie aufgebläht, schwere Dinge, die mich nur ermutigten zu glauben, dass ich Komponententests nur schreiben sollte, wenn ich wusste, dass sie gebraucht wurden.
Vor kurzem wurde ich ermutigt, Test Driven Development zu verwenden, und ich fand es eine vollständige Offenbarung. Ich bin jetzt fest davon überzeugt, dass ich nicht die Zeit habe, Unit-Tests nicht zu schreiben .
Wenn Sie mit Blick auf das Testen entwickeln, erhalten Sie meiner Erfahrung nach sauberere Schnittstellen, fokussiertere Klassen und Module und im Allgemeinen mehr SOLIDEN , testbaren Code.
Jedes Mal, wenn ich mit Legacy-Code arbeite, der keine Komponententests hat und manuell etwas testen muss, denke ich, "das wäre viel schneller, wenn dieser Code bereits Komponententests hätte". Jedes Mal, wenn ich versuchen muss, dem Code mit hoher Kopplung Unit-Test-Funktionen hinzuzufügen, denke ich, dass dies so viel einfacher wäre, wenn er entkoppelt geschrieben worden wäre.
Vergleich und Gegenüberstellung der beiden von mir unterstützten Versuchsstationen. Einer ist schon eine Weile da und hat eine Menge alten Code, während der andere relativ neu ist.
Wenn Sie dem alten Labor Funktionen hinzufügen, müssen Sie oft mehrere Stunden damit verbringen, sich mit den Auswirkungen der von Ihnen benötigten Funktionen und der Art und Weise, wie ich diese Funktionen hinzufügen kann, ohne die anderen Funktionen zu beeinträchtigen, auseinanderzusetzen. Der Code ist einfach nicht für Offline-Tests eingerichtet, daher muss so ziemlich alles online entwickelt werden. Wenn ich versuchen würde, offline zu entwickeln, würde ich am Ende mehr Scheinobjekte haben, als vernünftig wären.
Im neueren Labor kann ich normalerweise Funktionen hinzufügen, indem ich sie offline an meinem Schreibtisch entwickle, nur die Dinge verspotte, die sofort benötigt werden, und dann nur eine kurze Zeit im Labor verbringe, um alle verbleibenden Probleme auszubügeln, die nicht behoben wurden -Linie.
Mein Rat
Es scheint, als hätten Sie gut angefangen. Jedes Mal, wenn Sie große Änderungen an Ihrem Entwicklungsworkflow vornehmen, müssen Sie sicherstellen, dass alle an dieser Entscheidung beteiligt sind, und im Idealfall, dass sich die meisten Leute darauf eingelassen haben. Aus Ihrer Frage geht hervor, dass Sie das richtig verstanden haben. Wenn die Leute von der Idee nicht begeistert sind, ist sie zum Scheitern verurteilt oder erzeugt einen schlechten Willen.
Sofern Sie keinen überzeugenden Business Case vorlegen können, würde ich keine grundsätzliche Implementierung von Komponententests und Spezifikationen für Ihr gesamtes System empfehlen. Wie ich oben erwähnt, wenn ein System nicht entworfen mit dem Testen im Auge, kann es sehr schwierig sein, automatisierte Tests für sie zu schreiben.
Stattdessen würde ich empfehlen, klein anzufangen und die Pfadfinderregel anzuwenden :
Wenn Sie während der Implementierung eines Elements auf dieser Codebasis die spezifischen Tests identifizieren können, die zum Testen des vorhandenen Verhaltens und zum Übergang vom alten zum neuen Verhalten erforderlich sind, haben Sie die Änderung der Spezifikation dokumentiert und mit der Implementierung von Komponententests für begonnen dein System.
Module, die Sie nicht berühren, erhalten keine Komponententests. Wenn Sie sie jedoch nicht berühren, liegt dies wahrscheinlich daran, dass sie bereits gründlich getestet wurden und keine Änderungen erfordern, oder dass sie nie verwendet werden.
Was Sie vermeiden möchten, ist die Verschwendung einer ganzen Menge Entwicklerarbeit beim Schreiben von Tests, die niemals benötigt werden ( YAGNI funktioniert für Testcode genauso gut wie für Produktionscode * 8 ') zu denken, dass Tests schließlich nutzlos sind.
Zusammenfassung
Fangen Sie klein an, vertrauen Sie den Tests inkrementell und steigern Sie den geschäftlichen Nutzen durch die Entwicklung von Tests, wenn und wo sie Ihrem Team am meisten nützen.
quelle
Das erste, was zu tun ist, ist, sich nicht auf das Testen zu konzentrieren, sondern den gesamten Prozess richtig zu machen. Es macht keinen Sinn, etwas zu testen, wenn Sie nicht genau wissen, was es tun soll!
Also .. Spezifikationen zuerst und dokumentierte Spezifikationen, die sich nicht ändern (na ja, nicht sofort). Sie müssen darauf achten, diese zu erledigen. Ich würde eine Website empfehlen, auf der die Benutzer die Spezifikationen hochladen oder direkt eingeben können. Sie können dies auch mit einem Bug-Tracker und einer Anleitung zum Projektfortschritt verknüpfen.
Die Chancen stehen gut, das ist alles, was Sie wirklich brauchen. Sie können interne Unit-Tests hinzufügen, und das Management muss nie wissen, dass die Entwickler Unit-Tests durchführen. In gewisser Weise ist das so, wie es sein soll.
Sie müssen weiterhin Systemtests durchführen, dies kann jedoch auch mit der Projektmanagement-Website verknüpft werden. Sobald diese veröffentlicht ist, kann das Testteam (auch wenn dies ein anderer glücklicher Entwickler bei der Rotation ist) sie mit Tests aktualisieren, die es verwendet hat, um festzustellen, ob das Ganze hängt zusammen.
Ich glaube nicht, dass sich dies über Nacht ändern wird. Wenn Sie daran gewöhnt sind, Mundpropaganda-Spezifikationen zu erhalten, wird der Kampf dieses Verhalten fast gänzlich ändern - und Sie werden Widerstand dagegen bekommen. Ein Benutzer (oder BA oder PM oder wer auch immer), der es gewohnt ist, "nur x machen" zu sagen und jetzt alles aufschreiben muss, wird nicht gut reagieren. Es besteht die Möglichkeit, dass er vage Spezifikationsdokumente schreibt und diese dann klärt mit Mundpropaganda-Updates. Vergessen Sie also das Testen von Einheiten und beginnen Sie mit dem großen Problem, das Sie mit dem Entwicklungslebenszyklus haben.
quelle
Erste Ausgabe: Um "den Entwicklern eine Reihe von Testdaten und Komponententests zur Verfügung zu stellen", müssen Sie zuerst diese Komponententests schreiben, was eine Aufgabe der Entwickler ist. Unit-Tests ersetzen auch nicht die Spezifikation: Die Spezifikation soll eine Abstraktionsstufe haben, die höher ist als die Unit-Tests.
Zweites Problem: Sie möchten anscheinend die maximale Abdeckung durch Einheitentests. In diesem Fall kostet das Schreiben von Tests und Code in einem Kontext, in dem sich die Anforderungen ständig ändern, zu viel Zeit und Geld. Entscheiden Sie stattdessen, welche Teile des Codes kritisch sind, und testen Sie nur diese Teile. In vielen Fällen wirken sich die sich ändernden Anforderungen nicht auf die kritischen Teile des Produkts aus. Ein Kunde (oder CEO oder was auch immer) bittet normalerweise, dieses Bedienfeld nach rechts zu verschieben oder die Farbe dieses Titels von Rot in Grün zu ändern: Dinge, die niemand interessiert und die keiner intensiven Prüfung bedürfen. Auf der anderen Seite wird ein Kunde niemals darum bitten, den Hash-Algorithmus von SHA512 auf SHA256 zu ändern oder die Art und Weise, in der Sie Sitzungen speichern, zu ändern, während es die Teile sind, die am meisten getestet werden müssen.
quelle