Muss ich alles testen?

28

Ich werde mein erstes echtes Projekt in Ruby on Rails starten und zwinge mich, TDD- Tests zu schreiben . Ich sehe keine wirklichen Vorteile beim Schreiben von Tests, aber da dies sehr wichtig erscheint, werde ich es versuchen.

Muss ich jeden Teil meiner Anwendung testen , auch statische Seiten?

Matteo Pagliazzi
quelle
9
Das ist wirklich keine Ruby-on-Rails-Frage. Es ist eher eine TDD-Frage.
Jon Strayer
4
@ JonStrayer: Ist es? Sind Sie sicher, dass die Antwort für RoR mit .NET identisch ist? Ich würde vorschlagen, dass RoR die Kosten für das Testen absichtlich gesenkt hat, während das Fehlen einer Typensicherheit in Form eines Compilers den Nutzen des Testens massiv erhöht.
pdr
1
Aus irgendeinem Grund möchte ich ein Bildmakro von Captain Nero posten, der "TEST ALLES !!!"
Mason Wheeler
3
Es klingt nicht richtig, den wahren Vorteil zu sehen, Tests zu schreiben und sie aus blindem Glauben heraus zu schreiben. Fahren Sie fort, ohne Tests zu schreiben. Nach einer Weile werden Sie eine unerwartete Regression feststellen und wissen, warum Sie testen.
ZJR
1
Warten Sie, bis Sie sich entschließen, Ihren Code neu zu strukturieren. Jedes Mal, wenn massive Änderungen vorgenommen werden, müssen Sie die Funktionalität überprüfen. Ohne Tests müssen Sie Ihre Anwendung durchgehen und alle Funktionen manuell testen. Führen Sie ein weiteres großes Update ein, und Sie müssen es erneut ausführen. Unit-Tests sind nur ein "billiger" Weg, um sicherzustellen, dass alles wie erwartet funktioniert.
Evan Plaice

Antworten:

47

Bei TDD geht es nicht um Tests, sondern um Design. Wenn Sie die Tests schreiben, müssen Sie darüber nachdenken, wie die Klasse funktionieren soll und welche Art von Schnittstelle Sie benötigen. Die Tests sind ein erfreulicher Nebeneffekt, der eine spätere Umgestaltung erleichtert.

Wie verhält sich also eine statische Seite und wie sieht die Benutzeroberfläche aus?

Meine erste Antwort wäre "keine" und "keine".

Jon Strayer
quelle
also keine tests für statische seiten?
Matteo Pagliazzi
Bei TDD geht es zu einem gewissen Grad um Design. Aber Sie brauchen noch eine Architektur. Ohne eine Architektur ist es schwer vorstellbar, wie man aus einer Reihe von Tests organisch wachsen würde.
Robert Harvey
@ MatteoPagliazzi Abhängig von der Teststufe (Unit-Tests / Integrationstests / usw.) sind möglicherweise eine oder zwei, um zu bestätigen, dass auf die statischen Seiten zugegriffen werden kann. Aber das ist zu hoch für Unit-Tests.
Izkata
1
@RobertHarvey Ich habe nicht gesagt, nichts zu testen. Ich sagte, teste keine statischen Seiten.
Jon Strayer
@ JonStrayer: TDD'er neigen dazu, TDD als magisches Elixier für das Design zu betrachten. Ich entschuldige mich, wenn Sie das nicht gemeint haben. :)
Robert Harvey
32

Es ist immer eine Kosten-Nutzen-Analyse. Was kostet es, dass das Feature für Sie kaputt geht? Wenn die Kosten hoch sind, dann testen Sie gut und gründlich. Wenn die Kosten niedrig sind, testen Sie leicht oder gar nicht.

Es sind auch die Kosten für die Markteinführung zu berücksichtigen. Vielleicht ist es besser für Sie, ein größtenteils funktionierendes Feature zu liefern, als zu spät ein vollständig funktionierendes Feature zu liefern.

Es ist fast unmöglich, diese Fragen in der allgemeinen IMO zu beantworten.

Ich denke, es ist wichtiger, die Fähigkeit zum Testen beizubehalten, wenn sich herausstellt, dass einige Funktionen wichtiger sind als Sie ursprünglich gedacht hatten.

Doug T.
quelle
Außerdem würde ich annehmen, dass Fehler in einer statischen Seite VIEL einfacher zu beheben sind als logische Fehler, Designfehler und die Art der Dinge, die TDD normalerweise verhindert. Das Erkennen und Beheben von Fehlern bei statischen Seiten ist wahrscheinlich recht einfach, und ich habe den Eindruck, dass TDD verwendet wird, um diese beiden Prozesse zu verkürzen, wenn sie länger dauern als gewünscht. : D
Gordon Gustafson
Das würde ich nicht annehmen. Wenn Sie jemals mit obskuren Verhaltensweisen der Browserversion oder merkwürdigen Problemen mit dem Javascript-Speicher zu tun hatten, haben Sie wahrscheinlich ein ziemliches Workout. Manchmal sind Back-End-Sprachen etwas zuverlässiger und standardisierter. manchmal. Vielleicht redest du über statische wie in HTML und kein Javascript.
Michael Durrant
8

