Wenn Unit-Tests so großartig sind, warum machen es dann nicht mehr Unternehmen? [geschlossen]

103

Das erste echte Softwareunternehmen, bei dem ich gearbeitet habe, war das Unit Testing (NUnit). Ich weiß nicht, dass wir damals echte Stickler dafür waren - ich habe keine Ahnung, wie unsere Codeabdeckung war, und ich habe die meisten Unit-Tests geschrieben. Seitdem bin ich auf einige Unternehmen gestoßen, die viele Tests durchführen, aber es handelt sich um Stuhlprüfungen: Sie sind darauf angewiesen, dass eine Person dort ist, haben eine geringe Wiederholbarkeit und eine geringe Wahrscheinlichkeit, Fehler zu erkennen. Die andere Einstellung ist: Es war etwas, mit dem sie "in der Zukunft" beginnen wollten; im Grunde, wenn Geld vom Himmel fällt.

Ich vermisse Unit-Tests - das macht das Leben einfach einfacher. Aber ich stelle fest, dass Unit-Tests bei der Suche nach einem neuen Job entweder etwas sind, mit dem Unternehmen in Zukunft "loslegen" möchten, oder etwas, das sie überhaupt nicht tun (ähm, es gibt es schon eine Weile jetzt!). Ich würde sagen, dass 60-75% der Jobanforderungen, die ich mir in den letzten 2 Jahren angesehen habe, überhaupt keine Unit-Tests aufgeführt haben. Ich kann mir nur ein oder zwei vorstellen, die Erfahrung mit Unit-Tests als Voraussetzung hatten (für eine mittlere Entwicklerposition).

Die Frage ist also, was fehlt ? Ich denke, es macht die Leute produktiver, aber das ist erst, nachdem man eine solide Zeit damit verbracht hat, es tatsächlich zu tun. Gibt es keine guten Studien zu den Kosteneinsparungen bei Unit-Tests? Ist es die Art von Unternehmen, die ich betrachte?

Bearbeiten: Obwohl der Titel ein bisschen Teufelsanwalt ist, betrachte ich mich als Befürworter von Unit-Tests.

jcollum
quelle
In welcher Domain arbeiten Sie? Ich bin immer auf Unit-Tests von unterschiedlicher Vollständigkeit gestoßen, wo immer ich gearbeitet habe. Aber meine Erfahrung liegt in der medizinischen und industriellen Bildgebung, deshalb ...
Kena
Ja, ich vermute du hast recht. Meine Domain besteht normalerweise aus Branchen-Apps. niemandes Leben in der Schwebe. Aber manchmal ist eine Abrechnung in der Waage, und das kann teuer werden.
JCollum
11
Stuhlprüfung: Person sitzt auf Stuhl, fährt Anwendung, meldet Fehler.
JCollum
3
@ Darknight sollte 50.000 Upvotes für seine Ehrlichkeit haben. Komm schon, alte Köpfe, geh hip zur heutigen Zeit. Bewahren Sie diesen Unit-Test-Mist in den 90ern dort auf, wo er hingehört. Größte Zeitverschwendung. Es ist nur etwas, das Sie ansprechen müssen, damit Sie wichtig aussehen können, aber in den meisten Fällen absolut nichts. Wir haben heutzutage eine sogenannte IDE, wir programmieren nicht mehr über die Konsole oder den Editor. Wir wissen, dass unser Code korrekt ist, da wir mit dem Mauszeiger über Text fahren und die Werte anzeigen können. Führen Sie Unit-Tests in der Vergangenheit mit allen anderen Oldtimern durch.
Portfoliobuilder
1
@portfoliobuilder Ja, wenn Sie mit der Maus über Werte in Ihrer IDE fahren, können Sie die Codequalität wirklich verbessern. Weil der Status immer derselbe ist und sich der Code nie ändert. Direkt am! Und viel Glück.
Franz D.

Antworten:

112

Nach meiner Erfahrung sind hier einige Faktoren beteiligt:

  1. Das Management versteht nicht wirklich, was Unit-Tests wirklich sind oder warum sie für sie einen echten inneren Wert haben.
  2. Das Management befasst sich eher mit der schnellen Produktlieferung und sieht Unit-Tests (fälschlicherweise) als kontraproduktiv für dieses Ziel an.
  3. Es gibt eine falsche Vorstellung, dass das Testen ausschließlich zur Qualitätssicherung gehört. Entwickler sind Programmierer und können keine Tests schreiben.
  4. Es gibt eine verbreitete Fehleinschätzung, dass das Management Geld ausgeben muss, um Unit-Tests korrekt durchzuführen, obwohl die Tools frei verfügbar sind. (Natürlich muss der Entwickler die Anlaufzeit in Betracht ziehen, aber das ist nicht wirklich unerschwinglich.)
  5. Wills Antwort wird diese Antwort abrunden: Es ist sehr schwer, den Wert des Testcodes zu bestimmen (jcollum bearbeiten)

Natürlich gibt es noch andere Faktoren, aber genau darauf bin ich bisher gestoßen.

