Unit Testing einer Schachbrettdarstellung

9

Das ist also eine Ausreißerfrage.

Ich schreibe eine Schachbibliothek, im Wesentlichen von Grund auf neu. Sie können einen Großteil des Codes hier finden , um ihn für eine GUI und / oder eine Engine zu verwenden. (Das Spiel ist Grand Chess, aber für die Zwecke dieser Frage spielt es keine Rolle.)

Ich schreibe derzeit Unit-Tests, um zu überprüfen, ob meine Funktionen wie erwartet funktionieren. Und ich habe mich gefragt, ob es eine Bibliothek oder Datenbank mit vorgeschlagenen Positionen zum Testen gibt, die ich verwenden und bearbeiten kann, kategorisiert nach Schachmatt, Patt, Scheck, Recht, Illegal usw.

Ich suche nach einer Liste von Positionen, anhand derer ich meinen Code testen kann.

Meine aktuellen Tests finden Sie hier, ich füge sie alle paar Tage hinzu. Ich möchte jedoch sicherstellen, dass die Tests vollständig sind, bevor ich den Code debugge. (Die Hälfte von ihnen scheitert derzeit).

Bearbeiten: um zu verdeutlichen: Ich suche nicht nach Motorentests ("Best Move"). Ich suche nach Tests zur Vertretung des Vorstands ("ist diese Position Schachmatt"). Ich habe bereits ein paar Rätsel für Motortests.

Asibahi
quelle
Sie codieren eine Variante. Der Standard-Schachdatensatz funktioniert bei Ihnen nicht. Ich fürchte, du bist allein.
SmallChess
@StudentT Ich suche etwas, von dem ich ausgehen kann. Eine reguläre Datenbank würde gut funktionieren, da Sie wissen, dass ich sie bearbeiten kann.
Asibahi
1
Es gibt VIELE solcher Testsätze. Freust du dich über so etwas wie perverse, taktische Übungen im Standardschach?
SmallChess
@StudentT Ich konnte über Google nichts finden, weshalb ich hier frage. Jede Info wäre hilfreich.
Asibahi
Was Sie testen möchten, hat wenig mit der Darstellung von Boards zu tun. Sie möchten die Board-Darstellung testen, nachdem Sie Bewegungen ausgeführt / aufgehoben oder Positionen importiert haben. Das Erkennen eines Partners / einer Pattsituation erfordert eine Bewertungsfunktion, und das Testen einer Position auf Rechtmäßigkeit sollte eine eigene Funktion sein, die viel mehr zu tun hat, als die Vertretung des Vorstands zu überprüfen.
Queeg

Antworten:

1

Wenn ich Ihre Frage lese, ist meine Bauchreaktion, dass Ihr Anwendungsbereich für Unit-Tests zu kompliziert ist. Ich empfehle, das kostenlose E-Book Unit Testing Prägnant durchzulesen. Ich habe jedoch keine Erfahrung mit dem Schreiben von Schachcode (vielleicht sind Ihre Paradigmen anders) - obwohl ich Software für meinen Lebensunterhalt mache.

Ein Unit-Test sollte sehr einfach sein und eine Funktion testen, die eine einzige Aufgabe erfüllt. Dann können Sie die Funktionen mit einer vernünftigen Erwartung kombinieren, dass sie funktionieren. Zum Beispiel würde ich einen Komponententest für jedes Stück erwarten, um festzustellen, ob ein bestimmter Zug legal ist. Ein Unit-Test für jedes Stück, um festzustellen, ob es den König in Schach hält. Ein Test für jedes Stück, um festzustellen, wo es angreift usw.

Das Testen einer Position scheint ein sehr komplizierter Komponententest zu sein und wäre viel schwieriger gründlich durchzuführen. Schreiben Sie stattdessen kleinere Tests für kleinere Funktionen und wissen Sie dann, dass diese einzeln funktionieren. Die Bewertung einer Position ist nur eine Frage der Iteration über die einfachen Funktionen.

Wenn Sie eine Position für einen guten (nicht erzwungenen) Zug testen möchten, werden Unit-Tests meiner Meinung nach die langfristige Entwicklung und Stärke Ihrer Schach-Engine künstlich einschränken. Ein binäres Ergebnis eines Unit-Tests wird Ihre Engine dazu zwingen, die zu machen jedes Mal die gleiche Bewegung.

