单元测试棋盘表示


9

所以这是一个离群的问题。

我实际上是从头开始编写一个象棋库。您可以在此处找到许多代码,以用于GUI和/或引擎。(游戏是国际象棋,但出于这个问题的目的,这并不重要。)

我目前正在编写单元测试,以验证我的功能是否按预期工作。我想知道是否存在某种类型的库或数据库,这些库或库可以建议我测试使用并根据其进行工作的建议职位,并将其分类为将军,僵局,支票,法律,非法等。

tl; dr我正在寻找位置列表以对我的代码进行单元测试。

您可以在这里找到我当前的测试,我每隔几天就会添加一次。但是,在调试代码之前,我想确保测试是详尽的。(目前有一半失败)。

编辑:澄清:我不是在寻找引擎(“最好的举动”)测试。我正在寻找董事会代表(“此职位是我的职位”)测试。我已经为引擎测试排队了一些难题。


您正在编码一个变体。标准国际象棋数据集对您不起作用。所以,恐怕你是一个人。
SmallChess

@StudentT我正在寻找可以开始的东西。常规的databsase就可以了,因为您知道,我可以对其进行编辑。
asibahi

1
有很多这样的测试仪,您对标准棋中的技巧,战术练习之类的东西感到满意吗?
SmallChess

@StudentT我无法通过Google找到任何内容,因此为什么在这里询问。任何信息都会有帮助。
asibahi

您要测试的内容与董事会代表关系很少。您需要在做出/取消做出动作或导入职位之后测试董事会代表。检测配偶/僵持状态需要评估功能,而测试职位的合法性应该是其自身的功能,这比检查董事会的代表地位要重要得多。
Queeg

Answers:


1

在阅读您的问题时,我的直觉是您的范围对于单元测试而言太复杂了。我建议您快速阅读免费的电子书《简洁的单元测试》。但是,我没有编写象棋代码的经验(也许您的范例有所不同)-尽管我从事谋生软件。

单元测试应该非常简单,并且测试一项仅做一件事情的功能。然后,您可以将这些功能与可以使用的一些合理预期结合起来。例如,我希望对每个零件进行单元测试,以确定特定动作是否合法。对每个零件进行单元测试,以确定是否正在检查国王。测试每个棋子以确定攻击的地方,等等。

测试一个职位似乎是一个非常复杂的单元测试,并且要进行彻底的测试要困难得多。取而代之的是针对较小的函数编写较小的测试,然后知道这些函数可以单独工作-评估位置只是迭代简单函数的问题。

如果您想测试一个好的(非强制)移动位置,我认为单元测试将人为地限制国际象棋引擎的长期发展和力量...单元测试的二进制结果将迫使您的引擎做出每次都一样。

我还将查看为具有已知残局的配偶添加“最直接”路径的单元测试。我还希望添加用于遍历已知开口的单元测试。中期游戏单元测试将更加困难-可能插入某个位置并评估引擎是否会产生可用的结果(这是二进制响应)。

对于评估引擎的一组位置的问题,您最好将其放在带有“ chess”标签的https://stackoverflow.com/上。


感谢您的回答。但是,您可能可以从问题下的评论对话中看出,我不打算测试引擎算法。我什至还没有去那些。我正在测试我的代码是否能够识别董事会中站立姿势是否是僵局或僵持,这只是“合法”计算合法举动以及国王是否处于制止状态。实际上,自从我发布了这个问题以来,我就继续撰写了一小部分职位,以用作单元测试用例。我可以将其发布为答案。(我完全惊讶于有人为此提供了赏金,
TBH

这不能回答问题。
SmallChess

1
此外,有关单元测试的注释是错误的。
SmallChess

@asibahi我在该评论部分没有足够的代表要发表,因此我不得不添加一个答案。我真的认为,在这个问题上,您可以在编程论坛(stackexchange)中得到更好的服务。但是在此评论上,您已经确定了单个单元测试->每项测试都有合法的举措。如果迭代返回的每一部分都返回false,则说明您处于僵持状态,如果处于检查状态,则将变为死状态。您不需要大量的职位。通过分别测试每个零件的当前状态,可以迭代多个零件以评估位置。
Paul

0

尽管这是一个老问题,但我认为此博客中提出的概念可能会有用:http : //scionsoftware.com/blog/write-tests-by-playing-chess

这个想法是,您将在GUI上玩国际象棋游戏,并且具有通过序列化到文件来捕获国际象棋棋盘状态的机制。

您可以根据测试用例命名这些文件,并将其输入到您定义的任何测试方法中:IsCheckmate; IsLegal; IsDraw

除了易于创建之外,您想要使用自然UI来创建这些测试用例的主要原因之一是,足够的条件还依赖于移动计数:castling,en passant,draw条件。


0

我不知道国际象棋引擎的任何单元测试数据库,是的,编写详尽的单元测试几乎是不可能的。

您也许可以探索替代测试技术,例如基于属性的测试(在Haskell中使用QuickCheck,我不知道F#环境,但是它确实存在F#的环境),它可以自动生成大量的“位置”并进行测试使用您定义的属性。

希望这会有所帮助:)!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.