Testen
-
Hi
ich bin der Meinung dass ich sehr ineffizient arbeite. Da ich bis jetzt aber fast ausschließlich allein programmiert habe, fehlt mir ein Vergleich wie andere das so machen. Deswegen frage ich hier.
Also es geht darum, wie oft man als Programmierer das eigene Programm testet.
Ich mach das eigentlich ständig. Meistens schon wenn etwa 2 Zeilen geändert wurden. Dann wird kompiliert und gleich laufen gelassen.
Ich schätze, dass ich auf die Art etwa 40% der gesamten Entwicklungszeit vertrödelt hab. Blöderweise arbeite ich an einem Rennspiel, da verliert man sich besonders leicht ins Testen.Wie ist das bei Euch so? Wie viel Code schreibt/ändert Ihr, bevor Ihr das Programm mal laufen lasst um zu gucken ob es tut wie es soll?
-
Böse Gegenfrage: was verstehst Du unter "Testen"? Einfach starten, laufen lassen und nachsehen? Oder machst Du das systematisch?
Denn normalerweise ist es durchaus gut, so früh wie möglich zu testen. Je später - im "Idealfall" beim Kunden - desto größer die Auswirkungen/Kosten. Aber ein Programm zwischendurch einfach mal starten zählt noch nicht als Test.

