Wird BDD (Behavior Driven Development) in Spielen verwendet?


9

Ich habe eine Weile über BDD - Behavior Driven Development gelesen und finde es sehr einfach und nützlich, Features in Code umzuwandeln. BDD-Benutzer nennen es oft TDD richtig gemacht.

BDD ist ein Tool für das Software-Design von außen nach innen, vom Geschäftswert (oder Gameplay-Wert) bis zum Code.

Dan North stellt BDD vor

Wissen Sie , alle Ressourcen über BDD und Spiele anders als diese ?


Es sieht aus wie eine Adaption von TDD, und als solche ist dieser Link so ziemlich ein Duplikat.
Die kommunistische Ente

Da BDD ein gut organisierter Prozess für TDD ist, möchte ich wissen, ob jemand es verwendet und wie die Erfahrung ist.
MarcoTmp

Beantwortet diese Frage nicht Ihre Fragen?
Die kommunistische Ente

Nicht wirklich, weil ich immer noch nicht weiß, wie andere BDD in Spielen verwenden.
MarcoTmp

Ich habe immer noch das Gefühl, dass TDD im Grunde genommen in einem anderen Stil aufgeführt wird.
Die kommunistische Ente

Antworten:


14

Es ist wahrscheinlich sicher zu sagen, dass BDD wie TDD oder (hier ein trendiges Entwicklungs-Schlagwort-Paradigma einfügen) von einigen Spieleentwicklern irgendwo verwendet wird, aber sie wissen wahrscheinlich nicht, dass sie es sind, und sie würden auch nicht unbedingt erkennen können, was BDD tatsächlich bedeutet . Die Frage ist wirklich, wie oft sie es benutzen und wie viel müssen sie es benutzen, damit es für Sie von Bedeutung ist?

Wenn ich zum Beispiel arbeite, sind alle unsere Unit-Test-Namen "Sätze", wie Dan North in dem von Ihnen verlinkten Artikel vorschlägt. Das allein reicht natürlich nicht aus, um zu sagen, dass wir BDD verwenden, aber vielleicht ist es das, was Sie wirklich interessiert?

Meiner Meinung nach sollte der Fokus nicht darauf liegen, welches Schlagwort Sie in einem Studio anwenden, sondern darauf, welche Produktivitäts- und Entwicklungsprozesstechniken Sie insgesamt anwenden. Ich finde, dass die produktivsten Teams Techniken aus einer Vielzahl von "Schlagwort-Paradigmen" mischen und aufeinander abstimmen, anstatt sich dogmatisch auf jede starre Doktrin festzulegen, die laut einer Internetstudie ein bestimmtes Schlagwort-Paradigma umfasst.

Ich sehe dies am häufigsten beim Agile-Trend: Teams, die sich als "Doing Agile" identifizieren, sind in der Regel (ironischerweise) unflexibler in Bezug auf den Prozess als Teams, die die für sie sinnvollen Teile von Agile organisch einbeziehen. Die ehemaligen Teams sind meiner Erfahrung nach fast immer weniger produktiv.

Ein Entwicklungsteam besteht aus Menschen, die keine austauschbaren Zahnräder in einer Maschine sind. Sie agieren einzigartig als Individuen und als einzigartige Kombination von sich selbst. Der Weg zu einer effektiven Entwicklung besteht nicht darin, Ihre Menschen in die Form von {BDD, Agile, WhateverIsNext} zu bringen, sondern ständig zu überprüfen, wie das Team Fortschritte macht, Mängel in diesem Prozess auszugleichen, defekte technische Probleme zu ersetzen und die vorhandenen Dinge zu verstärken Arbeiten. Kurz gesagt, um sich auf den Versand eines Titels zu konzentrieren und nicht darauf, "agil zu sein (oder was auch immer)".


Ich sollte natürlich beachten, dass ich hier nur anekdotische Beweise für meine Kommentare über den Zusammenhang zwischen der nachdrücklichen Einhaltung des Prozessdogmas und der Produktivität habe. Es ist nur meine Erfahrung und keine wissenschaftliche Studie.

1
-1. Danke für deine Meinung. Möchtest du die Frage beantworten?
Jess Telford

