Kollege nicht bereit, Unit-Tests zu verwenden, "da es mehr um Code geht"


25

Ein Kollege ist nicht gewillt, Komponententests zu verwenden, sondern entscheidet sich für einen Schnelltest. Geben Sie ihn an die Benutzer weiter, und wenn alles in Ordnung ist, wird er live veröffentlicht. Unnötig zu erwähnen, dass einige Bugs durchkommen.

Ich erwähnte, wir sollten über Unit-Tests nachdenken - aber sie war alles dagegen, sobald klar wurde, dass mehr Code geschrieben werden müsste. Das versetzt mich in die Lage, etwas zu verändern und nicht sicher zu sein, ob die Ausgabe dieselbe ist, besonders da ihr Code Spaghetti ist und ich versuche, sie zu überarbeiten, wenn ich die Gelegenheit dazu bekomme.

Was ist der beste Weg für mich?


3
Die Abneigung gegen das Schreiben von Komponententests hat möglicherweise weniger mit Ihrem Kollegen zu tun als mit dem systembedingten Overhead der üblichen Implementierungen von Komponententests.
Mario

2
@ James: Bitte beachten Sie meine Antwort auf @ m.edmondson.
Doppelgreener

Gut!! Weniger Konkurrenz für dich !!

@ Jonathan - fair genug, ich stehe korrigiert
ozz

@ m.Edmondson - neuer Job .... es war ein bisschen frecher Teil meines Kommentars, aber es klingt wie ein beschissener Arbeitsplatz, alte Technik, Entwickler, die nicht gewillt sind, eine vernünftige Entwicklerpraxis anzuwenden.
ozz

Antworten:


23

Sie ist sich der Vorteile von Unit-Tests nicht bewusst und das müssen Sie ändern:

  • Ihr Bewusstsein.

Du musst ihr beweisen, dass es ihre Arbeit verbessern wird, nicht nur deine. Das wird schwierig, sie wird wahrscheinlich versuchen, sich auf jeden negativen Aspekt zu konzentrieren, den sie finden könnte, wenn sie Angst vor Veränderungen hat.

Sie können versuchen, mit ihr über alle Vorteile zu diskutieren und auf alle ihre Gegenargumente zu hören. Warten Sie, bis sie fertig ist, bevor Sie anfangen, sich selbst zu unterhalten.

Um sich vorzubereiten, sollten Sie in P.SE oder Google nach allen Dingen suchen, die das Management oder die Entwickler mit Unit-Tests zu tun haben, und die Antworten zusammenstellen, die Sie in Ihren Gesprächen mit Ihrem Kollegen verwenden werden.

Nur ihr zuzuhören und zu beweisen, dass es ihre Arbeit verbessern wird, wird dir sehr helfen. Sie beweisen, dass Sie von ihrer Meinung betroffen sind, und Sie stellen ihr alle Daten zur Verfügung, die sie benötigt, um die Situation zu analysieren und schließlich ihre Meinung zu ändern.


20
Lieben Sie die Liste von einem Einzelteil. +1
Armand

1
Diese Antwort wäre perfekt gewesen, wenn Sie gleich nach der Liste stehen geblieben wären. +1 :)
Tim Post

Hey Tim, Glückwunsch zu deinem zweiten Platz bei den SO-Wahlen!

6
Ich hatte das Gefühl, diese Liste hätte ein eigenes Tortendiagramm verdient.
Tomas

Möglicherweise müssen Sie auch ihre Bereitschaft ändern, Bugs zu versenden. Einige Fehlervermeidungsmaßnahmen könnten bessere Tests wichtiger machen.
Stonemetal

15

Schreibe einen Unit Test (sag es ihr nicht)

Warten Sie, bis die Sache kaputt geht. Lassen Sie sie zwei Tage lang manuelle Tests durchführen. Ziehen Sie dann Ihre Komponententests heraus und finden Sie den Fehler in drei Sekunden.

In Deckung gehen...


1
+1 Um anzuzeigen, dass Fehler unvermeidlich sind und in Deckung zu gehen.
Neil

+1 Das Schreiben einer vollständigen Reihe von Komponententests für einen bestimmten Teil des Codes kann genug Probleme mit dem Code aufdecken, die die Vorteile dennoch demonstrieren. Ich erinnere mich an eine Präsentation darüber, wie Unit-Tests verwendet werden können, um Schnittstellen- / API-Spezifikationen / -Verhaltensweisen durch ein vollständiges
Umschreiben des

