Так что это немного посторонний вопрос.
Я пишу шахматную библиотеку, по сути, с нуля. Вы можете найти большую часть кода здесь с намерением использовать его для графического интерфейса и / или движка. (Игра Grand Chess, но для целей этого вопроса это не имеет значения.)
В настоящее время я пишу модульные тесты, чтобы убедиться, что мои функции работают должным образом. И мне было интересно, есть ли какая-нибудь библиотека или база данных предлагаемых позиций для тестирования, из которых я могу использовать и работать, классифицированные по категориям: Шах, Пат, Чек, Юридический, Незаконный и т. Д.
tl; dr Я ищу список позиций, по которым нужно протестировать мой код.
Вы можете найти мои текущие тесты здесь, я добавляю их каждые несколько дней. Однако я хочу убедиться, что тесты исчерпывающие, прежде чем приступить к отладке кода. (Половина из них терпит неудачу в настоящее время).
Изменить: уточнить: я не ищу тесты двигателя ("лучший ход"). Я ищу тесты для представления на доске ("это позиция"). У меня уже есть несколько головоломок для тестирования двигателя.
источник
Ответы:
Когда я читаю ваш вопрос, моя внутренняя реакция такова, что ваш объем слишком сложен для юнит-тестирования. Я рекомендую быстро прочитать бесплатную электронную книгу «Тестирование модулей». Тем не менее, у меня нет опыта написания шахматного кода (возможно, ваши парадигмы отличаются), хотя я занимаюсь программным обеспечением для жизни.
Модульный тест должен быть очень простым и тестировать функцию, которая выполняет одну вещь. Затем вы можете комбинировать функции с некоторым разумным ожиданием того, что они будут работать. Например, я ожидаю, что юнит-тест для каждой фигуры определит, является ли определенный ход законным. Юнит-тест для каждого куска, чтобы определить, проверяет ли он короля. Тест для каждой фигуры, чтобы определить, где она атакует и т. Д.
Тестирование позиции кажется очень сложным модульным тестом, и его было бы намного сложнее сделать полностью. Вместо этого пишите меньшие тесты для меньших функций, а затем знайте, что они работают индивидуально - оценка позиции - это просто итерация по простым функциям.
Если вы хотите проверить позицию на хороший (не принудительный) ход, я думаю, что юнит-тест искусственно ограничит долгосрочное развитие и силу вашего шахматного движка ... двоичный результат юнит-теста заставит ваш движок сделать одно и то же движение каждый раз.
Я бы также посмотрел на добавление модульных тестов для «самого прямого» пути к мату с известными эндшпилями. Я хотел бы добавить модульные тесты для прохождения через известные отверстия. В середине игровых юнит-тестов будет гораздо сложнее - возможно, подключить позицию и оценить, что движок дает полезный результат (который является двоичным ответом).
Что касается вопроса оценки набора позиций для вашего движка, вы можете гораздо лучше поставить этот вопрос на https://stackoverflow.com/ с тегом "chess".
источник
Хотя это старый вопрос, я подумал, что концепция, представленная в этом блоге, может оказаться полезной: http://scionsoftware.com/blog/write-tests-by-playing-chess
Идея состоит в том, что вы играете в шахматы на графическом интерфейсе и имеете механизм для отслеживания состояния шахматной доски путем сериализации в файл.
Вы можете назвать эти файлы в соответствии с тестовыми примерами и передать их в любой метод теста, который вы определили: IsCheckmate; IsLegal; IsDraw
Одна из основных причин, по которой вы захотите использовать естественный пользовательский интерфейс для создания этих тестовых случаев, помимо простоты создания, заключается в том, что достаточное количество условий также зависит от количества ходов: рокировка, прохождение, условия прорисовки.
источник
Я не знаю никакой базы данных юнит-тестирования для шахматного движка (в общем), и да, написание исчерпывающего юнит-теста практически невозможно.
Вы можете изучить альтернативную технику тестирования, такую как тестирование на основе свойств (QuickCheck в Haskell, я не знаю среду F #, но она, конечно, существует для F #), которая может автоматически генерировать большое количество «позиций» и тестировать их. используя свойство, определенное вами.
Надеюсь, это поможет немного :)!
источник