Ich würde Ja sagen". Wenn Sie Tests haben, die selbst die einfachsten Funktionen und den einfachsten Code abdecken, können Sie sicher sein, dass das Hinzufügen von neuem Code nicht dazu führt, dass der vorhandene Code nicht mehr funktioniert. In ähnlicher Weise verhindert das Einspielen eines Tests für jeden Fehler, auf den Sie stoßen, dass sich Regressionen wieder einschleichen.

Bruce Ediger
quelle
"Dann können Sie sicher sein, dass das Hinzufügen von neuem Code nicht dazu führt, dass der vorhandene Code nicht mehr funktioniert." Auf diese Weise sollte ich keinen zuvor geschriebenen Code anfassen und einfach neue Methoden hinzufügen.
Matteo Pagliazzi
Nun, nein. Unvorhergesehene und ungeplante Abhängigkeiten zwischen Code, die derzeit "funktionieren", können jedoch zu Problemen führen, wenn Sie neuen Code hinzufügen, der diese Abhängigkeiten ändert. Wenn Sie den Test falsch verstehen, was meiner Meinung nach ziemlich häufig vorkommt, müssen Sie den Test selbst und dann möglicherweise den Code ändern, der sich aus diesem Test ergibt.
Bruce Ediger
@ Andy Das ist absoluter Quatsch. Das Testen von Property Setters und Gettern ist sowohl trivial als auch VITAL. Wenn sie nicht funktionieren, fällt im Allgemeinen die ganze Klasse auseinander. Wenn beispielsweise in einer Multithread-Anwendung der Satz nicht verhindert, dass gleichzeitig Daten abgerufen werden, tritt ein fehlerhaftes Datenproblem auf, dessen Beseitigung Stunden in Anspruch nehmen kann, da die Datenquelle korrekt ist, das Ergebnis jedoch abgerufen wird wird nicht Oder wenn Ihr Gerät auch die Aktualisierungszeit nicht aktualisiert, können Ihre Daten möglicherweise nicht mehr synchronisiert werden. Sie haben die Idee. Wenn Setter und Getter wirklich trivial
wären
@deworde Ich befürchte, dass es nicht allzu häufig ist, Instanzmitglieder sicher zu machen. Es ist üblicher, den Zugriff auf den nicht Thead-sicheren Typ zu steuern, als zu versuchen, sie threadsicher zu machen. Was zu testen ist, ist auf jeden Fall eine Kosten-Nutzen-Sache, wie eine andere Antwort besagt. Sie können Zeit damit verbringen, Tests für Getter oder Setter zu schreiben, oder Sie können das tatsächliche Verhalten testen, das Ihr System verkapseln soll.
Andy
3

Ja, du solltest alles testen ...

Sie werden nicht unbedingt in der Lage sein, automatisierte Tests für alles zu schreiben. Verwenden Sie für Ihre statischen Seiten Selenium http://seleniumhq.org/, um sicherzustellen, dass die Dinge korrekt sind.

Aus meiner Erfahrung ist es so gut wie unmöglich, Testfälle für einige Front-End-Dinge zu schreiben, aber aus diesem Grund möchten Sie den Mark 1-Augapfel tatsächlich testen.

Schleis
quelle
Ich stimme dir nicht zu. Wenn Sie es weder über einen Schein noch über die Weitergabe von Daten schaffen können, warum sollten Sie es dann in Ihrem Code haben? Getter und Setter benötigen keine eigenen Tests, die über andere Komponententests des Systems zur Überprüfung der erwarteten Funktionalität getestet werden.
Schleis
Sicher, Setter / Getter werden indirekt mit anderen Tests getestet, aber wenn jemand "alles testen" sagt, dann meine er damit Tests speziell für diese Art von Dingen. Ich sage den Leuten immer, "teste die wichtigen Dinge". Dinge wie Setter und Getter passen für mich nicht in diese Definition.
Andy
2

Testen ist so wichtig wie Codieren. Sie müssen das Sprichwort "Wenn etwas schief gehen kann, wird es" gehört haben. INMO: Unter den zahlreichen Techniken des Software-Engineerings, die zur Verbesserung der Qualität eingesetzt werden, ist das Testen die wertvollste Methode, um Probleme frühzeitig zu erkennen.

Das Testen ist zwar nicht alles möglich (insbesondere bei kleinen Teams und großen Systemen), bedeutet jedoch nicht, dass Sie das Testen insgesamt überspringen. Lohnt es sich zu testen? Siehe Abschnitt "Frühzeitig Fehler finden" in See Wiki-SoftwareTesting .

