Unit-Test Neuling-Team muss Unit-Test


37

Ich arbeite mit einem neuen Team, das in der Vergangenheit KEINE Unit-Tests durchgeführt hat. Mein Ziel ist es, dass das Team schließlich TDD (Test Driven Development) als natürlichen Prozess einsetzt. Da TDD für ein Team, das keine Unit-Tests durchführt, eine so radikale Veränderung darstellt, dachte ich, ich würde erst einmal Unit-Tests schreiben, nachdem ich codiert habe.

War jemand in einer ähnlichen Situation? Wie kann ein Team effektiv dazu gebracht werden, sich mit TDD vertraut zu machen, wenn es noch keine Einheitentests durchgeführt hat? Ist es sinnvoll, dies in wenigen Schritten zu tun? Oder sollten wir gleich eintauchen und all den wachsenden Schmerzen auf einmal ins Auge sehen?

BEARBEITEN

Nur zur Verdeutlichung, es gibt niemanden im Team (außer mir), der über JEDE Exposition / Erfahrung mit Unit-Tests verfügt. Wir planen, die in Visual Studio integrierten Unit-Testfunktionen zu verwenden.


+1 Diese Frage beschreibt fast genau die Situation, in der ich mich befinde, nur für Eclipse PHP Dev anstelle von VS.
canadiancreed

Keine passende Frage für dieses Forum
Ryan

2
Was hast du am Ende gemacht? Würde wirklich gerne hören, wie sich dies herausstellte.
Snoop

Antworten:


36

Üben Sie an vorhandenen Bugs / Defekten.

Dies ist eine sehr schwierige Situation. Ich bin noch nie von Null auf TDD gekommen, aber meiner Erfahrung nach war es ein sehr "Schritt für Schritt" -Ansatz, ein Team dazu zu bringen, keine Komponententests zu absolvieren, um sie proaktiv zu schreiben.

Machen Sie es sich zunächst mit dem Schreiben von Einheitentests bequem und wissen Sie genau, was sie sind und welche Vorteile sie haben. Für meine Teams ist es am besten, Komponententests für vorhandene Fehler zu schreiben. Gegenwärtige Fehler in Systemen haben zwei Dinge, die Sie benötigen, um Menschen das Schreiben von Komponententests beizubringen:

  1. eine erwartete Vor- und Nachbedingung
  2. Ein Ergebnis, das derzeit nicht den Erwartungen entspricht und diese Vorbedingung / Nachbedingung verletzt

Dies gibt den Mitgliedern sehr konkrete Praxisbeispiele. Sie können einen Test schreiben, bevor sie den Fehler beheben, sodass er fehlschlägt. Anschließend können sie den Code so korrigieren, dass er weitergegeben wird, und den Fehler beheben. Sobald sie damit vertraut sind, können Sie ihnen den Rest des Weges ermöglichen, sodass sie Komponententests ohne Code im Voraus schreiben und dann neuen Code schreiben können, damit ihre Tests bestanden werden.

Ich denke, der Trick ist, ihnen etwas zum Üben zu geben, wo es klare Methoden vor / nach Bedingungen gibt. Wenn die Anforderungen an Methoden verschwommen sind, ist es selbst für erfahrene TDD-Mitarbeiter schwierig, genau zu wissen, wo sie anfangen sollen. Machen Sie einen Schritt nach dem anderen und Sie werden dorthin gelangen. Viel Glück!


Wäre das Schreiben eines Komponententests für einen vorhandenen Fehler nicht ein mieser Komponententest, dh es würde eine ganze Reihe von Dingen und nicht nur eine einzelne Einheit testen? Wäre ein Integrationstest für dieses Szenario nicht besser geeignet?
Isaac Kleinman

Schreibtest auf Fehler, es ist ein guter Rat.
Amitābha

32

