Как использовать тестирование на основе свойств с помощью FsCheck.NUnit или XUnit?

Я новичок в модульном тестировании и тестировании на основе свойств, и в своем проекте я хочу использовать эту технику, но, к сожалению, это легко сказать... Я смотрел доклад о библиотеке FsCheck.XUnit, но парень тестировал числовую функцию ( модуль)... И я хочу протестировать функции, которые используют строки, списки и массивы.. Может быть, вы, ребята, могли бы дать подсказку или источник, где я могу просмотреть? P.S. везде, где я искал, были только числовые примеры, которые выглядели довольно легко проверить.

Есть некоторые функции, которые я хочу протестировать:

let wordSplit (text:string) = 
  text.Split([|' ';'\n';'\r';'\t';'!';',';'.';'?';';';':'; '/'
  ;'\\';'-';'+'; '*'; '#';'(';')';'^';'"';'\'';'`'; '@';'~';'|'|]
  ,StringSplitOptions.RemoveEmptyEntries)
  |> Array.toList 

let rec matchTails (tail1 : string list) (tail2 : string list) = 
    match tail1, tail2 with
        | h1::t1 , h2::t2 -> 
            if (h1=h2) then 
                matchTails t1 t2
            else
                false
        | [], _ -> false
        | _, []  -> true

let rec phraseProcessor (textH: string) (textT: string list) (phrases: string list list) (n:int) = 
    match phrases with 
    |[] -> n
    | h :: t ->
        match h with
        |x when x.Head = textH && (matchTails (textT) (x.Tail)) ->
            phraseProcessor (textH) (textT) (t) (n+1)
        | _ -> 
            phraseProcessor (textH) (textT) (t) (n)


let rec wordChanger (phrases : string list list) (text:string list) (n:int)= 
    match text with
    | [] -> n
    | h :: t ->
        wordChanger phrases t (phraseProcessor (h) (t) (phrases) (n))

person alex_z    schedule 11.01.2018    source источник


Ответы (1)


Какая проблема у вас была с нецелым числом?

Вы можете проверить https://fsharpforfunandprofit.com/posts/property-based-testing/ он приводит пример строки и пользовательского типа...

И, конечно же, вы также можете генерировать случайные строки!

let stringGenerator = Arb.generate<string>

// generate 3 strings with a maximum size of 1
Gen.sample 1 3 stringGenerator 
// result: [""; "!"; "I"]

// generate 3 strings with a maximum size of 10
Gen.sample 10 3 stringGenerator 
// result: [""; "eiX$a^"; "U%0Ika&r"]

Лучше всего то, что генератор будет работать и с вашими собственными пользовательскими типами!

type Color = Red | Green of int | Blue of bool

let colorGenerator = Arb.generate<Color>

// generate 10 colors with a maximum size of 50
Gen.sample 50 10 colorGenerator 

// result: [Green -47; Red; Red; Red; Blue true; 
// Green 2; Blue false; Red; Blue true; Green -12]

https://fsharpforfunandprofit.com/posts/property-based-testing-2/< /а>

Если вы хотите создать сложный тип: Как создать сложный объект в FsCheck?

person rad    schedule 11.01.2018