基于 属性 的国际象棋游戏测试
Property-based testing for a chess game
我正试图将注意力集中在基于 属性 的测试和国际象棋上。目前,我将我的国际象棋游戏表示为二维数组,而我实现的唯一棋子是棋子和骑士,用于 grokking。
兵和马代表他们的着法为allMoves(x,y) \ invalidMoves(board,x,y)
的集合。所以我能想到的一个 属性 就是测试那个 allMoves(x,y) ∪ invalidMoves(board,x,y) === allMoves
。但除此之外,我不确定还要测试什么。我假设我需要为棋盘设置一个简化的 oracle 模型,但我不确定这样的模型是什么。
先说一些关于现实生活中的棋盘的明显事实,无论它们听起来多么愚蠢。其中许多将是需要测试的合理属性。以下是一些想法:
- 当您移动棋子时,它会从原来的位置移动到移动放置的位置。
- 没有合法的骑士移动是合法的棋子移动。
- 棋子一次移动的方格永远不会超过两个。
- 马永远不会移动到它的起始位置附近。
- 一步棋应该只涉及棋盘上的实际位置。
- 移动到另一块会减少棋盘上的块数。
还有很多这样的想法。它们看起来很简单,但我保证您的早期实现会遗漏其中的一些。弄清楚如何将这些不变量写成属性,并从那里扩展您的测试套件。
我正试图将注意力集中在基于 属性 的测试和国际象棋上。目前,我将我的国际象棋游戏表示为二维数组,而我实现的唯一棋子是棋子和骑士,用于 grokking。
兵和马代表他们的着法为allMoves(x,y) \ invalidMoves(board,x,y)
的集合。所以我能想到的一个 属性 就是测试那个 allMoves(x,y) ∪ invalidMoves(board,x,y) === allMoves
。但除此之外,我不确定还要测试什么。我假设我需要为棋盘设置一个简化的 oracle 模型,但我不确定这样的模型是什么。
先说一些关于现实生活中的棋盘的明显事实,无论它们听起来多么愚蠢。其中许多将是需要测试的合理属性。以下是一些想法:
- 当您移动棋子时,它会从原来的位置移动到移动放置的位置。
- 没有合法的骑士移动是合法的棋子移动。
- 棋子一次移动的方格永远不会超过两个。
- 马永远不会移动到它的起始位置附近。
- 一步棋应该只涉及棋盘上的实际位置。
- 移动到另一块会减少棋盘上的块数。
还有很多这样的想法。它们看起来很简单,但我保证您的早期实现会遗漏其中的一些。弄清楚如何将这些不变量写成属性,并从那里扩展您的测试套件。