Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

21

09.12.2014, 15:17

4173 Assertions? Hast Du da ewig große Loops oder woher kommt diese doch erstaunlich große Zahl an Assertions für so wenige Test-Cases?

Du hattest Recht! Beim Durchschauen des Testcodes ist mir folgender Testcase aufgefallen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TEST_CASE("Dungeon Terrain", "Dungeon") {
    auto terrain = createTerrain();
    core::Dungeon dungeon{terrain, {64u, 64u}};
    
    auto size = dungeon.getMapSize();
    REQUIRE(size.x == 64u);
    REQUIRE(size.y == 64u);

    sf::Vector2u pos;
    for (pos.x = 0u; pos.x < 64u; pos.x++) {
        for (pos.y = 0u; pos.y < 64u; pos.y++) {
            auto tile = terrain[pos.x + 64u * pos.y];
            REQUIRE(dungeon.getTerrain(pos) == tile);
        }
    }
    
    REQUIRE(dungeon.getTerrain({65u, 30u}) == core::Terrain::Void);
}


http://en.wikipedia.org/wiki/Test-driven_development
Mehr gibt's dazu nicht zu sagen.

Stimmt auch wieder :D

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

22

09.12.2014, 15:20

Kleiner Tipp: Wenn Du schon Dimensionen prüfst, nimm verschieden große. Übliche Bugs bei sowas beruhen auf Copy-Paste, sodass x/y dieselben Werte erhalten, obwohl es eigentlich verschiedene sein sollten, weil vergessen wurde etwas nach dem Paste zu ändern. Wenn man mehrere Werte prüft, am besten immer unterschiedliche.

C-/C++-Quelltext

1
2
3
4
5
void setSize(int x, int y)
{
   this->someWeirdStuff()->getSize().x = x;
   this->someWeirdStuff()->getSize().y = x; // copy/paste bug
}

Und glaub mir, Copy/Paste Bugs nehmen eine erstaunlich große Prozentzahl aller Bugs ein. So groß, dass teilweise hier schon gewisse Scrum-Master gedroht haben uns die Paste-Shortcuts zu sperren ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

23

09.12.2014, 15:48

Kleiner Tipp: Wenn Du schon Dimensionen prüfst, nimm verschieden große. Übliche Bugs bei sowas beruhen auf Copy-Paste, sodass x/y dieselben Werte erhalten, obwohl es eigentlich verschiedene sein sollten, weil vergessen wurde etwas nach dem Paste zu ändern. Wenn man mehrere Werte prüft, am besten immer unterschiedliche.

C-/C++-Quelltext

1
2
3
4
5
void setSize(int x, int y)
{
   this->someWeirdStuff()->getSize().x = x;
   this->someWeirdStuff()->getSize().y = x; // copy/paste bug
}

Und glaub mir, Copy/Paste Bugs nehmen eine erstaunlich große Prozentzahl aller Bugs ein. So groß, dass teilweise hier schon gewisse Scrum-Master gedroht haben uns die Paste-Shortcuts zu sperren ;)

Danke 8o Damit hast du natürlich absolut recht - hab es direkt mal mit 64x47 getestet (um auch noch eine nicht-2er-Potenz und darüber hinaus eine ungerade Größe reinzunehmen). Das mit den Copy'n'Paste Fehlern merk ich immer wieder - vor allem wenn ich älteren Code manuell refactory-technisch verarbeite.. entweder bemerkt man alte Copy'n'Paste-Fehler oder baut neue ein :D

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

24

11.12.2014, 01:56

[...]
Eigentlich alles was sehr Thread belastet ist.

Allerdings haben die jeweiligen Threads bestimmte Dinge zu erledigen und diese Teilaufgaben lassen sich in gewissem Maße wiederum automatisiert testen.
Bei den anderen Punkten muss ich zustimmen, dass diese nicht einfach zu testen sind, allerdings wurde das bereits diverse Male erwähnt und unmöglich ist es auch nicht. (Letztendlich dürfte da der Kosten-Nutzen-Faktor relevant sein, wenn es um die Entscheidung der Duchrführung geht.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Tobiking

1x Rätselkönig

  • Private Nachricht senden

25

11.12.2014, 14:14

Grafik / Shader sind schwer zu testen

Wenn du es an der Bildausgabe fest machst, sicherlich. Zwischen Assets laden und Bild darstellen passiert aber sehr viel. Und das ist testbar.

Tests für Shader könnten z.B. prüfen ob der Shadercode fehlerfrei compiliert/gelinkt werden kann, und ob die Zuordnung der Buffer/Uniforms dem entspricht was das Spiel voraussetzt.

Network ist auch schwer.

Warum? Ich schreibe einen Test wo Server und Client erzeugt werden und sende dann ein paar Kommandos und prüfe ob diese korrekt angekommen sind. Das ist zwar per Definition eher ein Integrationstest, aber dadurch nicht komplizierter. Ist vor allem schön für den Fall das man Protokoll oder Übertragungsverfahren wechselt, da der Test weiterhin gilt, solange an beiden Seiten die Kommandoschnittstelle gleich bleibt.

Tobiking

1x Rätselkönig

  • Private Nachricht senden

26

11.12.2014, 20:01


Naja ganz so einfach ist es nicht.
Verbindungsabbrüche, langsame Verbindung, mobile Verbindung, gar keine Verbindung etc.

Gar keine Verbindung ist meist ein ziemlich trivialer Test ;)

