【问题标题】:Property-based testing for a chess game国际象棋游戏的基于属性的测试
【发布时间】:2019-03-21 04:55:33
【问题描述】:

我正试图将注意力集中在基于属性的测试和国际象棋上。目前,我将我的国际象棋游戏表示为二维数组,我实现的唯一棋子是棋子和骑士来解决这个问题。

棋子和马将他们的动作表示为allMoves(x,y) \ invalidMoves(board,x,y) 的集合。所以我能想到的一个属性是测试allMoves(x,y) ∪ invalidMoves(board,x,y) === allMoves。但除此之外,我不确定还有什么要测试的。我假设我需要为棋盘设置一个简化的 Oracle 模型,但我不确定这样的模型是什么。

【问题讨论】:

    标签: haskell testing chess


    【解决方案1】:

    首先要说一些关于现实棋盘的明显事实,无论它们听起来多么愚蠢。其中许多将是要测试的合理属性。以下是一些想法:

    • 当您移动一块时,它会从原来的位置移动到移动放置它的位置。
    • 任何合法的马步都不是合法的棋步。
    • 棋子一次移动的方格不会超过两个。
    • 骑士永远不会靠近其起始位置移动。
    • 移动应该只涉及实际在棋盘上的位置。
    • 移到另一个棋子上会减少棋盘上的棋子数。

    这样的想法还有很多。它们看起来很简单,但我保证你的早期实现会错过其中的一些。弄清楚如何将这些不变量编写为属性,并从那里扩展您的测试套件。

    【讨论】:

    • 最后两个看起来真不错。第一个也有潜力。其余的对我来说有点具体;在修复错误后,我只会将它们作为回归测试粘贴在测试套件中。
    • 好的,但是这样做我不需要模拟整个电路板,基本上重新实现程序两次?通常我们希望模型是一些与原始实现不同的更简单的版本,对吧?例如,一个队列可以只使用一个 int 检查它的大小来测试,所以我们想要在这里类似的东西吗? “移动应该只涉及实际在棋盘上的位置。”这可以测试只知道棋盘的边界,因此应该是可能的。
    • 用你的真板就行了。为什么你认为你需要一个假的,模型板?测试,对于任何棋盘,对于棋盘提供的任何动作,该动作是否满足您的属性。
    • @dfeuer 合理。我在这里集思广益,写下我想到的任何东西,不管它听起来多么有用,以强调这是推导属性的有用过程。 (骑士属性的一个更好的版本是骑士的移动总是将它带到不同颜色的方块)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 1970-01-01
    • 2015-07-16
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多