Модульное тестирование представления шахматной доски

9

Так что это немного посторонний вопрос.

Я пишу шахматную библиотеку, по сути, с нуля. Вы можете найти большую часть кода здесь с намерением использовать его для графического интерфейса и / или движка. (Игра Grand Chess, но для целей этого вопроса это не имеет значения.)

В настоящее время я пишу модульные тесты, чтобы убедиться, что мои функции работают должным образом. И мне было интересно, есть ли какая-нибудь библиотека или база данных предлагаемых позиций для тестирования, из которых я могу использовать и работать, классифицированные по категориям: Шах, Пат, Чек, Юридический, Незаконный и т. Д.

tl; dr Я ищу список позиций, по которым нужно протестировать мой код.

Вы можете найти мои текущие тесты здесь, я добавляю их каждые несколько дней. Однако я хочу убедиться, что тесты исчерпывающие, прежде чем приступить к отладке кода. (Половина из них терпит неудачу в настоящее время).

Изменить: уточнить: я не ищу тесты двигателя ("лучший ход"). Я ищу тесты для представления на доске ("это позиция"). У меня уже есть несколько головоломок для тестирования двигателя.

asibahi
источник
Вы кодируете вариант. Стандартный набор шахматных данных не подойдет для вас. Боюсь, ты сам по себе.
SmallChess
@StudentT Я ищу то, с чего могу начать. обычная база данных подойдет, так как вы знаете, я могу ее редактировать.
asibahi
1
Таких тестовых наборов МНОГИЕ, вы счастливы за что-то вроде совершенства, тактических упражнений в стандартных шахматах?
SmallChess
@StudentT Я не смог ничего найти через Google, поэтому я спрашиваю здесь. Любая информация будет полезна.
asibahi
То, что вы хотите проверить, имеет мало общего с представлением на доске. Вы захотите проверить представление доски после выполнения / снятия ходов или импорта позиций. Обнаружение партнера / патовой ситуации требует функции оценки, а тестирование позиции на законность должно быть отдельной функцией, которая имеет гораздо большее значение, чем проверка представительства на доске.
Queeg

Ответы:

1

Когда я читаю ваш вопрос, моя внутренняя реакция такова, что ваш объем слишком сложен для юнит-тестирования. Я рекомендую быстро прочитать бесплатную электронную книгу «Тестирование модулей». Тем не менее, у меня нет опыта написания шахматного кода (возможно, ваши парадигмы отличаются), хотя я занимаюсь программным обеспечением для жизни.

Модульный тест должен быть очень простым и тестировать функцию, которая выполняет одну вещь. Затем вы можете комбинировать функции с некоторым разумным ожиданием того, что они будут работать. Например, я ожидаю, что юнит-тест для каждой фигуры определит, является ли определенный ход законным. Юнит-тест для каждого куска, чтобы определить, проверяет ли он короля. Тест для каждой фигуры, чтобы определить, где она атакует и т. Д.

Тестирование позиции кажется очень сложным модульным тестом, и его было бы намного сложнее сделать полностью. Вместо этого пишите меньшие тесты для меньших функций, а затем знайте, что они работают индивидуально - оценка позиции - это просто итерация по простым функциям.

Если вы хотите проверить позицию на хороший (не принудительный) ход, я думаю, что юнит-тест искусственно ограничит долгосрочное развитие и силу вашего шахматного движка ... двоичный результат юнит-теста заставит ваш движок сделать одно и то же движение каждый раз.

Я бы также посмотрел на добавление модульных тестов для «самого прямого» пути к мату с известными эндшпилями. Я хотел бы добавить модульные тесты для прохождения через известные отверстия. В середине игровых юнит-тестов будет гораздо сложнее - возможно, подключить позицию и оценить, что движок дает полезный результат (который является двоичным ответом).

Что касается вопроса оценки набора позиций для вашего движка, вы можете гораздо лучше поставить этот вопрос на https://stackoverflow.com/ с тегом "chess".

Павел
источник
Спасибо за ответ. Однако, как вы, вероятно, можете сказать из комментария к разговору под вопросом, я не собираюсь тестировать алгоритмы движка. Я даже не дошел до них еще. Я пытаюсь проверить, распознает ли мой код, является ли положение на доске матом, или патом, или нет, то есть «просто» подсчитывает легальные ходы и контролирует ли король. Фактически, с тех пор как я опубликовал этот вопрос, я составил небольшую коллекцию позиций для использования в качестве модульных тестов. Я мог бы опубликовать это как ответ. (Я полностью удивлен, что кто-то предложил награду за это, шт.)
asibahi
Это не отвечает на вопрос.
SmallChess
1
Кроме того, заметки о модульном тестировании просто неверны.
SmallChess
@asibahi У меня не было достаточно представителей для публикации в этом разделе комментариев, поэтому мне пришлось добавить ответ. Я действительно думаю, что вы будете лучше обслуживаться на форуме по программированию (stackexchange) с этим вопросом. Но в этом комментарии ... вы уже определили отдельные модульные тесты -> Для каждого тестового задания есть законный ход. Если итерации, возвращающие ложь для каждого куска, у вас тупик или мат, если вы в чеке. Вам не нужно огромное количество позиций для этого. Проверяя каждый кусок по отдельности на его текущее состояние, вы можете выполнить итерацию по нескольким частям, чтобы оценить положение.
Пол
0

Хотя это старый вопрос, я подумал, что концепция, представленная в этом блоге, может оказаться полезной: http://scionsoftware.com/blog/write-tests-by-playing-chess

Идея состоит в том, что вы играете в шахматы на графическом интерфейсе и имеете механизм для отслеживания состояния шахматной доски путем сериализации в файл.

Вы можете назвать эти файлы в соответствии с тестовыми примерами и передать их в любой метод теста, который вы определили: IsCheckmate; IsLegal; IsDraw

Одна из основных причин, по которой вы захотите использовать естественный пользовательский интерфейс для создания этих тестовых случаев, помимо простоты создания, заключается в том, что достаточное количество условий также зависит от количества ходов: рокировка, прохождение, условия прорисовки.

SpykeBytes
источник
0

Я не знаю никакой базы данных юнит-тестирования для шахматного движка (в общем), и да, написание исчерпывающего юнит-теста практически невозможно.

Вы можете изучить альтернативную технику тестирования, такую ​​как тестирование на основе свойств (QuickCheck в Haskell, я не знаю среду F #, но она, конечно, существует для F #), которая может автоматически генерировать большое количество «позиций» и тестировать их. используя свойство, определенное вами.

Надеюсь, это поможет немного :)!

Сильвен Джулми
источник