3
@JBRWilkinson: Merb (ehemaliges Ruby-Webanwendungs-Framework) hat genau das getan. Allerdings nicht mit Unit-Tests, sondern mit Funktionstests. Die Architektur war "organisch" gewachsen, und obwohl das Framework gut zu benutzen war , war es nicht gut zu pflegen und zu erweitern . Und da Wartbarkeit und Erweiterbarkeit tatsächlich zwei der Hauptverkaufsargumente gegenüber dem Wettbewerber Ruby on Rails waren, mussten sie offensichtlich etwas dagegen unternehmen. Und was sie taten , war buchstäblich auf rm -rfden Quell- und Unit - Test - Verzeichnisse, nur die Funktionstests zu halten und einfach erhalten vorbei , sie wieder eins nach dem anderen.
Jörg W Mittag

11

Die Automatisierung sonstiger manueller Aufgaben sollte jeden Programmierer ansprechen.

Sie schreibt also nicht mehr Code, sondern macht weniger manuell.


1
Kommt
drauf an,

11

(Einer der) Punkte bei automatisierten Tests ist die Wiederholbarkeit . Wenn Sie einen Schnelltest von Hand durchführen, können Sie diesen schneller durchführen als beim Schreiben eines Komponententests (zumindest für Anfänger mit Komponententests - jeder, der Erfahrung mit Komponententests hat, kann Tests ziemlich schnell durchführen).

Aber was ist, wenn morgen oder nächste Woche eine kleine (oder große ...) Änderung am Code vorgenommen wird? Würde Ihr Kollege gerne nach jeder Änderung dieselben manuellen Tests wiederholen, um sicherzustellen, dass nichts kaputt geht? Oder würde sie lieber "codieren und beten"?

Je mehr der Code geändert wird, desto mehr zahlen sich die Unit-Tests für Ihre ursprüngliche Investition aus . Es dauert nicht lange, um auf die positive Seite zu kommen, auch wenn die Tests tatsächlich Fehler aufdecken. Aber sie tun das auch regelmäßig - an diesem Punkt werden sie von unschätzbarem Wert. Und sobald jemand das Gefühl der Sicherheit und das Vertrauen in den eigenen Code verspürt, das ein erfolgreicher Unit-Testlauf vermittelt, gibt es normalerweise kein Zurück mehr.

Wenn sie überzeugt ist, aber Angst hat, sich in das neue Gebiet zu wagen, bieten Sie ihr eine Programmiersitzung an, um gemeinsam ihre ersten Unit-Tests zu schreiben . Wählen Sie eine Klasse aus, die nicht zu schwierig zu testen ist, aber so komplex, dass es sich lohnt, sie zu testen.

Wenn sie jedoch nicht überzeugt ist, müssen Sie möglicherweise weitere Fakten sammeln . Solche Tatsachen können sein

  • Fehlerquoten in von Ihnen geschriebenem Code im Vergleich zu ihrem
  • Schreiben einer Reihe von Komponententests gegen ihren Code und Dokumentieren der gefundenen Fehler.

Sammle solche Daten und zeige ihr dann höflich die Ergebnisse. Wenn dies immer noch nicht ausreicht, um sie zu überzeugen, müssen Sie möglicherweise das Problem diskutieren und Ihre gesammelten Beweise an die Geschäftsleitung weitergeben. Das sollte nur Ihr letzter Ausweg sein, aber manchmal gibt es keinen anderen Weg.


Sehr unwahrscheinlich - obwohl es nicht unbekannt ist,
Testpläne

@ m.edmondson, ja, das war nur eine rhetorische Frage :-)
Péter Török

+1 für die Wiederholbarkeit. Ich bin ein aggressiver Refactor (ähm) und ich liebe die Tatsache, dass ich sehr schnell Regressionen finden kann, wenn ich einen Codeabschnitt vollständig umschreibe.
Michael K

3

Schreiben Sie eine grundlegende Testabdeckung für die schlechtesten Teile ihres Codes, faktorisieren Sie sie anhand dieser Tests, und sprechen Sie dann mit dem Management darüber, dass Unit-Tests in fortlaufenden Builds die Produktivität verbessern. Änderungen werden einfacher, wenn sie von einem Arbeitgeber angeordnet werden, als wenn sie von einem einzelnen Entwickler durchgeführt werden.

