如何在纸牌游戏的交易功能上执行基于属性的测试?

时间:2015-11-30 21:43:04

标签: unit-testing f# fscheck property-based-testing property-testing

我正在研究基于属性的测试,我很好奇如何将这种类型的测试应用于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;杰克;女王;国王;王牌) 再一次,不依赖静态类型已经确保对我来说了吗?

同样,在为二十一点游戏执行基于属性的测试时,我应该考虑什么?

1 个答案:

答案 0 :(得分:3)

如果您使用algebraic data types为域建模(在本例中为:纸牌游戏),则类型系统会为您处理许多事情。

已经有过对纸牌游戏herehere进行建模的示例,但从本质上讲,您可以像这样建模:

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 }

使非法国家无法代表,这意味着测试SuitDiamondsHearts之一是否有意义},ClubsSpades;这些是它可以拥有的唯一价值。

  

在为二十一点游戏执行基于属性的测试时我应该考虑什么?

我不知道,这是你要弄清楚的(我也不知道二十一点的规则),但这里是example of property based testing applied to the tennis rules。< / p>

体育和游戏往往是基于属性的测试的简单目标,因为游戏规则映射到属性。

通常,属性是域的不变量鉴于已满足某些先决条件,运用SUT时,然后某些后置条件应该成立。

您也可以考虑观看我的Introduction to Property-based Testing with F# Pluralsight课程。