Mike Hofer
quelle
Ja, ich habe mein Management ziemlich genau beschrieben und wir haben keine Tests.
Ty.
Und die Unterstützung in einigen gängigen Sprachen (C / C ++) ist schlecht.
Martin Beckett
@mgb - CxxUnit funktioniert ziemlich gut für mich ...
Dominic Rodger
2
CxxTest ist auch sehr gut. Aufgrund der schlechten Reflexionsmechanismen in C ++ scheint es vielfältigere "Lösungen" zu geben; CxxTest erfordert einen Vorverarbeitungsschritt im Build-System, während Tools wie TUT vollständig kompilierungs- und sprachunterstützt sind, aber umständlich zu verwenden sind.
Tom
2
Ich habe festgestellt, dass Benutzer auf stackoverflow.com dazu neigen, das Management für viele ihrer Probleme wie diese verantwortlich zu machen. Wenn ich meine echten Freunde nach ihren auftretenden „Managementproblemen“ gefragt habe, habe ich normalerweise festgestellt, dass sie noch nie ihre Bedenken gegenüber dem Management geäußert haben und weniger eine Kampagne starten müssen, um die Ansichten der Menschen zu ändern. Anstatt zu sagen, "Management tut nicht ...", versuche ich zu überlegen, wie ich dem Management helfen kann, meinen Standpunkt zu erkennen, und sie davon zu überzeugen, dass meine Position korrekt ist. Ich denke, das ist ein Problem, weil Entwickler nicht gut darin sind, Unit-Tests zu verkaufen.
Brian Stinar
87

1) Es ist schwer
2) Es braucht Zeit
3) Es ist sehr schwer, den Wert des Testcodes zu bestimmen

Punkt 3 ist klebrig. Gute Unit-Tests reduzieren Fehler. Aber auch guter Produktionscode. Wie stellen Sie fest, wie viele Fehler aufgrund Ihrer Komponententests nicht vorhanden sind? Sie können nicht messen, was nicht existiert. Sie können auf Studien verweisen, diese passen jedoch nicht gut in die Tabelle Ihres Geschäftsmanagers.

Will
quelle
11
"Gute Unit-Tests reduzieren Fehler. Aber auch guter Produktionscode." - Gute Unit-Tests ermöglichen es, den Produktionscode zu verbessern. Selbst wenn der Code zunächst schlecht ist, Sie aber eine gute Testabdeckung haben, können Sie das System sicher umgestalten, bis der Code gut ist.
Esko Luontola
1
Esko muss nicht nur eine gute Abdeckung haben, sondern auch gute Tests, die tatsächlich etwas testen. Sie könnten 100% Code-Abdeckung haben und tatsächlich sehr wenig testen
Jacob Adams
Hervorragende Antwort! Sie haben das Gleiche wie meine Antwort in weit weniger Worten gesagt.
Wedge
2
Ja, Unit-Tests brauchen Zeit. Aber auch "zufällige Fehlerbehebung". Bei einer ordnungsgemäßen testgetriebenen Entwicklung wurden "alle" Funktionen in Tests "dokumentiert". Wenn die Tests grün sind, funktioniert das Produkt wie vorgesehen (mit Ausnahme von Usability-Problemen usw.). Ich habe die Erfahrung gemacht, dass die gesamte Entwicklungszeit fast überhaupt nicht beeinflusst wird. Sie verbringen mehr Zeit mit Dingen und machen sie gleich beim ersten Mal richtig, anstatt nach der Zeit, die Sie für die Fehlerbehebung aufgewendet haben.
Arve Systad
Und einige der Studien zeigen, dass Unit-Tests einen negativen Wert haben. Das Zeigen von Studien ist daher sehr nicht schlüssig und sollte daher zu einem gewissen Widerstand des Managements führen, bis es wahrscheinlich ist, dass der Wert für den betreffenden Shop positiv ist
Rune FS
70

Es ist leicht, dem „Management“ die Schuld zu geben. Aber ist das Management wirklich sagen , Sie speziell nicht jede Unit - Tests zu tun?

Das Management im Allgemeinen sagt Ihnen nicht (und sollte es wahrscheinlich auch nicht), wie Sie Ihre Arbeit erledigen sollen, ob es sich um Modularisierung, abstrakte Datentypen, Entwurfsmuster oder Komponententests handelt. Dies sind Handelsinstrumente, die ein erfolgreicher, kompetenter Softwareentwickler anwendet, ein schlechter Ingenieur jedoch nicht.

Ich denke, die eigentliche Antwort auf Ihre Frage lautet: Unit-Tests sind wirklich schwierig, und Informatikstudenten sind nicht dafür ausgebildet.

Es ist einfach, wenn Sie Ihre eigene String-Klasse schreiben. Wenn Sie ein reales Produkt testen, stoßen Sie auf Herausforderungen, von denen Ihnen in den PowerPoint-Folien niemand erzählt hat:

  • Benutzerinteraktion. Die Hälfte Ihrer Anwendung ist die Benutzeroberflächenlogik. Wie testest du es auf automatisierte Weise, die nicht kaputt geht, wenn du einen Knopf bewegst?
  • Interaktion mit externen APIs und Frameworks. Wie testen Sie einen Windows-Kerneltreiber, wenn Sie ihn schreiben? Schreiben Sie Stubs für jede von Ihnen verwendete IRP- und Kernelfunktion, um effektiv eine Simulation des Betriebssystemkerns zu erstellen?
  • Netzwerkkommunikation ist das Ding des 21. Jahrhunderts. Wie koordinieren Sie einen Komponententest, der aus mehreren verteilten Komponenten besteht?
  • Wie wählen Sie gute Testfälle aus? Ich sehe häufig Leute, die versuchen, zufällige Dinge in einer Schleife von 1000 Iterationen zu tun und zu sehen, ob sie kaputt gehen. Wenn Sie dies tun, ist der Aufwand höher als die Rendite, wichtige Fehler werden übersehen und Unit-Tests werden abgebrochen.
  • Wie testen Sie, ob die Leistungsanforderungen erfüllt sind?
  • Das Wissen über Muster beim Testen ist knapp: Stubs, vordefinierte Antworten und Regressionstests sind Konzepte, die die meisten Menschen nicht kennen. Wie viele an Ihrem Arbeitsplatz lesen tatsächlich ein Buch über Unit-Tests?