Keine Chance
quelle
2

TDD-Tests können auch gelebte Spezifikationen sein, wenn sie so geschrieben sind. Die Namen der Testmethoden sollten für einen Geschäftsbenutzer sinnvoll sein.

Chriseyre2000
quelle
2

Wie andere bereits erwähnt haben, ist das Testen in Ruby on Rails weitaus wichtiger als in (den meisten) anderen Sprachen. Dies ist auf das Fehlen eines Compilers zurückzuführen.

Sprachen wie Delphi , C ++, VB.NET usw. sind kompilierte Sprachen, und Ihr Compiler erkennt viele Fehler wie Tippfehler in Aufrufen einer Methode. In Ruby on Rails wissen Sie nur, ob in Ihrem Code ein Tippfehler oder ein Fehler vorliegt, wenn diese bestimmte Codezeile ausgeführt wird oder Sie eine IDE verwenden, die visuelle Warnungen anzeigt.

Da JEDE einzelne Codezeile wichtig ist (sonst wäre sie nicht vorhanden), sollten Sie jede Methode testen, die Sie schreiben. Dies ist viel einfacher, als es sich anhört, wenn Sie einige grundlegende TBDD-Tools befolgen.

Ich fand, dass Ryan Bates ' Rails Cast on, wie ich teste, für mich von unschätzbarem Wert war und die Einfachheit von TBDD wirklich hervorhob, wenn es richtig gemacht wurde.

jamesc
quelle
1

Wenn Sie wirklich die TDD-Methodik verwenden, schreiben Sie keinen Code, ohne zuerst einen Unit-Test durchzuführen, den Sie bestehen möchten.

wessiyad
quelle
2
ja ... aber zum Beispiel auf einer statischen Seite, was soll ich testen? die Existenz davon? dass die Inhalte und Links existieren? Vielleicht irre ich mich, aber es scheint eine Zeitverschwendung ...
Matteo Pagliazzi
1
Ich bin der Meinung, dass die TDD-Methodik auf Ihre Logik angewendet wird. Ist Ihre statische Seite eine HTML-Datei? Eine MVC-Ansicht, die sich nie ändert? In letzterem Fall könnten Sie vermutlich testen, ob Ihr Controller die richtige Ansicht zurückgibt. Ich denke, das Wichtigste ist, sich daran zu erinnern, dass TDD Ihnen helfen sollte, sich gegen Ihre Spezifikation zu entwickeln, nicht nur "Test" ...
wessiyad
Ich gehe davon aus, dass Sie einfach eine statische Seite mit einer Komponente des Frameworks bereitstellen. Wenn keine Ihrer Methoden diese Seite berührt, gibt es tatsächlich nichts zu testen. Sie müssen Rails auch nicht testen. Ich denke, jemand hat das abgedeckt.
Erik Reppen
0

Ich würde sagen, nicht mit TDD zu beginnen. Treffen Sie eine fundierte Entscheidung, wenn Sie mehr Zeit mit dem Erlernen von Architekturstrategien im Allgemeinen verbracht haben. TDD lässt Sie diese Hausaufgaben nicht überspringen, obwohl Sie vielleicht glauben, dass dies der Fall ist.

Hier ist mein Problem damit. Wenn Sie sagen, es scheint eine Menge Zeit für Dinge zu verschwenden, die TDD niemals kaputt machen. Wenn Sie darauf hinweisen, dass es unmöglich ist, solche Dinge vorherzusagen, bevor Sie Ihre App schreiben, wird Ihnen gesagt, dass es mehr um Design geht und nicht um Testen, obwohl das Testen praktisch ist.

Aber sind riesige Ketten unvorhersehbarer Abhängigkeiten nicht das Produkt beschissenen Designs?

Also was ist es?

Hier ist ein Gedanke. Lassen Sie uns nicht erst riesige komplexe Abhängigkeitsketten haben, wenn Sie die folgenden zwei Prinzipien des objektorientierten Entwurfs aus Entwurfsmustern betrachten:

"Programm auf eine Schnittstelle, keine Implementierung"

Das heißt, Ihren Objekten sollte es egal sein, wer den Aufruf ausführt oder wie sie erstellt wurden. Nur, dass die richtigen Argumente eingegeben wurden und dass die Methoden, die sie von anderen Objekten aufrufen, erwartungsgemäß funktionieren. Ihre Abhängigkeitskette sollte sich in den meisten Fällen an einem Verknüpfungspunkt befinden, dem Methodenaufruf des Aufrufers und der Stelle, an der die Argumente in Ihre Methoden eingefügt werden. Hier melden Sie sich an, validieren und senden nützliche Meldungen zum Debuggen, wenn die Dinge schief gehen.