Ich habe es geschafft, mein gesamtes Unternehmen davon zu überzeugen, zu TDD zu wechseln. Es war nicht einfach, aber die Mühe hat sich gelohnt: Die Qualität des Codes hat sich nach dem Übergang verbessert, und jetzt kann sich niemand mehr vorstellen, zu den schrecklichen Codierungszeiten der Cowboys zurückzukehren.

  1. Erklären, erklären, erklären. Sie möchten nicht, dass Ihr Team Tests schreibt. Sie möchten Ihr Team wollen , um Schreibtests. Dies bedeutet, dass sie genau verstehen sollten, warum sie dies tun sollten, welche Vorteile dies hat und wie dies ihre Arbeit erheblich erleichtert. Rot, Grün, Refaktor , Schreiben eines Regressionstests als Beweis dafür, dass ein Fehler behoben wurde usw. Sie müssen sie davon überzeugen, dass das Ganze Sinn macht, bevor Sie sie auffordern, Code zu schreiben.

  2. Gehen Sie für die reale Sache (zuerst Tests, dann Code). Das Schreiben von Tests nach dem Code macht kaum Sinn, da Sie nie wissen werden, ob sie tatsächlich funktionieren (und Leute schreiben fehlerhafte Testfälle). Meine Intuition ist , dass die Menge an Aufwand Sie gehen müssen keine Tests zu ersten Tests ist viel weniger als das, was Sie gehen müssen , bilden keine Tests durch ersten Code zu ersten Tests , so dass Sie auch den mittleren Schritt überspringen.

  3. Beginnen Sie mit Regressionstests. Diese sind ziemlich einfach zu verstehen und bieten sofortige Befriedigung. Dies setzt natürlich voraus, dass der Code ordnungsgemäß modularisiert und leicht testbar ist. Wenn nicht, überspringen Sie diesen Schritt.

  4. Mach kleine Schritte. TDD braucht einige Zeit, um sich daran zu gewöhnen, und kann zunächst frustrierend sein. Versuchen Sie, Tests in einem brandneuen Projekt oder einer brandneuen Komponente einzuführen, im Idealfall etwas, das nicht sehr wichtig ist. Sie möchten auf jeden Fall vermeiden, dass etwas wirklich Wichtiges schnell erledigt werden muss und die Programmierer das Gefühl haben, dass TDD im Weg steht.

  5. Wenn sich das Team wohlfühlt, lassen Sie alle neuen Funktionen in TDD-Form schreiben. Dies hängt von der Größe Ihres Projekts ab, aber nach einiger Zeit sollten Sie eine ziemlich gute Berichterstattung erhalten, bei der nur einige Legacy- Teile Ihres Projekts auf die alte Art und Weise geschrieben wurden.

  6. Zu diesem Zeitpunkt sollte das Team TDD bereits verstehen und annehmen, und die Arbeit mit älteren (nicht TDD-) Produkten sollte als schwierig und ärgerlich angesehen werden. Lass es umgestalten: Die meisten Leute werden es mit Vergnügen tun.

Einige andere wichtige Punkte:

  • Stellen Sie sicher, dass Sie das beste verfügbare Test-Framework verwenden. Es wird sehr viel schwieriger sein, Leute davon zu überzeugen, TDD zu machen, wenn sie mit einer Bibliothek interagieren müssen, die schlecht geschrieben ist.

  • Stellen Sie sicher, dass die Tests einfach auszuführen sind und nicht zu viel Zeit in Anspruch nehmen (oder schummeln, indem Sie beispielsweise eine speicherinterne Datenbank für die Tests verwenden).

  • Richten Sie eine kontinuierliche Integrationssoftware ein, damit fehlerhafte Tests sofort gefunden werden.


1
Am wichtigsten ist es wahrscheinlich, das Management einzubeziehen.
Todd

18

Eine Möglichkeit, sich mit TDD vertraut zu machen, besteht darin, zuerst Integrationstests zu schreiben. Führen Sie später Testnähte und echte Komponententests ein.

Das Problem beim Schreiben von Unit-Tests nach dem Codieren besteht darin, dass der Code möglicherweise nicht so gut entworfen ist, dass er testbar ist . Möglicherweise müssen Sie einige Umgestaltungen vornehmen oder das Design ändern, um die Testnähte einzuführen. Aber wie können Sie sicher umgestalten oder umgestalten, wenn Sie keinerlei Testabdeckung haben ?