Das eine, wofür wir das Management verantwortlich machen können, ist, dass Anforderungsspezifikationen selten Anforderungen an das Qualitätsniveau des Liefergegenstandes enthalten.

Wenn Ihr Chef Sie das nächste Mal auffordert, eine Zeitschätzung vorzunehmen, geben Sie die Zeit für das Schreiben eines Komponententests an und sehen Sie, was passiert.

Flodin
quelle
2
Gute Idee. Rufen Sie jedoch nicht die Zeit zum Erstellen von Komponententests getrennt von der Zeit zum Erstellen des "Produkt" -Codes auf!
Jeff Kotula
3
Als ich diese Antwort las, wurde mir klar, dass ich zwar mit dem Konzept und den Grundlagen des Unit-Tests vertraut bin, aber wirklich nicht weiß, wie ich es effektiv machen soll. Können Sie ein gutes Buch zu diesem Thema empfehlen?
Bretonisch
1
Auf einem Kerneltreiber, an dem ich gearbeitet habe, habe ich eine Menge Code in eine Bibliothek umgestaltet, die ich mit einem Test-Harness im Benutzermodus verknüpft habe. Dieser spezielle Code war umweltunabhängig, daher war er einfach genug. Ich habe es nicht ausprobiert, aber IRPs wie Dateisysteme und Datenbanken sollten verspottbar sein.
George V. Reilly
1
Mit Bochs oder QEMU ist es möglich, eine Simulation Ihres Geräts zu schreiben, mit der Ihr Kerneltreiber sprechen kann.
Zan Lynx
2
@floding, faszinierende Antwort. Ich denke, ich muss ein Buch über Unit-Tests lesen.
Dan Rosenstark
28

Die meisten Tests testen nichts.
Sie schreiben eine fileopen () - Funktion und eine unittest, die fehlschlägt, wenn die Datei nicht vorhanden ist, und erfolgreich ist, wenn die Datei vorhanden ist. Toll! Haben Sie jetzt überprüft, ob es mit dem Dateinamen in BIG5 Chinesisch funktioniert? auf einer NFS-Freigabe? auf Vista mit der Datei auf einem USB-Stick und UAC eingeschaltet?

Das Problem ist, dass die Komponententests von demselben Programmierer geschrieben werden, der die Funktion geschrieben hat, mit denselben Annahmen und denselben Fähigkeiten. Um wirklich zu funktionieren, müssen die Tests von jemand anderem geschrieben werden, nur nach den veröffentlichten Spezifikationen, ohne dass dieser den Code sieht. - In den meisten Unternehmen wäre es ein Durchbruch, nur schriftliche Spezifikationen zu erhalten!

Unit-Tests prüfen, ob der Code der einzelnen Funktionen fehlerhaft ist. Sie können für Datenzugriffsebenen, Mathematikbibliotheken usw. verwendet werden, bei denen die Ein- / Ausgänge bekannt sind und die interne Struktur komplex ist, aber in vielen Fällen sind sie nur Zeitverschwendung.
Sie schlagen fehl, wenn die Fehler auf Interaktionen zwischen verschiedenen Codeteilen oder mit dem Betriebssystem und dem Benutzer zurückzuführen sind. Probleme wie hohe / niedrige DPI-Einstellungen, die ein Dialogfeld durcheinander bringen, oder eine Fremdspracheneinstellung, bei der ein '.' und ',' werden normalerweise nicht gefunden.

Martin Beckett
quelle
15
Ich denke, diese Antwort verfehlt die Marke ein wenig. Unit Testing und Functional Testing sind und sollten nicht dasselbe sein.
Wedge
4
Ein Element, das Sie vermissen, ist, dass Unit-Tests nicht nur eine einmalige Sache sind. Wenn ich später herausfinde, dass ich einen Fehler mit fileopen () auf einer NFS-Freigabe beheben muss, kann ich meiner Testsuite einen Test hinzufügen. Wenn ich dann in Zukunft mehr entwickle, habe ich Regressionstests eingerichtet.
Paul Osborne
2
Viele Fehler entstehen durch Interaktionen außerhalb des Codes, an die die Programmierer nicht gedacht haben und die nicht durch einfaches Überprüfen des Codes gefunden werden können. Ein häufiges GUI-Problem sind Maschinen mit sehr hohen / niedrigen DPI-Einstellungen. Sie können die Dialogfunktion nach Belieben testen, ohne dies zu bemerken.
Martin Beckett
5
Dies ist jedoch nicht die Funktion eines Komponententests, und die Interaktion zwischen verschiedenen Teilen des Codes ist sehr einheitlich. Wenn diese Teile von separaten Teams geschrieben werden, müssen Sie Ihren Code anhand einer gemeinsamen Schnittstelle testen und die Komponente des anderen Teams verspotten Gute Praktiken.
Steven Evers
1
TDD behandelt das manipulierte Testproblem "Der Programmierer, der den Code geschrieben hat, schreibt dann auch die Tests", indem Sie die Tests schreiben, bevor Sie den Code schreiben.
Ophidian
15

Es wurden Studien zum ROI von Unit-Tests durchgeführt - siehe diese Frage .

Dominic Rodger
quelle
15

