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

How would I perform property-based testing on a card game's Deal function?

我正在研究基于 属性 的测试,我很好奇如何将这种类型的测试应用于 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)

基于 属性 的测试示例是什么?

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

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

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

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 之一甚至没有意义,HeartsClubsSpades;这些是它可以拥有的唯一值。

what should I consider when performing property-based tests for a blackjack game?

我不知道,那是你想知道的(我也不知道二十一点的规则),但这里有一个 example of property based testing applied to the tennis rules

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

一般来说,属性是域的不变量假设满足某些先决条件,你行使SUT然后某些后置条件应该持有。

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