Ich weiß nicht, wie ich das richtig ausdrücken soll, aber: Wenn du ihren Code überarbeitest, "wenn du eine Chance hast" ... nun, sie denkt wahrscheinlich, du bist ein bisschen douche, weil du dich in "ihr Geschäft" verwickelt hast. , so ist es weniger wahrscheinlich, dass Sie offen zuhören. Nach meiner Erfahrung bleiben die Menschen an dem hängen, was sie getan haben - auch wenn es nicht besonders gut ist.


Wir sind auf .NET 1 (ein Witz, den ich kenne) - können hier Komponententests implementiert werden?
billy.bob

1
@ m.edmondson: Sowas wie NUnit vielleicht? ( nunit.org )
Dr. Hannibal Lecter

@ Dr. Hannibal Lecter - Ja, ich glaube, wir haben irgendwo eine Kopie davon. Ich werde sehen, ob ich sie finden kann
billy.bob

4
Unit-Tests müssen keine bestimmte Suite verwenden, um effektiv zu sein. Ich habe sie nur in Python geschrieben, um Aufrufe an ein C ++ - Programm zu senden und die empfangenen Werte zu überprüfen. Ein Framework hilft zwar, ist aber keine Notwendigkeit.
TZHX

3

Devils Advocate spielen: Sie hat einen Punkt. Ich sage es normalerweise so:

Automatische Tests lösen die Probleme von zu viel Code mit noch mehr Code.

Begründung:

  • Studie über die Korrelation der Fehlerrate und OO - Metriken , Schlagzeile Ergebnis: „Nach Größe Kontrolle [der Klasse] keine der Metriken mit Fehleranfälligkeit wurden wir untersuchen assoziiert mehr“ . (In der Studie wird die Klassengröße erörtert. Wird dieser Effekt auf die Größe der Codebasis ausgeweitet? Wahrscheinlich. Meiner Meinung nach. )
  • Erfahrungsgemäß schreiten große Projekte eher langsam voran. "5K-Zeilen über Nacht in einem neuen Projekt" im Vergleich zu "10 Zeilen / Tag in einem großen Projekt". Zeigt das einen "Widerstand" gegen Änderungen an, der mit der Größe der Codebasis zunimmt?
  • Wir proklamieren immer: "Es gibt keine beste Sprache, es kommt auf das Problem an." Eine wichtige Voraussetzung ist die einfache Modellierung problematischer Entitäten und Operationen in der Sprache Ihrer Wahl. Bedeutet das nicht, dass die Wahl einer Sprache, in der Ihr Problem ausführlicher ausgedrückt wird, schlechter ist , und korreliert dies nicht wieder mit der endgültigen Größe der Codebasis?

Nun gibt es ein paar Argumente, die sich dagegen aussprechen lassen. Lassen Sie mich die ansprechen, die mir einfallen:

  • Größe vs. Einfachheit: Natürlich ist es möglich, Code kürzer und schlechter zu machen. Dies ist jedoch nur ein Problem, wenn Codebasen mit unterschiedlichen Verhältnissen von Kürze zu Einfachheit verglichen werden. In der Diskussion kann davon ausgegangen werden, dass wir diesen Faktor irgendwie steuern können.

  • Unit-Tests setzen Sie unter Druck, Abhängigkeiten zu reduzieren, und ich stimme empirisch zu, dass das Reduzieren von Abhängigkeiten Probleme mit der Codegröße mindern kann (in dem Sinne, dass bei zwei Codebasen ähnlicher Größe die mit mehr Interdependenzen schlechter ist). Jedoch , während Abhängigkeiten betwwen Produktionscodeeinheiten zu reduzieren, stellt es Kopplung zwischen der Test- und der Einheit selbst.


TL; DR: Ich behaupte nicht, dass Unit-Tests schlecht sind. Ich frage: Gibt es einen Break-Even-Punkt, an dem Tests schaden, der mit der Menge an Code korreliert?


2

Ich denke, Sie sind in einer schwierigen Position. Ich war in einem Team, in dem Leute keine Komponententests oder, schlimmer noch, schreckliche, nicht wartbare Komponententests geschrieben haben. Aber jeder wusste, dass Unit-Tests gut sind.

