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.
quelle
Antworten:
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 .
quelle
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.
quelle
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 :)!
quelle