我正在研究基于属性的测试,我很好奇如何将这种类型的测试应用于BlackJack游戏的交易功能。
这是一个单元测试(又名:基于实例的测试):
[<Test>]
let ``deal two cards`` () =
let hand = 2
let dealPlayer cardCount =
[for i in [1..cardCount] -> shuffleDeck.Pop]
|> Seq.toList
(dealPlayer hand).Length |> should equal (2)
基于属性的测试的示例是什么?
我会测试这两张牌是否在4件套装的范围内? (即黑桃,钻石,心形,俱乐部) 不依赖于静态类型已经确保对我而言?
我会测试这两张牌是在数字或面孔的范围内吗? (即2..10;杰克;女王;国王;王牌) 再一次,不依赖静态类型已经确保对我来说了吗?
同样,在为二十一点游戏执行基于属性的测试时,我应该考虑什么?
答案 0 :(得分:3)
如果您使用algebraic data types为域建模(在本例中为:纸牌游戏),则类型系统会为您处理许多事情。
已经有过对纸牌游戏here和here进行建模的示例,但从本质上讲,您可以像这样建模:
type Suit = Diamonds | Hearts | Clubs | Spades
type Face =
| Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten
| Jack | Queen | King | Ace
type Card = { Suit: Suit; Face: Face }
使非法国家无法代表,这意味着测试Suit
是Diamonds
,Hearts
之一是否有意义},Clubs
或Spades
;这些是它可以拥有的唯一价值。
在为二十一点游戏执行基于属性的测试时我应该考虑什么?
我不知道,这是你要弄清楚的(我也不知道二十一点的规则),但这里是example of property based testing applied to the tennis rules。< / p>
体育和游戏往往是基于属性的测试的简单目标,因为游戏规则映射到属性。
通常,属性是域的不变量。 鉴于已满足某些先决条件,当运用SUT时,然后某些后置条件应该成立。
您也可以考虑观看我的Introduction to Property-based Testing with F# Pluralsight课程。