Schreiben "unit-testbaren" code?
Welche Art von Praktiken die Sie benutzen, um Ihren code für mehrere unit-Test-freundlich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Welche Art von Praktiken die Sie benutzen, um Ihren code für mehrere unit-Test-freundlich?
Du musst angemeldet sein, um einen Kommentar abzugeben.
TDD -- schreiben die ersten tests, Kräfte
Sie denken über die Testbarkeit und
hilft schreiben Sie den code, dass ist eigentlich
gebraucht, nicht was Sie denken, Sie können
müssen
Umgestaltung der Schnittstellen zu -- macht
die Verspottung einfacher
Öffentlichen virtuelle Methoden, wenn nicht mit
Schnittstellen-macht die Verspottung einfacher
Dependency injection -- macht mocking
einfacher
Kleinere, mehr gezielte Methoden --
tests sind mehr konzentriert, leichter
schreiben
Vermeidung von statischen Klassen
Singletons vermeiden, außer dort, wo
notwendig
Vermeiden versiegelte Klassen
Dependency injection scheint zu helfen.
Schreiben die ersten tests - so die tests fahren Sie mit Ihrem design.
Sicherstellen, dass alle Ihre Klassen Folgen Sie den Prinzip Der Einzigen Verantwortung. Einzelne Verantwortung bedeutet, dass jede Klasse sollte eine und nur eine Verantwortung. Das macht unit-Tests viel einfacher.
Beim schreiben von tests (wie mit jeder anderen software-task) Don ' T Repeat Yourself (DRY-Prinzip). Wenn Sie test-Daten, die nützlich für mehr als einen test, dann legen Sie es irgendwo, wo beide tests verwenden können. Nicht kopieren Sie den code in beiden tests. Ich weiß, dies scheint offensichtlich, aber ich sehe, es passieren die ganze Zeit.
Der einfachste Weg ist nicht überprüfen Sie in Ihrem code, es sei denn, Sie prüfen in tests mit ihm.
Ich bin kein großer fan von schreiben des ersten tests. Aber eine Sache, die ich glaube sehr stark ist, der code muss geprüft werden, in mit tests. Nicht einmal eine Stunde oder so vor, togther. Ich denke, die Reihenfolge, in der Sie geschrieben werden, ist weniger wichtig, so lange wie Sie kommen zusammen.
Kleinen, hoch kohäsive Methoden. Ich Lerne es auf die harte Weise. Stellen Sie sich vor Sie haben eine öffentliche Methode, mit der Authentifizierung. Vielleicht hast du TDD, aber wenn die Methode wird groß, es wird schwer sein, zu Debuggen. Stattdessen, wenn Sie, dass #authenticate-Methode keine Sachen in einem mehr pseudo-codish Art und Weise, fordern andere kleine Methoden (vielleicht geschützt), wenn ein Fehler auftaucht, ist es einfach zu schreiben, neue tests für diese kleinen Methoden und finden Sie die fehlerhafte ein.
Ist und etwas, das Sie lernen, das erste, was in OOP, aber so viele scheint zu vergessen: Code Gegen Schnittstellen, Nicht Implementierungen.
interface
Schlüsselwort eine Menge", dann Nein, das ist nicht so sinnvoll. Wenn er meint, "behandeln Sie andere Objekte als black boxes zu akzeptieren, dass einen vordefinierten Satz von Nachrichten", dann ja, das ist hilfreichVerbringen Sie einige Zeit die Umgestaltung untestable code, damit es getestet werden. Schreiben Sie die tests und 95% Abdeckung. Tun, die mich gelehrt, alles, was ich brauche, um zu wissen, über das schreiben von testbarem code. Ich bin nicht gegen TDD, aber das lernen die Besonderheiten von dem, was macht code testbar oder nicht testbar hilft Sie denken über die Testbarkeit zur design-Zeit.
Schreiben Sie nicht untestable code
Ich bin sicher, ich werde nach unten für diese gestimmt, aber ich Stimme der Meinung sowieso 🙂
Während viele der hier genannten Vorschläge gut gewesen, ich denke, es muss getempert werden, ein bisschen. Das Ziel ist es, mehr zu schreiben, robuste software, die änderbar und wartbar.
Das Ziel ist nicht, code, unit-testbar. Es gibt eine Menge Mühe in die Herstellung code mehr "getestet", trotz der Tatsache, dass testbaren code ist nicht das Ziel. Es klingt wirklich schön und ich bin sicher, es gibt Menschen die warmen fuzzy, aber die Wahrheit ist, dass all diese Techniken, frameworks, tests, etc, kommen zu einem Preis.
Kosten Sie Zeit in der Ausbildung, Wartung, Produktivität, Aufwand, etc. Manchmal lohnt es, manchmal nicht, aber Sie sollten nie setzen Sie die Scheuklappen auf und berechnen Sie voran mit Ihren code-mehr "getestet".
Ich die Verwendung von Test-Driven Development, Wann immer möglich, so dass ich nicht haben alle code nicht unit-getestet. Es würde nicht existieren, es sei denn, die unit-test gab erste.
Check-up dieser Vortrag Automatisiertes Testen von Mustern und Riecht.
Eine der wichtigsten take-aways für mich war um sicherzustellen, dass der UnitTest code ist in hoher Qualität. Wenn der code gut dokumentiert und gut geschrieben ist, wird jeder motiviert zu halten, bis.
Keine Statik - können Sie nicht verspotten heraus Statik.
Auch google hat ein Werkzeug, dass die Messung der Testbarkeit des Codes...
Bin ich immer versucht zu finden, ein Prozess, in dem unit-Test-ist weniger eine lästige Pflicht und etwas, das ich eigentlich tun MÖCHTE. Meiner Erfahrung nach, ein ziemlich großer Faktor ist Ihr Werkzeug. Ich habe eine Menge von ActionScript arbeiten und leider sind die Extras sind etwas beschränkt, wie keine IDE-integration und der Mangel an fortgeschrittenen mocking frameworks (aber guten-Dinge-sind-ein-kommen, also keine Beschwerden hier!). Ich habe getan, test driven development, bevor Sie mit mehr Reife testing-frameworks und es war auf jeden Fall ein mehr angenehme Erfahrung, aber fühlte sich immer noch wie etwas von einer Pflichtübung.
Vor kurzem jedoch begann ich das schreiben von code in einer anderen Art und Weise. Ich verwendet, um zu beginnen mit dem schreiben des Tests, die Beobachtung einen Fehler haben, code zu schreiben, um den test erfolgreich ist, Spülen Sie und wiederholen Sie und alle, die.
Nun aber beginne ich mit dem schreiben von Schnittstellen, fast egal, was ich tun werde. Zuerst habe ich natürlich versuchen, das problem zu identifizieren und denken Sie an eine Lösung. Dann habe ich mit dem schreiben beginnen die Schnittstellen zu bekommen, eine Art abstrakte Gefühl für den code und die Kommunikation. An diesem Punkt, ich in der Regel bewusst, dass ich noch nicht wirklich herausgefunden, eine richtige Lösung für das problem als Ergebnis von mir nicht vollständig das problem zu verstehen. Also gehe ich zurück, überarbeiten Sie die Lösung und revidiere meine Schnittstellen. Wenn ich das Gefühl, dass die Schnittstellen unbedingt meine Lösung, ich beginne tatsächlich mit dem schreiben der Umsetzung, nicht die tests. Wenn ich etwas umgesetzt (Entwurf implementationd, in der Regel kleine Schritte), ich fange an es zu testen. Ich immer weiter nach hinten zwischen Prüfung und Umsetzung, ein paar Schritte zu einem Zeitpunkt. Da habe ich Schnittstellen für alles, es ist unglaublich einfach zu injizieren verspottet.
Finde ich arbeiten wie diese, mit Klassen mit sehr wenig wissen über andere Umsetzung und sprechen nur auf die Oberfläche, ist äußerst befreiend. Es befreit mich von Gedanken über die Umsetzung einer anderen Klasse und ich kann den Fokus auf die aktuelle Einheit. Alles was ich wissen muss ist der Vertrag, der die Schnittstelle bereitstellt.
Aber ja, ich bin immer noch versuchen zu arbeiten, ein Prozess, der funktioniert super-traumhaft-schrecklich-gut, jeder Zeit.
Oh, ich wollte auch noch hinzufügen, dass ich nicht mit dem schreiben von tests für alles. Vanille-Eigenschaften, die nicht viel tun, aber die get/set-Variablen sind nutzlos zu testen. Sie sind garuanteed durch die Sprache Vertrages zu arbeiten. Wenn Sie nicht ich habe viel schlimmere Probleme als meine Einheiten nicht überprüfbar.
Zum vorbereiten der code testbar sein:
, Um das beste aus Ihrer unit-tests ist Folgendes zu berücksichtigen:
Müssen Sie nicht unbedingt "machen Sie Ihren code mehr unit-Test-freundlich".
Statt, ein mocking-toolkit kann benutzt werden, um die Testbarkeit betrifft Weg.
Ein solches toolkit ist JMockit.