Wie programmieren Sie effektiv, wenn es lange dauert, Ihren Code einfach zu testen?

16

Mein Workflow bestand immer darin, einen logischen Schritt zu schreiben, dann das Programm auszuführen und die Ausgabe zu überprüfen. Dieser Prozess hat mir bei Einsätzen an der Universität unglaublich gute Dienste geleistet. Wenn ich mich jedoch weiter entwickle, kann es vorkommen, dass das einfache Kompilieren und Ausführen des Codes 1 bis 2 Minuten dauert. Beispiele hierfür sind das Hochladen eines Programms auf einen Mikrocontroller, die Interaktion mit einem externen Server und die Nichtimplementierung der Automatisierung aufgrund von Authentifizierung, Softwarearchitektur oder Komplexität.

Diese Art von Aufgaben ist sehr ungeeignet für das, was ich normalerweise programmiere, und ich habe Schwierigkeiten, effektiv zu programmieren. Normalerweise mache ich viele Syntax- und Logikfehler, von denen ich die meisten leicht durch Testen fange. Bei solch einer langen Wartezeit ist diese Methode jedoch zu zeitaufwändig.

Anne Nonimus
quelle
Verwenden Sie eine IDE?
Woot4Moo
3
Ihr Root-Problem ist nicht in der Lage, effektiv zu programmieren. Es sind Tests, deren Ausführung zu lange dauert. Sie stellen die falsche Frage.
Rein Henrichs
Verwenden Sie eine Sprache mit einem REPL.
Robert Harvey
Haben Sie Kollegen, die Sie fragen und von denen Sie lernen können?
user985366

Antworten:

25

Zunächst einmal ist jede Art von interaktivem Debugging großartig. Sie wollen das in Ihrem Toolkit, denn wenn noch nicht, dann werden Sie eines Tages wirklich davon profitieren. (Details variieren je nach Sprache, Plattform und IDE.)

Erfordert die Interaktion mit einem externen Server und kann aufgrund von Authentifizierung, Softwarearchitektur oder Komplexität keine Automatisierung implementieren.

Ich würde einige Frameworks für die Verwendung von Scheinobjekten untersuchen . Mit diesen können Sie die zu testende Komponente mit einem gefälschten Ökosystem anderer Komponenten umgeben, sodass Ihre Tests gezielter sind und Sie vermeiden können, alles als Ganzes zu testen.

Darüber hinaus können die Scheinobjekte selbst mit Assertions programmiert werden, sodass Sie überprüfen können, ob die zu testende Komponente tatsächlich einen bestimmten Aufruf getätigt hat.

Darien
quelle
12

Ich würde hart arbeiten, um die Testzeit zu verkürzen. Ich hatte in einigen Unternehmen an der Entwicklung von Embedded Code gearbeitet, und das Testen war mühsam. Dazu mussten Sie in den Serverraum gehen und manuelle FTPs und Neustarts sowie mehrere Befehle an die Testhardware senden. Dann schloss ich mich einer wirklich guten Gruppe an, in der ich einfach 'make test' an meinem Schreibtisch eingeben und die Ergebnisse in weniger als einer Minute erhalten konnte. In dieser einen Minute:

  • Mein Code wurde in ein neues Kernel-Image für eingebettete Hardware eingebaut.
  • Der DHCP-Server wurde aktualisiert, um auf den neuen Kernel zu verweisen.
  • Das Testboard wurde neu gestartet.
  • Das Testboard hat den Kernel über einen NFS-Mount von meiner Workstation abgerufen.
  • Das Testboard wurde mit dem neuen Kernel neu gestartet.
  • Die Unit-Tests wurden durchgeführt.
  • Die Unit-Test-Ausgabe wurde an meine Workstation zurückgesendet.

Es hat einige Zeit gedauert, bis all dies funktioniert hat, aber der Aufwand, all diese Schritte zu automatisieren, hat sich mit dem Anwachsen des Entwicklerteams hundertfach amortisiert.