Die Einheitentestsuite des Teams auf eine gute Qualität zu bringen, war daher ein langer und schwieriger Weg. Immer auf der Suche nach Verbesserungsmöglichkeiten, nach Ideen, nach Erfahrungsaustausch.

Sie haben andererseits einen Entwickler, der den Nutzen nicht einmal erkannt hat. Und dann auch noch Spaghetti Code. Ich denke, einer der wichtigsten Gründe in diesem speziellen Fall ist die Tatsache, dass das Schreiben guter Komponententests ein locker gekoppeltes Design erzwingt. Sie dazu zu bringen, den Test zu schreiben, könnte hoffentlich auf lange Sicht auch den "echten" Code verbessern.

Aber ich denke, dass es am Ende eine Teamentscheidung ist (ich weiß nicht, wie viele Sie im Team sind?). Wenn das Team einen Konsens darüber erzielen kann, dass es eine gut abdeckende Einheitentestsuite geben sollte, muss sich jeder anpassen, Erfahrungen austauschen und Ihr Team zusammenwachsen lassen.

Wenn das Team jedoch keinen Konsens darüber erzielen kann, dass Sie Komponententests schreiben sollten, empfehle ich Ihnen, ein anderes Entwicklerteam zu finden, mit dem Sie zusammenarbeiten können.


2

Ist sie die Chefin?

Wenn ja ... stecken Sie irgendwie fest, es sei denn, Sie können sie von den Vorteilen überzeugen, die im Grunde genommen im Sinne von "eine Unze Vorbeugung ist ein Pfund Heilung wert" sind. Bugs dringen durch. TDD hilft dabei, dies zu mildern, indem eine konsistente Ausgabe erstellt wird.

Ist sie nicht die Chefin?

Was sind die Kodierungsstandards, in denen Sie arbeiten? Warum darf sie Spaghetti-Code ausspucken? Präsentieren Sie dem Chef einen Business Case mit den Worten "Wir werden viel weniger Zeit für Bugs aufwenden, wenn wir etwas mehr Zeit für TDD aufwenden". Überzeugen Sie jemanden, der Veränderungen mit einem Business Case erzwingen kann.

Dokumentieren Sie Fälle, in denen TDD Zeit und Geld hätte sparen können.

Dieser Bug stellte sich vor. Es wäre gefangen worden, bevor es live ging. 2 Stunden Vorbeugung hätten uns 10 Stunden Heilung erspart. Es ist hier und hier und hier passiert. Diese 10 Arbeitsstunden, die dem Unternehmen 30 Mannstunden erspart hätten. Das ist so viel Geld.


1
Wenn Sie versuchen, Unit-Tests von oben durchzusetzen, müssen Sie Ihren Ehepartner zwingen, mehr Gemüse zu essen. Sie werden sich bestenfalls widerstrebend anpassen und auf alte Gewohnheiten zurückgreifen, wenn Sie aufhören zu schauen. Behandeln Sie Entwickler besser als verantwortungsbewusste Erwachsene und überzeugen Sie sie, dass Komponententests nützlich sind.
Nikie

1

Das versetzt mich in die Lage, etwas zu verändern

Warum?

Sie haben das Problem geschaffen. Sie sollten es lösen.

Welcher Manager lässt dies zu? Warum ist der Buggy-Code einer anderen Person jetzt Ihr Problem?

Sie haben einen Kollegen und einen Manager, die beide dafür sorgen, dass dies geschieht. Und indem Sie das Chaos beseitigen, sind Sie ein williger und aktiver Teilnehmer.

Nichts wird sich ändern, wenn sie den Schmerz schlechter Qualität nicht spüren.


> Sie haben das Problem geschaffen => Sie sollten es lösen. Manchmal können die Personen, die der Leinwand am nächsten sind, nicht das gesamte Bild sehen. Einen Komponententest zu schreiben, würde ein wenig Arbeit bedeuten, aber nicht unbedingt die Arbeit anderer aufräumen. Eine Gelegenheit, mit gutem Beispiel voranzugehen.
JBRWilkinson

1
@JBRWilkinson: Obwohl es wahr ist - und was ich oft tue -, bewirkt es keinen kulturellen Wandel. Wenn sich jemand weigert, Tests zu machen, gibt es eine Kultur, die diese Ablehnung (a) ermöglicht und (b) als gutes Benehmen verstärkt. Wenn Sie die Last stillschweigend auf sich nehmen, um das Chaos eines anderen zu beheben, werden die zugrunde liegenden Ursachen nicht behoben.
S.Lott

