Entonces esta es una pregunta un poco atípica.
Estoy escribiendo una biblioteca de ajedrez, esencialmente desde cero. Puede encontrar gran parte del código aquí , con la intención de usarlo para una GUI y / o un motor. (El juego es Grand Chess pero a los efectos de esta pregunta realmente no importa).
Actualmente estoy escribiendo pruebas unitarias para verificar que mis funciones funcionen como se esperaba. Y me preguntaba si había algún tipo de biblioteca o base de datos de posiciones sugeridas para probar que pueda usar y trabajar, clasificadas por si son Checkmate, Stalemate, Check, Legal, Ilegal, etc.
tl; dr Estoy buscando una lista de puestos para probar el código de mi unidad.
Puede encontrar mis pruebas actuales aquí, las agrego cada pocos días. Sin embargo, quiero asegurarme de que las pruebas sean exhaustivas antes de depurar el código. (La mitad de ellos falla actualmente).
Editar: para aclarar: no estoy buscando pruebas de motor ("mejor movimiento"). Estoy buscando pruebas de representación de la junta ("es esta posición jaque mate"). Ya tengo algunos acertijos alineados para probar el motor.
fuente
Respuestas:
Al leer su pregunta, mi reacción instintiva es que su alcance es demasiado complicado para las pruebas unitarias. Recomiendo una lectura rápida del libro electrónico gratuito Unit Testing Succinctly. Sin embargo, no tengo experiencia escribiendo código de ajedrez (quizás tus paradigmas son diferentes), aunque hago software para vivir.
Una prueba unitaria debe ser muy simple y probar una función que hace 1 sola cosa. Luego puede combinar las funciones con una expectativa razonable de que funcionarán. Por ejemplo, esperaría una prueba de unidad para cada pieza para determinar si un movimiento en particular es legal. Una prueba de unidad para cada pieza para determinar si está poniendo al rey bajo control. Una prueba para cada pieza para determinar dónde está atacando, etc.
Probar una posición parece una prueba unitaria muy complicada y sería mucho más difícil hacerlo a fondo. En su lugar, escriba pruebas más pequeñas contra funciones más pequeñas y luego sepa que esas trabajan individualmente: evaluar una posición es solo una cuestión de iterar sobre las funciones simples.
Si desea probar una posición para un buen movimiento (no forzado), creo que las pruebas unitarias limitarán artificialmente el desarrollo a largo plazo y la fuerza de su motor de ajedrez ... un resultado binario de una prueba unitaria obligará a su motor a hacer el mismo movimiento cada vez.
También me gustaría agregar pruebas unitarias para la ruta 'más directa' a un compañero con finales conocidos. Me gustaría agregar pruebas unitarias para atravesar también aberturas conocidas. Las pruebas unitarias a mitad del juego serán mucho más difíciles, tal vez enchufar una posición y evaluar que el motor produce un resultado utilizable (que es una respuesta binaria).
Para la cuestión de evaluar un conjunto de posiciones para su motor, es mejor que haga esta pregunta en https://stackoverflow.com/ con la etiqueta "ajedrez".
fuente
Si bien esta es una vieja pregunta, pensé que el concepto presentado en este blog podría ser útil: http://scionsoftware.com/blog/write-tests-by-playing-chess
La idea es que juegues un juego de ajedrez en una GUI y tengas un mecanismo para capturar el estado del tablero de ajedrez serializando en un archivo.
Puede nombrar esos archivos según los casos de prueba y alimentarlos al método de prueba que defina: IsCheckmate; Es legal; IsDraw
Una de las razones principales por las que desearía usar una interfaz de usuario natural para crear estos casos de prueba, fuera de la facilidad de creación, es que suficientes condiciones también dependen de los recuentos de movimientos: enroque, passant, condiciones de extracción.
fuente
No conozco ninguna base de datos de pruebas unitarias para el motor de ajedrez (en general), y sí, escribir pruebas unitarias exhaustivas es casi imposible.
Quizás pueda explorar técnicas de prueba alternativas como las pruebas basadas en propiedades (QuickCheck en Haskell, no conozco el entorno de F # pero ciertamente existe algo así para F #), que puede generar automáticamente una gran cantidad de "posición" y probarlas utilizando propiedad definida por usted.
Espero que esto ayude un poco :)!
fuente