Unit- und Integrationstests: Wie kann es zum Reflex werden?

27

Alle Programmierer in meinem Team sind mit Unit-Tests und Integrationstests vertraut. Wir haben alle damit gearbeitet. Wir haben alle Tests damit geschrieben. Einige von uns haben sogar ein besseres Gefühl des Vertrauens in ihren eigenen Code verspürt.

Aus irgendeinem Grund ist das Schreiben von Unit- / Integrationstests für keines der Teammitglieder zu einem Reflex geworden. Keiner von uns fühlt sich schlecht, wenn er nicht gleichzeitig mit dem eigentlichen Code Unit-Tests schreibt. Infolgedessen wird unsere Codebasis in den meisten Fällen durch Unit-Tests aufgedeckt, und Projekte werden ungetestet in die Produktion aufgenommen.

Das Problem dabei ist natürlich, dass, sobald Ihre Projekte in Produktion sind und bereits gut funktionieren, es praktisch unmöglich ist, Zeit und / oder Budget für das Hinzufügen von Unit- / Integrationstests zu erhalten.

Die Mitglieder meines Teams und ich sind bereits mit dem Wert von Unit-Tests vertraut ( 1 , 2 ), aber es scheint nicht hilfreich zu sein, Unit-Tests in unseren natürlichen Workflow einzubeziehen. Meiner Erfahrung nach führen Unit-Tests und / oder eine obligatorische Zielerreichung nur zu Tests mit schlechter Qualität und verlangsamen die Teammitglieder, nur weil es keine selbst generierte Motivation gibt, diese Tests durchzuführen. Sobald der Druck nachlässt, werden keine Unit-Tests mehr geschrieben.

Meine Frage lautet wie folgt: Gibt es Methoden, mit denen Sie experimentiert haben, um eine Dynamik im Team aufzubauen, die dazu führt, dass Personen diese Tests auf natürliche Weise erstellen und beibehalten möchten?

LordOfThePigs
quelle
7
Enttäuschend, wenn Plus- und Minusstimmen angeboten werden, ob das OP eine angemessene Geschlechterform verwendet. Sicherlich hängt die Qualität der Frage von der Frage und ihrer Relevanz für die Website ab und nicht von subjektiven Ansichten darüber, ob die Einbeziehung von beiden, er und sie, als sexistisch anzusehen ist oder nicht. Diese Art von freundschaftlichem Zank hilft dem Ruf der Seite wirklich nicht ... oder den Beteiligten. (Ich sage nur!)
Robins
@ S.Robins, du hast recht und ich würde nicht dafür stimmen, wenn ich nicht der Meinung wäre, dass dies keine gute Frage ist. Aber der Kommentar ist trotzdem beleidigend. Und wenn ich solche Dinge unter Programmierern oft sehe, kann ich sie einfach nicht für mich behalten.
SuperM
2
@superM LOL! Ich weiß, was du meinst. Überholte politische Korrektheit bringt meine Ziege. Ich neige dazu, entweder völlig geschlechtsneutral zu schreiben oder "er" ausschließlich deshalb zu verwenden, weil es ganz natürlich ist, solche Verweise auf Ihr eigenes Geschlecht zu beziehen. Mein Kommentar sollte jedoch allgemeiner angewendet werden und nicht spezifisch bestimmte Personen ansprechen. ;)
S.Robins
1
Ich habe einige der Kommentare gelöscht. + -1 Kommentare sind reine Störgeräusche und sollten vermieden werden, wenn sie dem Beitrag nichts Nützliches hinzufügen. Lesen Sie unsere Seite mit den Kommentaren, um eine Anleitung zu erhalten , und wenden Sie sich an den Software Engineering Chat . Anstößige Kommentare kennzeichnen Sie bitte als solche.
Yannis

Antworten:

13

Keiner von uns fühlt sich schlecht, wenn er nicht gleichzeitig mit dem eigentlichen Code Unit-Tests schreibt.

Dies ist der Punkt, den Sie ansprechen müssen. Die Kultur Ihres Teams muss sich dahingehend ändern, dass das Schreiben von Tests während des Sprints (oder in welcher Zeiteinheit auch immer) genauso zu einem Codegeruch wird wie das Festcodieren von Werten. Ein Großteil davon ist mit Gruppenzwang verbunden. Niemand möchte wirklich als minderwertig angesehen werden.

Machen Sie die Tests selbst. Beschimpfe dich sichtbar, wenn du sie nicht tust. Zeigen Sie auf, wo ein "guter" Programmierer diesen Fehler entdeckt hätte, wenn er Unit-Tests geschrieben hätte. Niemand will böse sein. Stellen Sie sicher, dass dieses unerwünschte Verhalten schlecht ist und die Leute folgen.

Telastyn
quelle
+1 für den Kulturwandel, und hätte ich noch +1, damit Sie mit gutem Beispiel vorangehen können? Gute Antwort.
Erik Dietrich
5