Ich stimme zwar zu, dass es für Teammitglieder nicht nachhaltig wäre, nur beschissenen Code zu schreiben und sich darauf zu verlassen, dass andere sich mit ihrem Durcheinander befassen, aber ich denke, es ist schädlich, eine "wenn man es kaputt macht, besitzt man es" -Mentalität anzunehmen. Sie möchten nicht, dass die Leute Angst haben, den Code zu ändern und zu verbessern. Konzentrieren Sie sich stattdessen auf die Verbreitung bewährter Verfahren und erstellen Sie eine solide Testsuite. Dann können Sie auf eine Einstellung hinarbeiten, die mehr "gemeinsame Eigentümerschaft" bedeutet. Es ist jedermanns Code. Jeder repariert es, jeder verbessert es und übernimmt Verantwortung.
Sara

1

Sie ist ganz richtig, Unit-Tests sind "mehr Code".

Es muss jedoch einfach mehr Code geschrieben werden, um sicherzustellen, dass das Programm so funktioniert, wie es sollte (immer und immer wieder). Es ist keine Zeitverschwendung. Es ist ebenso Teil des Systems wie seine Kernkomponenten.

Fordere sie heraus auf:

  1. Was passiert, wenn jemand, der mit dem Code nicht vertraut ist, etwas ändert?
  2. Was passiert, wenn jemand, der unerfahren ist, etwas ändert?
  3. Die Kosten für die Wartung eines Systems werden nicht in der Zeit gemessen, die für die Erstellung erforderlich ist. Es ist ein längerfristiger Vorschlag. Denken Sie an die Gesamtbetriebskosten.
  4. Ihre Schätzung (falls dies vor Beginn der Codierung erforderlich war) sollte die Anforderung enthalten, Komponententests zu schreiben. Geschäftsleute erstellen keine Anforderungen, für die Unit-Tests direkt erforderlich sind, sie stellen jedoch implizite Qualitätsanforderungen und fordern, dass zukünftige Änderungen nicht mit Fehlern behaftet sind oder dass derselbe Programmierer die Quelle ändert.

Ich bin mir nicht sicher, ob ich "es ist mehr Code" einfach so kaufe. Es könnte sein. Es ist wahrscheinlich oft. Muss aber nicht sein. Eine gute Testsuite hilft Ihnen beiden, zunächst weniger Code zu schreiben (Sie wissen, wann Sie fertig sind und können sofort aufhören) und hilft Ihnen dabei, den Code öfter umzugestalten und zu verkleinern. Dies führt zu vielen Tests und nicht zu viel Produktionscode, im Gegensatz zu keinen Tests und einem großen chaotischen Klumpen Produktionscode, der niemals bereinigt wird.
Sara

1

Ich spreche als einer, der derzeit Produktionscode ausführt, gefolgt von Komponententests anstelle von TDD, was an meinem derzeitigen Standort nicht gut zu sein scheint die alte Tasche, keine Silberkugel) ...

Es kann schwer zu verkaufen sein. Ich war immer noch nicht in der Lage, meine Mitarbeiter für Unit-Tests zu verkaufen. Ich weiß, dass ich in meinem Unit-Test-Code viel mehr Fehler mache als in meinem Produktionscode. Es ist also ein bisschen frustrierend, so viel Zeit damit verbringen zu müssen, Unit-Test-Codes zu reparieren ... Es ist jedoch eine gute Versicherung, wenn Code geändert wird. Gute Möglichkeit, Randbedingungen automatisch zu testen.


1

Zeigen Sie ihr, wie viel Unit-Tests helfen, indem Sie Unit-Tests selbst erstellen.

Wie der heilige Franziskus einmal sagte: "Predige immer. Wenn nötig, benutze Worte."

Wenn sie feststellt, dass in Ihrem Code Komponententests verwendet werden und Sie in der Lage sind, Fehler mit Komponententests schneller zu beheben, ändert dies möglicherweise ihre Meinung. Möglicherweise aber nicht.

Egal wie das Ergebnis ausfällt, sie sieht dich nicht als Druckmittel gegen sie, zu dem du nicht bereit bist. Das musst du ändern, die Wahrnehmung, dass du nicht mit gutem Beispiel vorangehst.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.