Integrationstests können Ihnen diese Abdeckung zunächst geben. Jedes Mal, wenn Sie ein Regressions- oder Produktionsproblem haben, korrigieren Sie es im Code und decken Sie diesen Code mit einem Test ab. Sobald Sie über ein ausreichendes Sicherheitsnetz verfügen, das durch solche Tests bereitgestellt wird, können Sie Komponententests für feinkörnigere, isolierte Komponenten und / oder Klassen Ihres Systems durchführen.


6
Ich denke, das ist eine großartige Möglichkeit: Zeigen Sie dem Team zuerst, wie End-to-End-Tests automatisiert und für jedes Build ausgeführt werden können. Sie müssen nicht einmal die Tests schreiben, das können Sie selbst machen, wenn das Team schwer zu überzeugen ist. Sobald sie sehen, wie großartig es ist, jedes Mal, wenn sie etwas ändern, ein automatisiertes Feedback zu erhalten, werden sie Sie fragen, wie Sie mehr von dem Zeug machen können.
Sergio Acosta

1
Ihr zweiter Absatz ist genau richtig. Der Code ist schwer zu testen, aber da er auf einer alten Codebasis ohne Tests basiert, ist Refactor keine Option. Der Test kann dann so schwierig zu implementieren sein, dass sich die Leute gar nicht erst darum kümmern.
Todd

3

TDD ist sehr schwierig zu implementieren und nicht immer die beste Option für jedes Entwicklungsteam. In meinem vorherigen Job war das Team stark auf TDD fokussiert. Unser Entwicklungsmodell war vollständig TDD unter Verwendung des agilen Entwicklungsansatzes. Die Prüfung erfolgte durch Unit-Tests in Visual Studio.

Wenn ein Entwickler keine Komponententests für seine / ihre Funktion geschrieben hat, hat er Probleme mit dem technischen Leiter. Wenn jemand einen kaputten Build oder Unit-Tests eincheckt, muss der Entwickler alle Probleme beheben und dem Team-Geldbehälter einen Dollar hinzufügen.


3

Nur eine kleine Sache zum Hinzufügen, visualisieren Sie den Prozess. Führen Sie die kontinuierlichen Integrationstests automatisch durch und prüfen Sie, ob der Code abgedeckt ist. Listen Sie die vollständigsten getesteten Module auf einer Startseite auf, die jeder sehen kann. Das sollte die Mannschaftswettbewerbe in Schwung bringen.


2

Ich wechselte von keiner JUnit-Erfahrung direkt zu TDD, und die Erfahrung machte den Wert von TDD unverkennbar. Ich bin für die Unit-Tests so dankbar geworden, dass ich schnell ein Evangelist für diesen Ansatz wurde


0

Ich war in Teams, die keine Unit-Tests durchgeführt haben, aber es wurde eingeführt und es ist fast üblich geworden, jetzt einige Tests durchzuführen. Ich würde vorschlagen, zu untersuchen, wie gut Ihr Team die Grundlagen des Komponententests versteht und welche Tools Sie hier einbringen möchten.

In meinem Fall brachte es nUnit für einen .NET-Code, der eine Mischung aus Geschäftslogik, Benutzeroberfläche und Back-End-Funktionalität war. Ich würde vorschlagen, zu sehen, ob es einige Leute gibt, die eher gewillt sind, mehr darauf zuzugreifen als andere, so dass es ein paar Leute im Team bekommen und es sich ein bisschen besser ausbreiten kann als die Kehrseite, auf der man versucht, alle zu erreichen darauf zu springen. Indem Sie dafür sorgen, dass einige es zuerst gut machen, können Sie ein Cross-Training durchführen, damit diejenigen, die es lernen, testen können, wie gut sie es anderen beibringen können.

Ein weiterer Punkt ist die Einbeziehung von Fachleuten, um dies in gewissem Maße zu demonstrieren. Es wurden Überlegungen angestellt, bei denen ich daran arbeite, uns einige Dinge zu zeigen, von denen einige weit verbreitet waren, und andere Teile nicht so sehr, aber ich denke, dass dies an den meisten Orten zutreffen würde.

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.