Bei den anderen Punkten stimme ich dir zu. Das sind eher Szenarien für spezialisierte Tests, die man bei Bedarf manuell durchführt. Wie ich aber bereits geschrieben habe, kann und muss man ja auch gar nicht alle Aspekte automatisiert testen. Ich würde trotzdem Tests schreiben, die mir zeigen, dass die Netzwerkfunktionalität grundsätzliche funktioniert. Wenn das nicht funktioniert brauche ich gar nicht weiter in die Tiefe analysieren.

4xfusion

Frischling

Beiträge: 8

Beruf: Software Entwickler

  • Private Nachricht senden

27

29.01.2015, 19:58

Hallo Glocke,

Testcases zum abdecken Deiner neuen Funktionen bzw. codes reichen völlig.
In erster Linie sollte es für Dich darum gehen, dass der Kram inklusive Tests erfolgreich durchläuft, dann bekommst Du wenigstens mit wenn grundlegende Dinge nicht funktionieren.
Rückgabewerte etc..

Als one man show sowieso nötig, weil es keinen code reviewer gibt ...
Also macht man sich mindestens die Mühe für funktionale Tests.

Besonders wichtig wirds wenn mehrere Entwickler an einem Projekt arbeiten.
Das kann man soweit treiben, dass funktionale Tests erst erfolgreich sein müssen, bevor Du überhaupt einchecken darfst. (gated check ins)

Für alles weitere gibt es QA inklusive Testentwickler.

Das ist auch privat empfehlenswert, denn ein Partner der sich verstärkt um QA kümmert ist eigentlich keine Option sondern Pflicht.
Man kann als Entwickler natürlich selbst einiges abdecken, sollte es aber nicht übertreiben sondern seine Arbeit effektiv aufteilen.

Davon abgesehen ist ein anderer Blickwinkel nie verkehrt besonders wenn es um intensives testen und user experience mancher features geht.
Das ist ein sehr wichtiger Teil der Entwicklung , die viel zu häufig bei einer one man show unterschätzt wird.

Zitat von »Bambi«
Network ist auch schwer.

Warum? Ich schreibe einen Test wo Server und Client erzeugt werden und sende dann ein paar Kommandos und prüfe ob diese korrekt angekommen sind.


Naja ganz so einfach ist es nicht.
Verbindungsabbrüche, langsame Verbindung, mobile Verbindung, gar keine Verbindung etc.
Das geht schon in Richtung Negativtests bzw. nicht erfüllte Systemvoraussetzungen.

Mit solchen Tests sollte man sich als Entwickler nicht aufhalten, lässt sich aber relativ schnell mit Hilfe einer Debug Proxy
umsetzen, die man zwischen spezifische requests hängt und damit unterschiedliche Bandbreiten simuliert.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »4xfusion« (29.01.2015, 20:10)


28

29.01.2015, 20:09

Testcases zum abdecken Deiner neuen Funktionen bzw. codes reichen völlig.
In erster Linie sollte es für Dich darum gehen, dass der Kram inklusive Tests erfolgreich durchläuft, dann bekommst Du wenigstens mit wenn grundlegende Dinge nicht funktionieren.
Rückgabewerte etc..

Als one man show sowieso nötig, weil es keinen code reviewer gibt ...
Also macht man sich mindestens die Mühe für funktionale Tests.

Genau dabei bin ich im Moment :) Derzeit baue ich mein Spiel (bzgl. Architektur) neu auf und schreibe im Grunde den ganzen Code neu. Im Moment stehen Physik- und Eingabe-System - und laufen inkl. Testcases super :)

z.B. habe ich für das Physik-System Testfälle der Art:
  • valid movement
  • tile collision
  • levitate over terrain (manche Objekte können über gewisses Terrain drüberschweben)
  • object collision
  • gain focus by facing via straight direction
  • gain focus by facing via diagonals (interessant zwecks maximaler Sichtweite)
  • lose focus by movement
  • ... usw.