Kevin Cline
quelle
2
+1. Es gibt kein Problem, das mit einer ausreichenden Anzahl von Shell-Skripten nicht gelöst werden kann.
Tom Anderson
1
Ich werde nicht in Teams bleiben, denen es nicht wichtig ist, die Geschwindigkeit zu verbessern.
Kevin Cline
@ Tom Mit Ausnahme zu vieler Abstimmungsstufen, Shell-Skripte;)
Darien
Nein, Sie schreiben einfach ein Shell-Skript, das das andere Shell-Skript umschließt. Dann gibt es nur noch dieses eine Shell-Skript. VERTRAUEN SIE MIR.
Tom Anderson
3
+1: Das Verbessern der Geschwindigkeit von Bearbeiten -> Kompilieren -> Laden -> Ausführen -> Debuggen -> Bearbeiten ist das Beste, was Sie tun können, um die Code-Produktion zu beschleunigen. Als ich bei Tymshare arbeitete, hatten wir einen Mann, der behauptete (richtig), dass sein Code beim ersten Versuch 87% der Zeit korrekt lief. Auf der anderen Seite codierte ich, als ob ich um 1 Uhr morgens (was ich war) eine Überdosis Koffein-Affen bekommen hätte. Ich habe eine Menge Tippfehler gemacht, aber ich habe mir keine Sorgen darüber gemacht, weil ich wusste, dass der Compiler sie abfangen würde. Am Ende des Tages war ich wahrscheinlich drei- bis fünfmal produktiver als er.
Peter Rowell
8

Automatisierte Tests ersetzen nicht die Überprüfung und das Verständnis.

Möglicherweise verwenden Sie Tests als Krücke. Wenn Sie dies tun, werden Sie Ihr Lernen behindern. Ich befürworte nicht, dass Sie nicht testen. Stattdessen würde ich Ihnen empfehlen, dass Sie das, was Sie geschrieben haben, überprüfen, bevor Sie den Test ausführen. Verstehe, was du geschrieben hast, stelle sicher, dass es sinnvoll ist und dass die Syntax korrekt aussieht.

dietbuddha
quelle
5

Sie haben bereits die Antwort gegeben: I usually make a lot of syntax errors and logic errors

Wenn Sie hart daran arbeiten, dies zu verbessern, sollten Sie in der Lage sein, die Testzeit zu verkürzen. Die Syntaxfehler sollten die allerersten sein, die Sie reduzieren sollten. Hatten Sie noch nie einen Programmiertest mit Papier und Bleistift in Ihrem Studium?

Ich hatte das Gleiche, als ich von PHP auf Java umgestiegen bin. Ich musste lernen zu debuggen, anstatt nur einige Variablen zu drucken und F5 im Browser zu drücken ...

WarrenFaith
quelle
2
Wir alle machen von Zeit zu Zeit dumme Fehler, sie treten mit der Zeit und Erfahrung nur seltener auf.
maple_shaft
@ Maple_shaft das ist wahr, aber wenn er sagt, make a lot ofes klingt wie er seine Energie investieren sollte, um es zu verbessern
WarrenFaith
3
Ich habe ziemlich viel auf Papier und Whiteboards codiert. Das Problem ist dasselbe: Der Code sieht bei der ersten Überprüfung richtig aus, aber nachdem Sie ihn ausgeführt haben, bemerken Sie Ihre Fehler.
Anne Nonimus
Fehler im Code zu notieren und Code mit falscher Syntax zu schreiben, ist ein großer Unterschied. Das erste kann jedem passieren, das zweite schlägt Anfängerniveau vor. Ich kenne Ihren Hintergrund nicht, aber selbst als Anfänger sollten Sie Syntaxprobleme minimieren. Was ist Ihre IDE und Sprache? Es sollte Syntaxprüfungen unterstützen.
WarrenFaith
@ Anne Nonimus: Meinst du logische Fehler? Syntaxfehler sollten von Ihrer IDE erkannt werden (idealerweise werden diese Syntaxfehler beim Kompilieren nicht erkannt, wenn Sie mit dynamisch generiertem Code arbeiten).
FrustratedWithFormsDesigner
4

Sie benötigen eine gute Unit- oder Functional-Test-Plattform, die automatisch Tests für Sie ausführen kann, vorzugsweise im Hintergrund. Dies erfordert die Verwendung von Mocks, wie oben erwähnt, und abhängig von der Sprache, in der Sie eine Art Abhängigkeitsinjektion verwenden.

Indem Sie Ihre Objekte so unabhängig wie möglich machen und dann mithilfe von Injektionsmethoden äußere Einschränkungen hinzufügen, ist es nicht schwierig, eine Testplattform für Ihren Code zu erstellen.

Bill Leeper
quelle
2