Ich habe viele Entwickler gefunden, die nicht an Unit-Tests interessiert sind. Es scheint immer viel Arbeit mit wenig Gewinn zu sein, wenn Sie anfangen. Niemand möchte sich für zusätzliche Arbeit anmelden und widersetzt sich daher. Sobald die Leute anfangen, bleiben sie normalerweise begeistert dabei, aber es kann schwierig sein, sie anzufangen.

Steve Rowe
quelle
12

Abgesehen von der Frage der Einführung von Unit-Tests lohnt sich Unit-Test nicht immer, obwohl ich es im Allgemeinen denke, wenn es richtig angewendet wird. Unit-Tests sind nichts Besonderes, das sie davor bewahrt, für schlechte Konstruktionen anfällig zu sein.

Unit-Tests haben Kosten (Erstellung, Wartung und Ausführung) und sind nur dann sinnvoll, wenn sie einen größeren Nutzen als diese Kosten bieten. Das Erstellen von Tests ist eine Fähigkeit wie jede andere. Sie erfordert spezifische Erfahrung und Kenntnisse, um erfolgreich zu sein. Ohne ausreichende Erfahrung ist es selbst für ansonsten erfahrene Entwickler sehr einfach, Unit-Tests von geringer Qualität, geringem Wert und / oder hohen Kosten zu erstellen, die sich nicht lohnen. Vor allem, wenn man bedenkt, wie schwierig es sein kann, den Wert eines Unit-Tests zu beurteilen.

Darüber hinaus sind Unit-Tests nur eine Möglichkeit, die Codequalität zu verbessern, aber nicht die einzige. Unter bestimmten Umständen und bei einigen Teams ist dies möglicherweise nicht der effektivste Weg, um die Qualität von Software zu verbessern.

Denken Sie daran, dass ein großer Aufwand für Unit-Tests keine Garantie für hochwertige Software ist. Und es ist auch möglich, Software von höchster Qualität ohne jeglichen Unit-Test zu produzieren.

Keil
quelle
Was Sie sagen, ist in statisch typisierten Sprachen wahr. In dynamisch getippten Sprachen sind sie absolut kritisch. Ich meine, Ihr Code ist ohne die Tests fast garantiert Mist. Ich finde, dass dies ein großer Teil dessen ist, warum manche Leute Unit-Tests so hoch schätzen.
Bill K
11

Nun, meine Firma hat sich nicht für TDD oder Unit Testing entschieden. Um ehrlich zu sein, sind wir uns nicht sicher, wie wir das machen sollen. Wir können es natürlich für dumme Funktionen wie CapitalizeString () usw. tun, aber wir wissen nicht, wie wir es für hochkomplexe Systeme mit komplizierten Objekten tun sollen. Darüber hinaus haben die meisten Befragten entweder keine oder nur begrenzte Erfahrung. Es scheint, dass Unit Testing von der SO-Masse groß ist, aber im verfügbaren Workpool nicht besonders groß.

TDD ist ein separates Thema. Wir sind moralisch gegen TDD. Wir sind keine Cowboy-Programmierer, aber wir glauben, dass dies Kreativität und Flexibilität in einem Projekt beeinträchtigt. Darüber hinaus macht es keinen Sinn, den Codierer zu haben, der die Unit-Test-Funktion geschrieben hat. Wenn ich etwas mache, codiere ich alle Randfälle, die mir einfallen. Was ich brauche, ist ein anderes Gehirn, um nach Dingen zu suchen, die ich möglicherweise übersehen habe. Das haben wir nicht. Die Teams sind klein und eigenständig.

Kurz gesagt, wir glauben nicht an TDD, aber wir möchten Unit Test. Wir haben einfach nicht die Erfahrung dazu und können es nicht leicht finden.

Steve
quelle
Damals, als der Ort, an dem ich arbeite, genug Codierer dafür hatte, haben wir Pair-Programmierung durchgeführt. Ich fand es sehr effektiv, dass einer Tests schrieb, während der andere codierte. Dies führte auch zu sehr intelligenten Fragen zum Code.
Zan Lynx
4
Der Punkt bei TDD, den Sie anscheinend vermissen, ist, dass Sie alle Randfälle in Ihren Komponententest schreiben. Für jeden Fall schreiben Sie eine Aussage in Ihren Unit-Test. Wenn Ihr tatsächlicher Code eine Behauptung nicht besteht, wissen Sie, dass Ihr Code einen Fehler enthält, und Sie haben Ihre Logik falsch implementiert. Da die Einheiten klein sind und Ihre Behauptung spezifischen Code in der Einheit testet, sollte es einfach sein, genau zu bestimmen, wo Ihr logischer Fehler liegt. Wichtig ist, dass Sie zuerst Ihre Aussagen schreiben. Dann lassen Sie Ihren Code passieren. Können Sie darauf hinweisen, wo dieser Prozess alles andere als das Wachstum von Fehlern bremst?
Christopher Parker
2
Es wird sehr schwierig sein, einen Unit-Test durchzuführen, ohne zuerst die Tests zu schreiben. Dies liegt daran, dass es schwierig ist, Ihren Code nachträglich in ein Testkabel zu bekommen. Dies ist einer der Hauptvorteile von Test First: Das Design ist von Anfang an testbar, da Tests das Design vorangetrieben haben.
Alan Christensen
3
Wie kann es sein, dass Sie "nicht sicher sind, wie" Sie Unit-Tests durchführen sollen, aber glauben, dass TDD Kreativität und Flexibilität beeinträchtigt?
Jcorcoran
1
@Steve 6 Jahre später wäre es schön zu wissen, ob Sie jemals Unit-Tests (oder sogar TDD) eingeführt haben und ob Sie damit weitermachen.
Luke Puplett
11