Also: was und wie testest Du?
-
du kannst auch testcases machen. also ein programm, dass prüft, ob deine neue funktion das richtiger ergebnis liefert. bei ui sachen ist das natürlich schwieriger
-
Mach einfach automatische Tests (zB Unit-Tests). Die kannst du dann nach jeder Änderung durchlaufen lassen oder zB jede Nacht einmal ausführen lassen (oder nach jedem commit). Unsystematisch das Programm starten, bringt vermutlich nichts.
-
Eigentlich ist immer das testen was man gerade gemacht hat garnicht so schlecht, wenn man alleine entwickelt und an seinem alten zuegs nicht rumpfuscht.
-
Ja, mit "Test" meine ich nur mal kurz laufen lassen.
Kostet mich aber trotzdem viel Zeit. Wenn ich beispielsweise testen möchte, ob es richtig erkannt wird wenn Autos über die Ziellinie fahren. Dann muss ich ein paar Runden drehen, eventuell was am Code verbessern und dann gleich nochmal laufen lassen.
Und wie ich das automatisieren könnte kann ich mir überhaupt nicht vorstellen. Es handelt sich ja wie gesagt um ein Spiel. Habe mich mit dem Thema auch noch so gut wie garnicht auseinandergesetzt.Gut, die einzige Lösung wird sein dass ich mich zusammenreiße und einfach weniger oft starte.
-
unreg0x2A schrieb:
Ja, mit "Test" meine ich nur mal kurz laufen lassen.
Kostet mich aber trotzdem viel Zeit. Wenn ich beispielsweise testen möchte, ob es richtig erkannt wird wenn Autos über die Ziellinie fahren. Dann muss ich ein paar Runden drehen, eventuell was am Code verbessern und dann gleich nochmal laufen lassen.
Und wie ich das automatisieren könnte kann ich mir überhaupt nicht vorstellen. Es handelt sich ja wie gesagt um ein Spiel. Habe mich mit dem Thema auch noch so gut wie garnicht auseinandergesetzt.Gut, die einzige Lösung wird sein dass ich mich zusammenreiße und einfach weniger oft starte.
bool testeZiellinienErkennung() { setzeAutokurzVorsZiel(); setzeAutogeschwindigkeit(); berechneSoVieleFramesWieManMitGeschwindigkeitBrauchtUmUebersZielZuFahren(); if (auto.istUeberZiellinie()) { cout << "HURRA, FUNKTIONIERT!"; return true; } else { cout << "IRGENDWAS FUNKTIONIERT NOCH NICHT :( "; return false; } }Du musst versuchen, deine Tests zu automatisieren, so dass du nicht mehr von Hand testen brauchst.
Testen ist naemlich sehr, sehr wichtig. Deine Programme werden sicher nicht besser, wenn du weniger testest, im Gegenteil. Aber du musst eben effizient testen 
-
unreg0x2A schrieb:
Wenn ich beispielsweise testen möchte, ob es richtig erkannt wird wenn Autos über die Ziellinie fahren. Dann muss ich ein paar Runden drehen, eventuell was am Code verbessern und dann gleich nochmal laufen lassen.
Erscheint mir außerordentlich unlogisch, das auf diese Weise zu testen. Schließlich liegen alle Informationen diskret vor.
Folglich kannst Du einige Runden drehen, und kurz vor der Ziellinie speicherst Du den kompletten Inhalt aller Variablen als Snapshot. Diesen kannst Du mehrfach wieder aufrufen, und damit einspielen. Natürlich nicht zu kurz vorher - sonst wäre es immer identisch. Aber damit kann man schon mal anfangen, die Zeit zu verkürzen.
Weiterhin - irgendwo hast Du ja einige Funktionen, die den Test für die Ziellinie durchführen. Wozu mußt Du aber das Spiel spielen? Die Funktion bekommt ja irgendwelche Daten (Koordinaten von Autos? Irgendwas in der Art...) geliefert und legt das dann fest. Du kannst doch diese Information zufällig erzeugen, in die Funktion reingeben, und siehst ob sie funktioniert. Usw.
Das ist jetzt noch nicht so streng wie die hier vorgeschlagenen Unit-Tests, die natürlich perfekt wären, aber ich verstehe auch, daß dies bei so einem Projekt wie von Dir beschrieben - ganz einfach gesagt - langweilig wäre. Der Spaßeffekt spielt bei der Programmierung eines Rennspiels schon eine Rolle, daher würde ich das nicht so extrem auslegen wollen.
Aber solche Abkürzungen wie oben beschrieben bringen Dich doch schneller weiter.
-
Danke für Eure Antworten.
Eure Vorschläge haben mich auf ein paar Ideen gebracht wie ich das automatisieren könnte. Ich hab ja schon eine Replay Funktion die ein Rennen anhand von aufgezeichneten Benutzereingaben abspielen lässt. Das könnte ich dafür misbrauchen.
Allerdings ist es in meinem Fall wohl so, dass ich trotzdem viele Sachen von Hand testen muss. Beispielsweise, ob die ganzen Partikel, die bei einer Explosion erzeugt werden, auch so fliegen dass es nach Explosion aussieht. Das kann nur ein Mensch beurteilen.
Den Zustand des Programms kann ich nicht so einfach speichern. Das ist ziemlich komplex und es hängt noch eine Physik Engine mit drin. Also das wäre ein Riesenaufwand, es sei denn es gibt Tools die das automatisch können. Das Programm ist eben leider nicht darauf ausgelegt um leicht Tests ausführen zu können, sondern es soll das tun für was es geschrieben wurde.Die meiste Zeit verschwende ich aber ehrlich gesagt eh nicht mit Tests die unbedingt sein müssen. Die Fahrphysik ist mir ganz gut gelungen, und da testet man manchmal ohne dass man es merkt

-
Um Snapshots zu erstellen, kannst du dir ja mal das Memento-Design-Pattern angucken.
-
unreg schrieb:
Den Zustand des Programms kann ich nicht so einfach speichern. Das ist ziemlich komplex und es hängt noch eine Physik Engine mit drin.
Das wundert mich ehrlich gesagt ein wenig.
Jedes Objekt in Deinem Rennen sollte sich durch eine handvoll Parameter beschreiben lassen (Ort, Geschwindigkeit, Beschleunigung, das in 3D, sowie noch aktuellen Zustand). Man kann doch jeder Klasse eine Funktion verpassen, die das speichern und laden kann - damit lässt sich der Gesamtzustand doch als Snapshot ablegen.
Gerade bei einer Physikengine lassen sich doch alle Elemente durch einen Zustandsvektor abbilden, das ist doch gerade ideal für eine Speicherung.