Как бы я провел тестирование на основе свойств в функции сделки карточной игры?

Я изучаю тестирование, основанное на свойствах, и мне интересно, как бы я применил этот тип тестирования к функции Deal в игре 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 ответ

Решение

Если вы моделируете домен (в данном случае карточную игру) с использованием алгебраических типов данных, система типов позаботится о многих вещах для вас.

Здесь и здесь уже есть примеры моделирования карточной игры, но, по сути, вы можете смоделировать ее так:

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; это единственные значения, которые он может иметь.

Что я должен учитывать при выполнении тестов на основе свойств для игры в блэкджек?

Я не знаю, это вам нужно выяснить (я также не знаю правил для блэкджека), но вот пример тестирования на основе свойств, примененного к правилам тенниса.

Спорт и игры, как правило, становятся легкой целью для тестирования на основе свойств, поскольку правила игры соответствуют свойствам.

В общем случае свойства являются инвариантами домена. Учитывая, что определенные предварительные условия выполняются, когда вы выполняете SUT, тогда должны выполняться определенные постусловия.

Вы также можете посмотреть мой курс Введение в тестирование свойств с помощью F# Pluralsight.

Другие вопросы по тегам