Es gibt viele Unternehmen, die wirklich nichts im Sinne von Best Practices tun. Keine Codeüberprüfungen, keine Unit-Tests, keine Testpläne, kein Nichts, nur am Sitz ihrer Hose.

Nutzen Sie diese Gelegenheit, um sie dazu zu bringen, eine Continuous Integration-Plattform zu nutzen und Unit-Tests zu entwickeln! Einfache Möglichkeit, die vorhandenen Kräfte zu beeindrucken und gleichzeitig die Qualität und Stabilität Ihres Codes zu verbessern

Bearbeiten: Aus gutem Grund denke ich, dass sie einfach nicht über die aktuellen Tools informiert sind, die CI- und Unit-Tests außerordentlich einfach machen.

Allen Rice
quelle
Ich bin normalerweise in einer Position, in der ich keinen Einfluss auf solche politischen Entscheidungen habe. Ich bin Junior Senator und werde von Ausschussvorsitzenden überstimmt.
JCollum
Es dauert einige Minuten, um Hudson zu starten und Unit-Tests zu schreiben. Wenn Unit-Tests bereits auf Ihrer "TODO" -Liste stehen, erledigen Sie nur Ihre Arbeit. Komitees sind oft beeindruckt von ausgefallenen Diagrammen und Bildern, also zeigen Sie ihnen einige hübsche Trendgraphen von Hudson;)
Allen Rice
Ja! Hören wir es für die Wahrheit. Trotz all der Zeit, die wir Entwickler mit Best Practices verbringen, wird es in der realen Welt nicht immer verwendet. Schade wirklich.
NeedHack
6

Ich denke nicht, dass Faulheit die Hauptursache für schlechte Unit-Tests ist. Für mein Unternehmen sind Zeitbeschränkungen und die Einstellung "Einfach erledigen" die größten Abschreckungsmittel für Unit-Tests. Außerdem befinden sich die Stellen, an denen unsere Systeme ausfallen, eher auf der Integrationsebene (Dienste, Datenbankzugriffe, komplexe Abfragen, für die bestimmte Daten zum Testen erforderlich sind) als auf der "Einheitenebene". Diese Dinge sind nur schwieriger zu testen, und wenn Sie kaum genug Zeit haben, um die Funktion auszuführen, haben Sie wahrscheinlich keine Zeit, um gleichzeitig nützliche Tests durchzuführen.

Andy White
quelle
Das ist üblich. Ich denke, das Argument ist, wenn Sie glauben, dass Sie es in Zukunft jemals ändern werden, sollten Sie einen Test haben, der sicherstellt, dass es funktioniert, nachdem es sich geändert hat.
JCollum
6

Unit-Tests sollten genau wie der Compiler nur ein natürlicher Bestandteil des Code-Entwicklungs-Workflows sein.

Dies erfordert jedoch eine Schulung des Managements über die Vorteile der Unit-Tests. Nachwuchsentwickler haben jedoch relativ geringe Chancen, einen solchen Einfluss zu haben. Ob ein Unternehmen ein Befürworter des Unit-Tests ist, hängt daher davon ab, ob es einen leitenden Entwickler oder Architekten hat, der sich für Unit-Tests einsetzt.

Ich glaube, dies ist die Antwort auf Ihre Frage "Was fehlt und warum führen nicht mehr Unternehmen Unit-Tests durch?" . :-)

Franci Penov
quelle
1
+1 für "sollte ein natürlicher Bestandteil des Codeentwicklungs-Workflows sein". Jeder professionelle Entwickler sollte dort unabhängig vom offiziellen Prozess eigene Unit- Tests durchführen. Das einzig legitime Argument zu diesem Thema ist die Definition einer Einheit .
Dunk
1
@Dunk Wenn Sie nicht "Einheit" definieren, sagen Sie nur, dass "professionelle Entwickler ihre eigenen Tests durchführen sollten".
ChrisW
1
@ChrisW - Ja, professionelle Entwickler sollten ihre eigenen Tests durchführen. Es gibt keinen Grund für einen Entwickler, jemals Code einzureichen, den er nicht genug getestet hat, um sicher zu sein, dass er ordnungsgemäß funktioniert. Leider scheint dies zu viel zu sein, um viele Entwickler zu fragen.
Dunk
1
Wenn ich sage, dass die Definition einer Einheit ein legitimes Argument ist, spreche ich von der Granularität einer Einheit. Ist es eine Klasse? Ist es eine Sammlung von Klassen? Ist es eine Komponente? Ich denke, Unit-Tests auf Klassenebene (mit einigen Ausnahmen) kosten mehr als es nützt und führen zu vielen bedeutungslosen Tests ...
Dunk
auf die andere in diesem Thread hingewiesen haben. Wenn Sie eine Sammlung von Klassen definieren, die als Einheit zusammenarbeiten, können Sie dennoch automatisierte Tests durchführen, und Ihre Tests sind im Allgemeinen aussagekräftiger, da sie sich stärker auf die erforderlichen Funktionen auf höherer Ebene konzentrieren können.
Dunk
5

Es ist wahrscheinlich eine Kombination aus ein paar Dingen, die Sie bereits erwähnt haben. Es ist schwierig, die Kosteneinsparungen von TDD zu messen. Wenn Sie Ihre IT auslagern möchten, können Sie zeigen, wie viel Sie pro Jahr für die Mitarbeiter bezahlen, die Sie beschäftigen, im Vergleich zu den Kosten für die Auslagerung. Es ist sehr konkret. Wie sagt man: "Oh, dieser Test hat einen Fehler entdeckt, für dessen Debugging und Behebung ich 4 Stunden gebraucht hätte ..."?