Ich habe jetzt schon diverse Sachen immer mal geändert - es ist ein gutes Gefühl dann sofort zu sehen, was man damit "kaputt" gemacht hat :D

4xfusion

Frischling

Beiträge: 8

Beruf: Software Entwickler

  • Private Nachricht senden

29

29.01.2015, 20:12

Ja, vorallem wenn sowas durch nicht vorhandene Tests erst in paar Wochen auftritt, gehts erstmal auf Fehlersuche und das sind dann unter Umständen die richtigen Zeitkiller.
Habe meinen letzten Beitrag nochmal editiert und um QA allgemein erweitert.

30

02.09.2015, 10:54

Hallo zusammen!

ich grabe diesen Thread absichtlich aus um meine Erfahrungen zum Thema mal etwas mit euch zu teilen :) In den letzten Wochen habe ich begonnen die Codebase für mein RPG neu zu organisieren und habe großflächig Unittests eingebaut. Dabei habe ich bis auf einige Ausnahmen fast alles testen können! Hier ist eine kleine Liste mit einigen der getesteten Sachen. Vielleicht kann sie jemandem als Inspiration dienen :)
  • Meine Physik ist in drei Subsysteme zerlegt: Movement, Collision und Focus. Zum Focus System: Jedes Objekt kann in eine Blickrichtung (8 Richtungen) schauen, das nächste Objekt in Sichtweite wird dann fokussiert). Die Systeme interagieren untereinander über ein Eventsystem (einfache Structs die in Queues kopiert werden) und sind dadurch voneinander entkoppelt. Entsprechend kann ich jedes System einzeln testen: Das Collision-System bekommt z.B. MoveEvents (dass eine Kachel verlassen wurde), prüft dann auf Kollision und sendet ggf. ein CollisionEvent zurück. Mit ein paar gut gebauten Fixtures kann man den Setupcode schön verstecken und viele kleine Testfälle bauen - z.B. testen, dass eine Bewegung auf eine unbetretbare Kachel ein entsprechendes CollisionEvent auslöst etc.
  • Im Grafik-Bereich habe ich zum einen ein Render- und zum anderen ein Animation-System. So kann ich Animationen testen ohne irgendwas zeichnen zu müssen. Test-Szenario: Objekt mit Animation-Komponente erzeugen und ein AnimationEvent in das System geben (dass z.B. die Attack-Animation abgespielt wird). Anschließend kann man die Daten der Animation-Komponente des Objekts abchecken: Ist die richtige Animation gesetzt? Befindet sich der Frame-counter am Anfang der Animation? Genauso ist es möglich das Animationssystem zu updaten (um die aktiven Animationen weiterlaufen zu lassen). Dann kann man prüfen ob die Frame-counter auf die richtigen Frames verweisen, ob die Animation vllt. sogar schon beendet wurde etc. pp.
  • Im Render-System habe ich das erste mal nicht alles getestet. Allerdings konnte ich das Culling soweit vom Rest isolieren, dass ich in Unittests Beispielszenarien erzeuge und einmal culle, und dann den CullingBuffer (eine meiner Struktur die alle zu zeichnenden Kachelvertices und Sprites enthält) bgzl. seines Inhaltes prüfen kann. So lässt sich z.B. testen, dass nicht das gesamte Terrain gecullt wird etc.
  • Deutlich mehr High-Level sind dann die Implementierungen meiner Spielerinventare und Quickslot-Leisten (in denen Items oder Zauber abgelegt werden können). Also habe ich entsprechende Klassen "Inventory" und "Quickslot" gebaut und (schon fast zu offensichtliche) Dinge getestet: Dass identische Items stacken, Items entfernt werden können wenn sie im Inventar vorhanden sind etc. pp.
  • Besonders lustig war das Looting-System: Da habe ich mir (da ich ein Splitscreen-Coop anstrebe) das Droppen vom Looten getrent. Beim Droppen werden die Items halbwegs gleichmäßig verteilt und beim Looten dann die "vorgemerkten" Items schließlich eingesammelt. Da das Droppen (mit gegebener Liste von Items) zwar immernoch randomisiert ist, habe ich nach dem Droppen für jeden Spieler die Anzahl der Items gezählt und schließlich ein Histogramm erzeugt, welches mir angibt wie viele Items wie oft gedroppt wurden. Damit kann ich dann teste, dass 4 Items bei 2 Spieler zu genau 2x2 Items, und 5 Items bei 3 Spielern zu 1x1 und 2x2 Items führt.

Werbeanzeige