Es kann ziemlich schwierig sein, ein ganzes Team dazu zu bringen, dass alle dasselbe wollen . Oft reicht es nicht aus, den Wert von etwas zu sehen, um die Menschen zu ermutigen, ihr tief verwurzeltes Verhalten zu ändern. Sogar diejenigen, die den Wandel wertschätzen und ihn gezielt wollen, können manchmal auch dafür verantwortlich sein, ihn unbewusst zu bekämpfen.

Das Problem ist in Wirklichkeit die Motivation des Einzelnen und nicht die Motivation des Teams. Es kommt eine Zeit, in der ein Moment der Klarheit auf Sie zukommt, entweder als Ergebnis von etwas, von dem Sie glaubten, dass Sie es endlich verstanden haben, oder aufgrund eines neuen Werkzeugs oder einer anderen subjektiven Sache, die den durchschnittlichen Programmierer dazu bringt, alles hineinzuwerfen und den Prozess vollständig zu verändern. Ihre Aufgabe ist es, - falls Sie dies ablehnen möchten - zu prüfen, ob es für Sie oder das Team eine Möglichkeit gibt, herauszufinden, welche Dinge für jedes einzelne Teammitglied die Auslöser für Klarheit sind.

Für mich persönlich war es einfach, das StoryQ- Framework für BDD in DotNet zu entdecken, was es zu einfach machte, es zu ignorieren, und mich völlig über die "Barriere" von Test zuerst gegen Test gleichzeitig brachte. Später wurden meine Entscheidungen bestätigt, als ich NCrunch für Visual Studio fand. Die halbe Miete besteht manchmal nicht darin, die Idee zu verkaufen, sondern lediglich den Aufwand für radikale Gewohnheitsänderungen zu verringern ... und selbst dann kann es ein wenig Zeit und Arbeit kosten. Dieselben persönlichen Auslöser waren jedoch nicht genug, um die Herangehensweise meiner damaligen Kollegen zu beeinflussen, die immer noch so viel von ihrem Testcode gleichzeitig oder sogar nach ihrem Implementierungscode schreiben.

Manchmal ist es auch widerstrebend, die Art und Weise zu ändern, wie Dinge getan werden, weil man Angst, Misstrauen oder eine abscheuliche Sicht auf die Anstrengungen hat, die erforderlich sind, um zu lernen, etwas anderes zu tun, selbst wenn die Gründe für die Änderung stichhaltig sind. Wenn Ihre gesamte Testplattform für eine bestimmte Funktionsweise eingerichtet ist, kann es schwierig sein, Änderungen an der Arbeitsweise und möglicherweise an den Tools zu rechtfertigen , insbesondere wenn alte und neue Tests während der gesamten Lebensdauer von weiterhin nebeneinander bestehen müssen Projekt - und Sie würden sicherlich nicht jeden Test, den Sie jemals erstellt haben, neu schreiben müssen. Das Seltsame ist, dass die Leute manchmal das Gefühl haben, dass dies der einzige Weg ist, eine neue Testmethode anzuwenden, und dass es für diese Leute an sich schwieriger ist, vernünftige Veränderungen zum Besseren hinzunehmen.

Wirklich, der einzige Weg, wie etwas reflexiv wird, besteht darin, sich zu zwingen, es immer wieder zu tun, bis Sie nicht mehr bemerken, dass Sie sich zu sehr darauf konzentrieren müssen, wie es gemacht wird. Manchmal ist die einzige Möglichkeit, dies in einem Team zu tun, das Festlegen von Richtlinien, die möglicherweise etwas drakonisch sind, und das Üben von Pair-Programming und Code-Reviews sowie alles andere, was Teammitgliedern dabei helfen kann, sich gegenseitig zu unterstützen und die Änderung buchstäblich zu erzwingen im Verhalten auftreten. Damit eine solche Strategie jedoch wirklich erfolgreich ist, bedarf es einer festen und ehrlichen Verpflichtung jedes einzelnen Teammitglieds, die erforderlichen Maßnahmen zu akzeptieren und am Prozess teilzunehmen ... und viel Geduld von allen Beteiligten .

S.Robins
quelle
3

Keiner von uns fühlt sich wirklich schlecht, wenn er nicht gleichzeitig mit dem eigentlichen Code Unit-Tests schreibt

Sie sind sich nicht sicher, was Sie mit "zur gleichen Zeit" meinen, aber wie wäre es, sie vor dem eigentlichen Code zu schreiben ?

Aus psychologischer Sicht ist es leicht zu verstehen, warum sich ein Mensch nicht die Mühe machen möchte, nach dem Code Einheitentests zu schreiben. Zu diesem Zeitpunkt funktioniert der Code bereits. Warum in aller Welt sollten wir ihn testen müssen? Eine Art von Faulheit findet automatisch statt, weil es mühsam, scheinbar nutzlos ist und es nicht gefährlich erscheint, Tests zu schreiben. Daher kenne ich nicht viele Teams, die über einen langen Zeitraum einen Test-After-Ansatz beibehalten haben.