Ovi Tisler
quelle
Wie um alles in der Welt können Sie erraten, wie lange ein Fehler zum Debuggen und Beheben dauern würde? Im Allgemeinen ist das Debuggen meiner Erfahrung nach eher zufällig - ich habe zufällig eine Idee, wo das Problem liegt oder nicht.
Dominic Rodger
1
Ja, deshalb habe ich gesagt, es ist so schwer, die Vorteile des Testens zu quantifizieren.
Ovi Tisler
5

Der Grund, warum einige Orte es nicht verwenden, ist einfach, dass es viel Arbeit erfordert, um loszulegen und fortzufahren. Die Tatsache, dass das Schreiben von Komponententests ungefähr so ​​viel Zeit in Anspruch nimmt wie das Schreiben der eigentlichen Funktionalität, scheint einigen Managern, als würden Sie die Produktivität Ihres Entwicklers halbieren.

Darüber hinaus muss ein Team (oder jemand) die Infrastruktur einrichten und warten.

Und wie Alan sagt, verwenden viele Orte einfach keine Best Practices - sie wollen nur etwas Greifbares sehen.

Michael Burr
quelle
5

Nach allem, was ich gesehen habe, haben viele Unternehmen riesige, stark gekoppelte Codebasen, die praktisch nicht auf Einheiten getestet werden können. Sie haben auch keine anständigen testbaren Anforderungen, so dass die Unit-Tests gegen "wie gebaut" de facto Anforderungen testen würden.

Rob K.
quelle
5

Ich denke, dass der Programmierer einfach damit anfangen muss. Einige einfache Tests sind im Rahmen der Entwicklung leicht zu rechtfertigen.

So etwas wie ein Unit-Test ist fast immer notwendig, um ein schnelles Debuggen zu erreichen. Erklären Sie einfach, wie viel schneller es ist, den Test zu starten, als die richtige Eingabe zu arrangieren, einen Debugger-Haltepunkt festzulegen, die Anwendung zu starten usw.

Dokumentieren Sie den Test in Ihrem Code. Geben Sie einfach einen Kommentar ein, in dem erläutert wird, wo sich der Test befindet und wie er ausgeführt wird. Zukünftige Programmierer werden es sehen und hoffentlich werden sich die Tests verbreiten!

Zan Lynx
quelle
4

Unit-Tests sind einer der Black-Box-Begriffe, die die meisten Menschen gehört haben, wissen aber nicht, was genau einen Unit-Test ausmacht, wo sie beginnen sollen, wie sie geschrieben werden sollen, wie Tests tatsächlich ausgeführt werden sollen, was genau sie testen sollen usw. usw. usw. usw.

In vielen Fällen ist es für den unsicheren Entwickler einfacher, sie einfach als unnötig oder als Sahnehäubchen abzutun, das nur Entwickler auf Unternehmensebene benötigen.

Soviut
quelle
4

Ich bin ein großer Fan von Unit-Tests und Partner eines Unternehmens, das Vertragsentwicklungsprojekte für verschiedene Kundentypen durchführt. In einem Monat werden wir 3-4 verschiedene Projekte unterschiedlicher Größe berühren.

Wenn ein Projekt einmalig zu sein scheint, werde ich nicht viel in Unit-Tests investieren, da sich diese Unit-Tests für mein Unternehmen nicht auszahlen. Bei solchen Projekten werde ich Dinge testen, die mir unsicher / unbekannt sind oder die sich häufig ändern können (z. B. ein Parser für eine Datenquelle, die ich nicht kontrolliere).

Wenn ich etwas baue, von dem ich weiß, dass es eine lange Lebensdauer hat, eine größere Arbeit ist, mit der ich durch mehrere Iterationen arbeiten werde, oder die einen großen Einfluss auf meine Kunden hat, wenn ein Fehler auftritt Ich werde in mehr Unit-Tests investieren. Wieder dreht sich die Priorität der Tests um unsicheren / unbekannten / sich ändernden Code.

Ich denke, Unit-Tests sollten sich um die Komplexität einer Aufgabe drehen und darum, ob sie sich auszahlen. Es macht keinen Sinn, zusätzlichen Code zu schreiben, der nicht verwendet wird.

Gavin Miller
quelle
3

Nach meiner Erfahrung hängt es wirklich von der Software ab, die Sie schreiben. Ich habe festgestellt, dass es extrem schwierig ist, Komponententests für eine Benutzeroberfläche zu schreiben. Ich verwende Unit-Tests nur für Teile des Systems, die ein bestimmtes In / Out haben.

Shaun Bowe
quelle
Genau. Wenn Sie Modell / Ansicht / Controller verwenden, ist es sehr sinnvoll, das Modell und den Controller einem Unit-Test zu unterziehen. Die Benutzeroberfläche wird fast immer am besten von einem Menschen getestet.
Zan Lynx
3

Ich vermisse Unit-Tests - das macht das Leben einfach einfacher.

Das ist nicht , wirklich, ein ausreichender Grund für ein Unternehmen , Unit - Tests zu übernehmen.

Ein ausreichender Grund könnte "billiger" (und / oder "besser") sein: Dies ist bei Unit-Tests nicht so einfach zu beweisen.