+1, nette Antwort. @JoshPetrie Verwenden Sie zumindest manchmal TDD oder messen Sie die Testabdeckung? Nur interessant den Stand der Entwicklertests in Game Dev.
Ilya Ivanov

1

Ist es? Vielleicht. Meine Meinung wäre, dass es im Allgemeinen zu einer sehr schlechten Passform für Unterhaltungssoftware führen würde, obwohl es für Bibliotheken mit niedriger Ebene gut funktionieren könnte.

EDIT: Hier ist eine Begründung für meine Meinung.

Wikipedia definiert BDD als eine Technik, die "die Zusammenarbeit zwischen Entwicklern, Qualitätssicherung und nicht-technischen oder geschäftlichen Teilnehmern an einem Softwareprojekt fördert". Dies klingt bereits nach einer schlechten Idee, da sich Spiele von den meisten Softwareprogrammen dadurch unterscheiden, dass sie nicht als Tools für einen bestimmten Bedarf eines „nicht technischen oder geschäftlichen Teilnehmers“ konzipiert sind, sondern zusammenhängende Werke sind, die im Großen und Ganzen zur Unterhaltung gedacht sind. Es gibt einen Schwerpunkt auf "gewünschtes Softwareverhalten", aber Spiele haben selten "gewünschtes Softwareverhalten", außer auf technischer Ebene. Es ist definitiv sinnvoll, diesen Teil des Codes zu überprüfen, aber nicht mit dem Endbenutzer, da er ihn nie sehen wird.

Aber nehmen wir an, Sie möchten das menschliche Stakeholder-Zeug wegwerfen und einfach BDD verwenden, um Verträge zwischen verschiedenen Codemodulen durchzusetzen, was sich meines Erachtens nicht wesentlich von der normalen testgetriebenen Entwicklung unterscheidet, die ich ebenfalls als schlecht betrachte. aus folgendem Grund für Spiele geeignet.

Tests sind nützlich, um zu überprüfen, ob diskrete Ereignisse wie erwartet aufgetreten sind. Dies funktioniert gut bei der ereignisgesteuerten Programmierung, d. H. In den meisten Teilen der Software-Welt, in der eine Aktion ausgeführt wird, werden einige Ausgaben generiert. Anschließend überprüfen Sie einfach, ob die Aktion und das Ergebnis übereinstimmen. Spielesoftware ist jedoch typischerweise eine Simulation, bei der eine Aktion kein diskretes Ergebnis hat, sondern eine kontinuierliche Änderung des Weltzustands. Wenn mein versteckter Spieler ein Geräusch macht, möchte ich vielleicht überprüfen, ob die KI mich jagt. Ich kann also einen Test erstellen, um sicherzustellen, dass sich die KI nach dem Erstellen eines Geräusches im Jagdzustand befindet, und das ist großartig. Aber woher weiß ich, dass die Jagd überhaupt funktioniert? Sie können das nicht sofort überprüfen - Sie können es nur im Laufe der Zeit beobachten.

Darüber hinaus kann ein Test-First-Ansatz ein falsches Sicherheitsgefühl erzeugen und die Menschen dazu bringen, zu glauben, dass Code besser ist als er wirklich ist.

def check_dice_roll_in_range():
    d = new Dice()
    assert(d.roll() between 1 and 6)

class Dice:
    def roll():
        return 4

Da ein Testergebnis ein falsches Positiv ergeben kann, können Sie sich niemals der grundlegenden Notwendigkeit entziehen, den Code selbst zu überprüfen. Wenn der Code selbst jedoch ausreichend überprüft wird, gewinnt der Test eine untergeordnete Bedeutung. Aus diesem Grund werden meiner Meinung nach Tests am besten nach dem Ereignis verwendet, um Fehlerkorrekturen zu testen.

Ich würde nicht behaupten, dass das Testen niemals einen Vorteil bringt, wenn die Objekte X und Y zusammenarbeiten, ist das Ergebnis wie erwartet. Die Frage ist, ob Sie dies am effektivsten überprüfen. Die Methoden können eine formale Überprüfung, eine Codeüberprüfung, Test-First-Methoden, Test-Last-Methoden, herkömmliche QS-Black-Box-Tests oder die einfache Verwendung des Codes wie erwartet und die Beobachtung der Ergebnisse umfassen. Die letzten beiden Optionen sind die meiste Zeit überraschend effektiv, da die meisten Fehler, obwohl sie so klingen, als ob sie nicht streng genug wären, im Verlauf der typischen Verwendung gefunden werden und das Verstehen eines Fehlers in seinem natürlichen Kontext manchmal einfacher sein kann als das Verstehen in einem künstlichen Test Geschirr. Darüber hinaus

