0

我正在研究基于属性的测试,并且很好奇如何将这种类型的测试应用到 BlackJack 游戏的 Deal 函数中。

这是一个单元测试(又名:基于示例的测试):

[<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;Jack;Queen;King;Ace) 再一次,依赖静态类型不是已经为我确保了吗?

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

4

1 回答 1

4

如果您使用代数数据类型对域(在本例中为纸牌游戏)进行建模,则类型系统会为您处理很多事情。

这里这里已经有纸牌游戏建模的例子,但本质上,你可以像这样建模:

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 }

使得非法状态无法表示,这意味着测试 a 是否SuitDiamondsHeartsClubsSpades;之一甚至没有意义。这些是它可以拥有的唯一价值。

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

我不知道,这需要你去弄清楚(我也不知道二十一点的规则),但这里有一个基于属性的测试应用到网球规则的例子

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

通常,属性是域的不变量鉴于满足某些先决条件,您执行SUT,某些后置条件应该成立。

您还可以考虑观看我的使用 F# Pluralsight 介绍基于属性的测试课程。

于 2015-12-01T06:44:49.357 回答