Der wahre Spaß kommt, wenn Sie Ihren Code einfach nur testen können, indem Sie ihn im Zorn verwenden. Dies ist bei Handelssystemen häufig der Fall, da die verfügbaren Börsensimulatoren häufig entweder schlecht oder nicht vorhanden sind oder nicht einmal den Aussagen der Anbieter der Börsensoftware entsprechen. Ich fürchte, dies ist ein Teil des reichen Wandteppichs des Lebens. Mein Ansatz ist es, sicherzustellen, dass zumindest meine Seite der Transaktion gut geschrieben und dokumentiert ist, sodass sie leicht und schnell geändert werden kann.

Neil Butterworth
quelle
3
Sie "tauschen" und "handeln" Software-Ingenieure sind eine einzigartige Rasse. Mein Freund hatte eine Reihe von psychischen Störungen, die für eine solche Firma arbeiteten. Ich höre nie, dass gute Dinge aus dieser Nische der Softwareindustrie kommen.
maple_shaft
@maple Nun, ich mache es nicht mehr selbst. Aber einzigartig? Nein, jeder kann beschissenen Code schreiben, und der meiste Handelscode ist zutiefst beschissen. Wie auch immer, es ist die Basis für unsere Gesellschaft.
Neil Butterworth
Ja, ich habe das Gleiche über Telekommunikationscode gehört und wie viele Millionen Leitungen in der Software zur Vermittlungssteuerung vorhanden waren. Dann trat ich in eine Telekommunikationsfirma ein und stellte fest, dass bei einigen Programmierern Tausende von Leitungen ausgereicht hätten.
Kevin Cline
2

Unit Testing; Scheinanwendungen / Simulatoren.

Dies wird natürlich einige Zeit in Anspruch nehmen, und Sie müssen möglicherweise Beispieldaten sammeln und massieren, um geeignete Modelle zu erstellen. Am Ende macht es sich jedoch bezahlt: Sie sparen sich die Zeit und die Mühe, die Sie beim Testen gegen externe Geräte haben systeme.

Bei korrekter Verwendung stellen diese Tools sicher, dass Sie, bevor Sie sich externen Systemen nähern, zu 99,9% sicher sind, dass ein Fehler im externen System / einer Änderung der Umgebung die Ursache für den Fehler ist und kein Fehler im eigenen Code.

Ich habe eine ganze Weile beruflich gearbeitet, wie Sie es in der Schule getan haben, und in vielen Fällen war es sehr effektiv. Schließlich arbeitete ich unter einigen Leuten, die mich zwangen, diese Methodik aufzugeben und stattdessen Unit-Tests und Mock-ups zu verwenden.

Jetzt starte ich kein Projekt mehr, ohne vorher über die Durchführung der Testphasen nachgedacht zu haben - Unit-Tests, Mock-ups, Simulatoren, Beispieldaten usw.

Vektor
quelle
1

Normalerweise mache ich viele Syntax- und Logikfehler

Vielleicht kann Ihnen ein Linter hier etwas helfen.

Ich befand mich in einer ähnlichen Situation wie mein früherer Arbeitgeber. Unsere Codebasis war wirklich riesig und um Änderungen vornehmen zu können, musste ich die .classDateien auf einem Dev-Server kompilieren, ersetzen und dann den Dev-Server mit einem Restart-Skript neu starten. Und zu meinem Entsetzen wird es ungefähr eine halbe Stunde dauern, bis der Entwickler-Server wieder verfügbar ist.

Später stellte ich fest, dass auch ein Remote-Debugging des Dev-Servers möglich war.

Hier ist, was ich getan habe, um meinen Prozess zu optimieren

  • In der ersten Runde des Debuggens per Fernzugriff konnte ich den genauen Codefluss und die genauen Werte / Zustände von Variablen sehen.

  • Planen, wie und welche Änderungen ich vornehmen werde.

  • Änderungen vornehmen und dann die Unterschiede vergleichen

  • Caching-Fehler durch Verwendung von Linter oder durch Kompilieren.

  • Erteilen des Hotfixes durch Ersetzen der .classDateien und Neustarten.

Manchmal füge ich auch eine Menge Log-Anweisungen hinzu, um den Code-Fluss erneut zu überprüfen und nach Werten / Zuständen zu suchen. Das hat mir sehr geholfen.

Auch die Verwendung einer IDE mit guter automatischer Komplikation kann erheblich zur Reduzierung von Tippfehlern beitragen.

Hoffe das hilft.

Alaf Azam
quelle