Der einzige gute Grund könnte sein, dass "das Schreiben von Komponententests die beste Nutzung der Entwicklerzeit ist", was IMO wirklich schwer zu beweisen ist: und es kann an einigen Stellen zutreffen, für einige Software, mit einigen Entwicklern und anderswo nicht.

Es gibt viele Entwickler, die die Welt der Unit-Tests nicht glauben: Einige denken, dass andere Testformen (z. B. automatisierte Integration / Funktionstests) billiger und wertvoller sein könnten, zum Beispiel bin ich der einzige Entwickler, der dies nicht tut. Sie mögen keine Unit-Tests?

ChrisW
quelle
3

Natürlich kann man in der idealen Welt nicht gegen einen Unit-Test argumentieren.

Ob Sie einen Komponententest schreiben, hängt jedoch von einer Reihe von Faktoren ab:

  • Wie die Software verwendet wird. Wenn Sie Software nur für sich selbst schreiben würden, würden Sie Unit-Tests schreiben? Wahrscheinlich nicht. Wenn Sie vorgefertigte Software für den kommerziellen Verkauf geschrieben haben, wahrscheinlich ja.

  • Wie viele Personen pflegen den Code? Wenn Sie es nur sind, wissen Sie ihn möglicherweise gut genug, um nach einer Änderung sicher genug zu sein, dass ein schneller Durchlauf des Codes ausreicht, um sicherzustellen, dass nichts kaputt gegangen ist. Wenn andere Personen, die den Code ursprünglich nicht geschrieben haben, ihn jetzt beibehalten müssen, können sie durch einen Komponententest sicher sein, dass sie beim Aktualisieren des Codes zur Behebung eines großen Problems (das offensichtlich nicht im Komponententest erfasst wurde!) Nichts beschädigt haben .

  • Codekomplexität: Nur Testcode, der einen Test benötigt. Eine einzeilige Variablenzuweisungsmethode muss nicht getestet werden. Eine 50-Zeilen-Methode mit mehreren Ausführungspfaden ist wahrscheinlich ausreichend.

  • Praktische kommerzielle kommerzielle Überlegungen: Das Schreiben von Unit-Tests dauert länger als das Nicht-Testen. Wenn Sie Prototyp-Software schreiben, die eine ungewisse kommerzielle Zukunft hat, dann lohnt es sich, schnell Code zu haben, der ausreichend gut funktioniert, und in 2 Wochen Unit-getesteten Code, der besser funktioniert. Manchmal lohnt es sich, schnell herauszufinden (Appetit der Verbraucher), ob Software ein kurzes Regal hat, und mit dem nächsten Projekt fortzufahren.

und wie andere betont haben, ist ein Test nur so gut wie die Person, die ihn geschrieben hat.

Joel
quelle
3

Der Hauptgrund ist, dass viele Entwickler und Entwicklungsmanager keine Ahnung haben, ob Unit-Tests existieren oder wie sie verwendet werden.

Der zweite Grund ist, dass Unit-Tests nur (auf sinnvolle Weise) mit Code verwendet werden können, der bereits einige Qualitätsstandards erfüllt. Es besteht die Möglichkeit, dass eine vorhandene Codebasis nicht in diese Kategorie fällt.

Der dritte Grund ist Faulheit und / oder Billigkeit.

Erich Kitzmüller
quelle
3

Weil Unit-Tests nur dann nützlich sind, wenn Sie testbaren Code schreiben. Und das Schreiben von testbarem Code ist schwierig. Und die Leute sind faul und / oder billig.

EDIT: nuanciert "faul" als "faul und / oder billig"; In einigen seltenen Fällen verfügen die Leute tatsächlich über die Fähigkeiten und die Fähigkeit und den Willen, Tests zu schreiben, aber sie haben noch etwas zu tun, das sich direkter auf das Endergebnis auswirkt.

phtrivier
quelle
Ich würde dies positiv bewerten, außer ich denke nicht, dass die Leute "faul" sind. Denken Sie, "Programmieren", dh "Ihre beliebte Programmiersprache und verwandte Tools, Dokumente, Schulungen, Workflows, Dinge", wurde nie so entwickelt, dass das Schreiben von testbarem Code erleichtert wird. Um testbaren Code zu schreiben, müssen Sie immer einen Schritt weiter gehen. Für keine Belohnung "da es bereits funktioniert" zu diesem Zeitpunkt (so dass das Schreiben von Tests zuerst, Code später, TDD, praktisch sinnvoll ist). Denken Sie, dies ist eher eine kognitive Tendenz , die nicht nur aktuelle Programmierer austrickst, sondern bereits die Autoren der 'Programmier'-Tools ausgetrickst hat, auf denen die Codierer jetzt aufbauen.
n611x007
1
Ja, sicher, manchmal sind die Leute billig / pleite / haben bessere Dinge zu tun (oder, wie wir es höflich ausdrücken, "Kompromisse eingehen müssen"). (Ich wollte scherzhaft hinzufügen, dass außerdem der meiste Code nutzlos ist, so dass das Testen auch nutzlos ist; aber das ist nur Schlafmangel;))
phtrivier
2

Ich denke, ein Teil des Problems besteht darin, dass Entwickler von Geschäftsleuten erwarten, dass sie dieselben Werte haben und sich wirklich um die Antwort auf "Sollen wir Unit-Tests durchführen oder nicht?" Kümmern. Wir erhalten keine vorherige Genehmigung vom Unternehmen, eine Hochsprache anstelle einer Assemblersprache zu verwenden - dies ist normalerweise nur der vernünftige Weg, um die Arbeit zu erledigen.