Und:

"Bevorzugen Sie die Objektzusammensetzung gegenüber der Klassenvererbung"

Wer ist der Dummy? Der Typ, der einer Klasse in einem verworrenen, kaskadierenden Vererbungsschema etwas angetan hat, das etwa 30 Klassen umfasst, die zu einem Bruch der Randbedingungen führen, oder der Entwickler, der sich diese Architektur überhaupt ausgedacht hat? TDD könnte Ihnen helfen, Probleme in diesem schiefen Turm der Klasse Pisa früher zu lösen, als Sie es ohne hätten tun können, aber macht es das weniger schmerzhaft, wenn Sie das nächste Mal versuchen, einen der Endpunkte dieser Code-Katastrophe zu ändern?

Und hier komme ich zu dem, was mich nervt. Hilft TDD wirklich beim Entwerfen oder ermöglicht es eine schlechte Architektur? Es scheint mir, dass es Potenzial hat, eine sich selbst erfüllende Strategie zu sein. Je weniger Ihr Team für schlechte Architektur verantwortlich sein muss, desto hilfreicher scheinen diese detaillierten Testkomponenten zu werden, aber letztendlich wird Ihre App zu einem immer größeren PITA, mit dem es zu arbeiten gilt (vorausgesetzt, sie haben in der ersten Phase nicht viel über Architektur nachgedacht Ort). Und die Konsequenzen nicht zu erkennen, ist zweifellos der teuerste Fehler, den Sie machen können, wenn Sie an einer Anwendung arbeiten, die im Laufe der Zeit aktualisiert und geändert werden soll.

Erik Reppen
quelle
-1

Um die Frage zu beantworten, überlegen Sie, was hier schief gehen könnte. Insbesondere, wenn Sie den "Code" (Markup / was auch immer) ändern, wie können Sie sicher sein, dass Sie die Seite nicht beschädigt haben. Nun, für eine statische Seite:

  • es wird möglicherweise nicht gerendert
  • es könnte falsch gerendert werden
  • Der JS wird möglicherweise nicht geladen
  • Die Pfade für Bilder funktionieren möglicherweise nicht
  • Die Links sind möglicherweise defekt

Persönlich würde ich empfehlen:

  • Schreiben Sie einen Selentest [1], der nach einer Zeichenfolge sucht, die Sie auf der Seite erwarten (wenn möglich in der Nähe des unteren Randes). Dies bestätigt, dass es rendert.
  • Überprüfen Sie, ob es keine JS-Fehler gibt (ich denke, Selen erlaubt dies).
  • Führen Sie die statischen Seiten durch einen HTML-Validator und, falls möglich, einen Link-Checker.
  • Ich habe kein Tool gefunden, mit dem ich JS validieren kann, aber Sie könnten Erfolg mit jslint oder jshint haben.

Der Vorteil ist, dass Sie etwas möchten, das wiederholbar und einfach zu verwenden ist und automatisch in Ihrem Testläufer ausgeführt wird.

Paul Biggar
quelle
-1

Um all die bereits hervorragenden Antworten zu ergänzen, denke ich darüber nach, was zu testen ist und was nicht:

Testen Sie:

  • Geschäftslogik
  • Anwendungslogik
  • Funktionalität
  • Verhalten,
  • also wirklich alles, außer :

Testen Sie nicht:

  • Konstanten
  • Präsentation

Es macht also keinen Sinn, einen Test zu haben, der besagt:

assert wibble = 3

und ein Code, der sagt

wibble = 3

Und es macht auch keinen Sinn, Präsentationssachen zu testen, z. B. ob das Symbol perywinkle blau ist, welche Schriftart Sie für Überschriften verwendet haben usw.

Sie fragen also, "ob ich statische Seiten testen soll", und die Antwort lautet: Sie testen sie, sofern sie Teil der Funktionalität, Geschäftslogik oder des Verhaltens Ihrer Site sind.

Daher haben wir in unserer App einen Test, der prüft, ob die allgemeinen Geschäftsbedingungen in jedem Bereich der Website verfügbar sind - für anonyme Benutzer, für angemeldete Benutzer, über das Dashboard, in App-Bildschirmen usw. Es wird nur überprüft, ob sie verfügbar sind Ein Link namens "Allgemeine Geschäftsbedingungen" auf jeder Seite, über den der Link funktioniert, und der Test besagt, dass beim Eintreffen auf der Seite die allgemeinen Geschäftsbedingungen "angezeigt" werden - gerade genug, um sich zu vergewissern, dass es sich um die richtige Seite handelt. ohne "Konstante testen" oder "Präsentation testen" ... damit Sie überprüfen können, ob der Text z. B. korrekt ist, ohne die jeweilige Schriftgröße oder das Textlayout zu überprüfen ...

hwjp
quelle