Zusammenfassend denke ich, dass testgetriebene Entwicklung nicht unbedingt eine gute Wahl für Software ist, dass Tests allein niemals ausreichen, um die Softwarequalität sicherzustellen (und daher muss die Zeit, die für das Schreiben aufgewendet wird, mit alternativen Verwendungen dieser Entwicklerzeit verglichen werden). dass Spiele besonders gut zu automatisierten Testfällen passen, und dass Spiele besonders schlecht zu Entwicklungsmethoden passen, bei denen der Schwerpunkt auf "Geschäftswert" und "Akzeptanztests" liegt.

(Hoffentlich ist das eine bessere Antwort, auch wenn Sie meinen Punkten nicht zustimmen.)


-1 auch von mir; Wenn überhaupt, passt BDD noch besser zu Spielen als zu anderen Dingen. Es ist noch natürlicher, das Verhalten eines Zeichens als Antwort auf eine Eingabe anzugeben, als das Verhalten eines Webdienstes als Antwort auf eine bestimmte XML-Nachricht.
BlueRaja - Danny Pflughoeft

1
Unterhaltungssoftware ist immer noch Software, nicht wahr?
Prusswan

Eine gute Meinungsvielfalt von Experten ist meiner Meinung nach sehr wertvoll. Jede Person hat ein Repräsentantenabzeichen auf ihren Antworten, sodass die Leser festlegen können, wie stark die Meinung abgewogen werden soll, wenn sie in Verbindung mit dem Rest für eine bestimmte Frage gestellt wird.
Nate

1
Ich stehe zu meiner -1 und möchte auf einige der Aussagen antworten: collaboration between developers, QA and [users] [...] sounds like a bad idea - games rarely have 'desired software behaviour'- Ja, das tun sie: Sie müssen Spaß machen. Der beste Weg zu wissen, ob Ihr Spiel Spaß macht, besteht darin, den Spieletestern zuzuhören. Entwickler sind oft geblendet von ihrer Entwicklung (oder von technischen Schwierigkeiten), dass ihr Spiel keinen Spaß macht. Spieletester, die keine Entwickler sind, haben diese Probleme nicht.
BlueRaja - Danny Pflughoeft

2
Was das Testen betrifft: Wenn Sie auf diese Weise Tests schreiben, machen Sie das völlig falsch. Ex. Zum Testen übergeben DiceSie ein nachgebildetes zufälliges Objekt und stellen sicher, dass Roll()die richtigen Werte zurückgegeben werden. Sie verwenden genau die gleichen Techniken zum Testen von Simulationen (Videospielen) wie zum Testen normaler Anwendungen. Unit-Tests können nur Einheiten testen. Sie haben also Recht, dass "Tests allein niemals ausreichen, um die Softwarequalität sicherzustellen" (aus diesem Grund gibt es immer noch eine Qualitätssicherung ). Das heißt aber nicht, dass sie für Videospiele weniger nützlich sind.
BlueRaja - Danny Pflughoeft

1

Ich denke, BDD ist in jeder Umgebung angemessen. Wie bereits erwähnt, entwickeln Sie Software und sollten diese daher testen. Ich mag bdd für einige der zufälligen Semantiken, die wie Testnamen als Sätze erwähnt werden. Ich mag es auch, bestimmte Tests zu gruppieren, während ich noch 1 Klasse testen kann.