Der Punkt ist, dass wir die einzigen sind, die für den Anruf qualifiziert sind (was nicht heißt, dass wir alle das gleiche Wissen über das Thema haben). Selbst wenn Ihr Team aus politischen Gründen keine Unit-Tests durchführt (oder Ihre Tagesmethode benennt), bedeutet dies im Allgemeinen nicht, dass Sie dies nicht tun können.

Die Wahrheit ist, dass wir den ROI für die meisten Dinge, die wir tun, nicht wirklich mit einer zu feinen Granularität beweisen können. Warum Unit-Tests diesem unvernünftigen / untypischen Beweisstandard standhalten, ist mir ein Rätsel ...

Jeff Kotula
quelle
Sie müssen jedoch das Management einbeziehen, da Sie Ihre Mitentwickler an Bord holen müssen. Der beste Weg, dies zu erreichen, besteht darin, dass dies von oben nach unten erforderlich ist.
John
2

Die Leute sind faul und nehmen Veränderungen nur an, wenn sie dazu gezwungen werden.

Hunter
quelle
2

Meine 2 Cent:

  • Es erfordert etwas Ausbildung und Disziplin, aber neue Absolventen verfügen bereits über die richtigen Kenntnisse.
  • Der Testaufwand kann mit besseren Tools reduziert werden, und dies geschieht auch (Refactoring usw.)

Es ist also nur eine Frage der Zeit.

Es gibt die Martin-Coplien-Debatte, in der Bob Martin Folgendes behauptet:

"Heutzutage ist es für einen Entwickler unverantwortlich, eine Codezeile zu versenden, die er in einem Komponententest nicht ausgeführt hat."

[ http://www.infoq.com/interviews/coplien-martin-tdd]

robi-y
quelle
2
Ich glaube nicht an die Existenz eines komplexen, realen Systems, in dem jede einzelne Codezeile durch Unit-Tests abgedeckt wurde.
quant_dev
2

Wenn Sie alle beim Testen verkaufen möchten, gehen Sie wie folgt vor:

  1. Schreiben Sie eine Reihe von Tests.
  2. Benachrichtigen Sie die anderen Entwickler, die den Code ändern und Ihre Tests nicht bestehen.
  3. Sie werden ihren Code reparieren.
  4. Jetzt können Sie ohne diese besonderen Fehler veröffentlichen.

Sogar ein Manager könnte das verstehen.

JeffO
quelle
Unit-Tests führen nicht dazu, dass Ihre Version fehlerfrei ist. Es kann die Anzahl der Fehler verringern, aber es ist furchtbar schwierig, die Anzahl der Fehler zu messen, die aufgrund von Tests die Produktion / nicht / getroffen haben.
Tom
Ich weiß nicht, dass das Management mit jemandem zufrieden wäre, der eine Reihe von Tests schreibt, wenn er neue Funktionen codieren könnte. Wenn sie nicht mit TDD an Bord sind, werden Sie wahrscheinlich Probleme bekommen, wenn Sie Tests schreiben, um Code abzudecken, den Sie nicht geschrieben haben.
JCollum
@jcollum Wie immer hängt es vom Kosten-Gewinn-Verhältnis ab.
quant_dev
2

Unternehmen führen keine Unit-Tests durch, aus dem gleichen Grund, dass viele Websites schlecht geschrieben sind - Unwissenheit und Menschen, die an alten Gewohnheiten festhalten. In unserem Unternehmen erreichen wir seit Beginn der Unit-Tests (mit Nunit und Typemock ) eine höhere Codeabdeckung und veröffentlichen die Software in kürzerer Zeit auf den Markt.

Steve_0
quelle
2

Wie die meisten guten Ideen hat die Annahme mehr mit der Abhängigkeit von Organisationspfaden als mit der Qualität der Idee zu tun.

In den meisten Unternehmen, die Produkte ausgeliefert haben, wurde eine umfangreiche QS-Abteilung mit einem leitenden QS-Leiter eingerichtet. Testen ist das Lehen des QS-Teams.

Es ist unwahrscheinlich, dass das QA-Team Unit-Test-Code schreibt, da das Unternehmen das QA-Team normalerweise nicht mit seinen Hochleistungscodierern besetzt.

Das Programmierteam zögert, Testcode zu schreiben, da dies zu einem Konflikt mit dem QS-Team führt.

Ich habe mehr Interesse und Akzeptanz von Unit Testing in Gruppen gesehen, in denen die Qualitätssicherung nicht in eine separate Jobfunktion ausgegliedert wurde

Zmanian
quelle
1

Das Schreiben und Aktualisieren von Komponententests kostet einfach Geld. Die meisten früheren Softwareprogramme von Unternehmen haben keine Komponententests und kosten zu viel für das Schreiben. Sie tun dies also nicht und es verlängert den Entwicklungsprozess, sodass sie es auch nicht zu neuen Funktionen hinzufügen.

David Basarab
quelle
Sie sollten die Links zum ROI lesen.
JCollum
1

Die meisten Unternehmen sind nutzlos. Offensichtlich nicht der, für den Sie (oder ich) arbeiten.

Roger Lipscombe
quelle
Dies gibt keine Antwort auf die Frage. Um einen Autor zu kritisieren oder um Klarstellung zu bitten, hinterlassen Sie einen Kommentar unter seinem Beitrag.
AlexVogel
F: "Warum machen nicht mehr Unternehmen [Unit-Tests]?" A: "Weil die meisten Unternehmen nutzlos sind." Klingt nach einer Antwort für mich ...
Roger Lipscombe