Meiner Erfahrung nach ist Test-first (TDD-Stil) jedoch schnell süchtig, da es mindestens zwei unmittelbare, greifbare Vorteile für die Freisetzung von Endorphin gibt:

  • Es hilft Ihnen dabei, Ihren Code von Angesicht zu Angesicht mit konkreten ausführbaren Anforderungen zu entwerfen und das Design beim Refactor immer besser zu machen. Dies ist viel zielgerichteter und befriedigender als nur die Überprüfung von bereits funktionierenden Elementen.

  • Der TDD-Zyklus wird von häufigen "grünen Balken" unterbrochen, in denen Sie den Geschmack des sofortigen Erfolgs genießen können. Dadurch bleibt Ihr Geist stets zufrieden und Sie können mit der nächsten zu implementierenden Funktion fortfahren.

Ich würde also nicht versuchen, dass sich Ihr Team schlecht fühlt, wenn sie die Tests nicht schreiben. Stattdessen würde ich versuchen, dass sie sich so gut fühlen wie sie. TDD ist eine Möglichkeit, dies zu tun.

guillaume31
quelle
3
Ein weiterer Vorteil von TDD (insbesondere mit einem kontinuierlichen Test-Tool) ist die schnelle Rückmeldung. In einer großen Codebasis, in der das Erstellen und Ausführen der Software in der Größenordnung von Minuten liegen kann, beschleunigt TDD / CT Feedback und damit die Entwicklung drastisch.
Erik Dietrich
0

Zunächst müssen Sie sicherstellen, dass das Schreiben und Ausführen eines Tests einfach ist, dass das Framework in den aktuellen Projekten eingerichtet wird und dass dieses Einrichtungsverfahren einfach in zukünftige Projekte einbezogen werden kann

Auf diese Weise muss ein Programmierer, der eine neue Funktion, die er zu debuggen versucht, entfernen möchte, nicht durch ein Dutzend Reifen springen, damit die Tests ordnungsgemäß ausgeführt werden

Je offensichtlicher etwas zu tun ist, desto unwahrscheinlicher ist es, dass Sie sich daran gewöhnen

Ratschenfreak
quelle
0

Eine Sache, die ich getan habe und die einen Kulturwandel einigermaßen erfolgreich initiiert hat, ist die Einrichtung eines wöchentlichen "Unit Test Curation" -Seminars. Der offizielle Zweck ist es, die Einheitentestsuite schnell und auf dem neuesten Stand zu halten, aber der wichtigere Zweck besteht meiner Meinung nach darin, den Leuten die Möglichkeit zu geben, unter geringem Druck vorbeizuschauen, Fragen zu stellen und Tests zu üben . Die Tatsache, dass Sie bereit sind, eine Stunde oder was auch immer pro Woche ausschließlich für die Tests zu verwenden, sendet auch die Nachricht, dass dies wichtig ist.

Ich denke, dass man auf diese Weise ein bisschen Kulturwandel bekommt und die Barriere dafür "reflexartig" zu beseitigen beginnt, wie man es ausdrückt. Die Menschen werden beim ersten Anzeichen von Widrigkeiten dazu neigen, zu alten Gewohnheiten zurückzukehren - ein Treffen wie dieses wird das nicht auf einen Schlag beheben, aber ich denke, es wird einen Kulturwandel auslösen und die Barriere beseitigen, die nicht wirklich daraus resultiert zu wissen, was du tust.

Erik Dietrich
quelle
0

Eine Gruppe von Programmierern zu haben, in der alle natürlich etwas tun wollen, ist eine Utopie (insbesondere, wenn von einer großen Gruppe gesprochen wird).

Unit- und Integrationstests gehören zum Standard . Sie erstellen einen Standard für einen Workflow und jedes Mitglied des Teams sollte diesen respektieren. Die Standards sollten mit Hilfe von QS-Fachleuten erstellt werden, weil sie es besser wissen. Ein Programmierer sollte die Standards respektieren. Was Sie tun können, ist, die Standards sauber, einfach zu verstehen und zu befolgen.

Es geht nicht darum, dem eigenen Code zu vertrauen und ihn zu verwenden. Es geht darum, Codierungs- und Teststandards zu haben, die jeder verwenden muss, um gute Dinge zu machen, und jeder Programmierer sollte dies verstehen.

Wenn Sie Leute von Anfang an dazu bringen, dem Standard zu folgen, wird dies zu einem Reflex und wird befolgt. Die Regel, dass kein Code ohne einen Komponententest in die Codebasis eingefügt werden kann, würde die Leute davon überzeugen, dass sie es tun müssen. Für Projekt-Repositories gibt es noch restriktivere Regeln. Beispielsweise führen Unternehmen Unit-Tests durch, bevor sie die Unit tatsächlich codieren (wenn sie die Modulspezifikation erstellen), und dies ist eine sehr gute Methode. Wenn ein Programmierer Code in das Projekt / die Codebasis einfügt, wird der Code durch das Testmodul ausgeführt, und wenn die Komponententests nicht bestanden werden, kehren sie zur Arbeit zurück.

Wenn es im Moment schwierig ist, Standards und Regeln hinzuzufügen, sollten Sie zumindest daran denken, diese in zukünftigen Projekten hinzuzufügen.

Coral Doe
quelle