Um andere Nachrichten hier zu bekämpfen, möchte ich darauf hinweisen, dass es bei einem größeren Projekt VIEL schwieriger ist, Code ohne Tests umzugestalten. Wenn Sie einen Code überarbeiten, fliegen Sie blind, ob alles in einem Glanz der Herrlichkeit explodieren wird oder nicht. Die Tests helfen Ihnen, Dinge frühzeitig zu erkennen. Sie schreiben also Ihren Test, schlagen fehl, codieren gerade genug, um zu bestehen und fortzufahren. Wenn Sie umgestalten, sollten Sie dasselbe tun, aber anstatt zu schreiben, überarbeiten Sie den Test. In den meisten Fällen führen Sie den Test aus, der fehlschlägt. Sie ändern, was Ihrer Meinung nach geändert werden sollte, und er schlägt immer noch fehl. An diesem Punkt stellen Sie fest, dass ein anderer Code auf eine ganz andere Weise auf diese Funktion / Methode angewiesen ist. Sie können dann Ihren Test und den resultierenden Code korrigieren. Ohne diese Art von Codeabdeckung würden Sie tagelang herumstolpern und versuchen herauszufinden, wo etwas kaputt ist.

Lesen Sie mehr über "Verträge" im Buch des Pragmatischen Programmierers. Durch Testen können Sie Codeverträge abschließen. Dieser Code macht X und nichts weiter als X und erwartet nicht, dass er etwas gegen Y unternimmt oder versucht, ihn an Z anzupassen. Er stellt die Sauberkeit des Codes sicher und erwartet, dass jeder kein Schwanz ist und die Codebasis durcheinander bringt.

Es gibt weitere Gründe für BDD. Das wichtigste für mich ist, dass ich die gleiche Menge an Tests durchführen würde, um meine Annahmen zu validieren, damit ich sie genauso gut formalisieren kann.

Was das "Wie" betrifft, hängt es wirklich von Ihrer Umgebung ab. Ich schreibe gerade ein Java-Spiel und benutze Robolectric. Sie sollten immer versuchen, etwas zu "erwarten". Ich habe gehört, dass Spione / Mocks / Stubs nicht so nützlich sind, da Sie auf der anderen Seite ein Äquivalent benötigen, aber manchmal haben Sie keine Wahl, insbesondere bei APIs. Sie können davon ausgehen, dass die andere Seite der API nicht schrecklich ist und es normalerweise Ihr Code ist, der nervt.

Wenn Sie zum Beispiel die Bewegung testen. Nun, Sie erwarten, wenn "Auf" gedrückt wird, dass sich der Benutzer durch eine Messung vorwärts bewegt.

Wenn Sie zum Beispiel das Rendern von Grafiken testen ... testen Sie das nicht zu oft, weil Sie das wirklich tun? Ein gutes Test-Framework könnte diesen Teil für Sie erledigen. Reflexion ist nicht sehr trivial, würde ich für diese Art von Dingen sagen. Möglicherweise müssen Sie Puffer usw. usw. überprüfen. Ich würde einfach nur überprüfen, was Sie tatsächlich tun. Der Charakter ist hier, jetzt ist er nach einer Aktion da.

Sie sollten viele kleine Funktionen / Tests haben, die zusammen etwas Nützliches ergeben.


Oh, zum Schluss habe ich viele Leute bemerkt, die zufällig das richtige Verhalten beim Codieren von Spielen / Grafiken haben. Das Testen verhindert irgendwie, dass der Effekt "es funktioniert einfach irgendwie". Es ist viel schwieriger zu wissen, wie sich Ihre Gleichungen auf die Dinge auswirken, als nur Code zu kopieren und Annahmen zu treffen.
Parris

Bei BDD geht es nicht nur ums Testen, sondern es geht auch weit darüber hinaus.
Daniel

0

Ich glaube, es gibt ein Missverständnis darüber, was BDD ist. BDD ist keine Testtechnik oder -prüfung. BDD ist ein Entwicklungsmodell und -prozess. Es geht weit über das Testen hinaus und es geht weit über das Programmieren hinaus.

Daher kenne ich kein großes AAA-Studio, das mit diesem Modell arbeitet (ich habe Freunde, die für einige von ihnen auf der ganzen Welt als Programmierer arbeiten). Wie jemand anderes betonte, kann es sein, dass ein Projektmanager oder ein Team irgendwo einige der Praktiken einbezieht, die BDD umfasst, aber ich kenne kein Studio, das Pure-BDD anwendet (von der Definition des Geschäftswerts über die Spezifikation anhand eines Beispiels bis hin zum Schreiben) Feature-Dateien, um sie mit Aktionären zu validieren, um die Feature-Dateien als Tests zu automatisieren).

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.