Ich würde auch versuchen, Unit-Tests für den direktesten Pfad zu einem Partner mit bekannten Endspielen hinzuzufügen. Ich würde gerne Unit-Tests zum Durchlaufen bekannter Öffnungen hinzufügen. Unit-Tests in der Mitte des Spiels werden viel schwieriger sein - möglicherweise wird eine Position eingesteckt und bewertet, ob die Engine ein brauchbares Ergebnis liefert (was eine binäre Antwort ist).

Bei der Frage nach der Bewertung einer Reihe von Positionen für Ihre Engine können Sie diese Frage mit dem Tag "Schach" weitaus besser auf /programming// stellen .

Paul
quelle
Danke für die Antwort. Wie Sie wahrscheinlich aus dem Kommentargespräch unter der Frage ersehen können, möchte ich die Engine-Algorithmen nicht testen. Ich bin noch nicht einmal dazu gekommen. Ich möchte testen, ob mein Code erkennt, ob eine stehende Position auf dem Brett Schachmatt oder eine Pattsituation ist oder nicht, was "nur" legale Bewegungen zählt und ob der König in Schach ist. Seit ich diese Frage gestellt habe, habe ich eine kleine Sammlung von Positionen zusammengestellt, die als Unit-Test-Fälle verwendet werden können. Ich könnte das als Antwort posten. (Ich bin völlig überrascht, dass jemand ein Kopfgeld dafür angeboten hat, tbh.)
Asibahi
Dies beantwortet die Frage nicht.
SmallChess
1
Darüber hinaus sind die Hinweise zu Unit-Tests einfach falsch.
SmallChess
@asibahi Ich hatte nicht genug Repräsentanten, um in diesem Kommentarbereich zu posten, also musste ich eine Antwort hinzufügen. Ich denke wirklich, dass Sie mit dieser Frage in einem Programmierforum (Stackexchange) besser bedient werden. Aber zu diesem Kommentar ... haben Sie bereits einzelne Komponententests identifiziert -> Für jeden Stücktest gibt es einen legalen Schritt. Wenn das Wiederholen darüber für jedes Stück falsch ist, haben Sie eine Pattsituation oder ein Schachmatt, wenn Sie in Schach sind. Sie brauchen dafür keine große Sammlung von Positionen. Indem Sie jedes Stück einzeln auf seinen aktuellen Zustand testen, können Sie mehrere Stücke durchlaufen, um die Position zu bewerten.
Paul
0

Obwohl dies eine alte Frage ist, dachte ich, dass das in diesem Blog vorgestellte Konzept nützlich sein könnte: http://scionsoftware.com/blog/write-tests-by-playing-chess

Die Idee ist, dass Sie ein Schachspiel auf einer GUI spielen und einen Mechanismus haben, um den Status des Schachbretts durch Serialisierung in eine Datei zu erfassen.

Sie können diese Dateien nach Testfällen benennen und sie in die von Ihnen definierte Testmethode einspeisen: IsCheckmate; IsLegal; IsDraw

Einer der Hauptgründe, warum Sie eine natürliche Benutzeroberfläche verwenden möchten, um diese Testfälle außerhalb der einfachen Erstellung zu erstellen, ist, dass genügend Bedingungen auch von der Anzahl der Bewegungen abhängen: Rochade, en passant, Zeichnungsbedingungen.

SpykeBytes
quelle
0

Ich kenne keine Unit-Testing-Datenbank für Schach-Engines (im Allgemeinen), und ja, es ist fast unmöglich, einen umfassenden Unit-Test zu schreiben.

Sie können vielleicht alternative Testtechniken wie eigenschaftsbasiertes Testen untersuchen (QuickCheck in Haskell, ich kenne die F # -Umgebung nicht, aber es gibt sicherlich so etwas für F #), die automatisch eine große Menge an "Position" generieren und testen können unter Verwendung der von Ihnen definierten Eigenschaft.

Hoffe das hilft ein bisschen :)!

Sylvain Julmy
quelle