Prevenção FsCheck de geração de NaN e infinitos
-
21-12-2019 - |
Pergunta
Eu tenho profundamente aninhados datastructure com carros alegóricos em todo o lugar.Eu estou usando FsCheck para verificar se a data é alterada após a serialização e desserialização.
Esta falha de propriedade, quando uma válvula é um NaN ou +/- infinito, no entanto, caso não me interessa, desde que eu não esperava esses valores para ocorrer nos dados reais.
Existe uma maneira de impedir que FsCheck de geração de NaN e infinitos?
Eu tentei descartar gerado dados que contém disse: valores, mas isto torna o teste muito lento, tão lento, na verdade, que o teste ainda está em execução enquanto eu estou escrevendo isso, e eu tenho minhas dúvidas se ele vai realmente acabar...
Solução
Para reflexivo gerado tipos que contêm flutua (como eu suspeitar que você está usando) você pode substituir o padrão do gerador para flutua escrevendo uma classe da seguinte maneira:
type Overrides() =
static member Float() =
Arb.Default.Float()
|> filter (fun f -> not <| System.Double.IsNaN(f) &&
not <| System.Double.IsInfinity(f))
E, em seguida, chamar:
Arb.register<Overrides>()
Antes de FsCheck tenta gerar os tipos;exemplo:em sua configuração de ensaio ou antes de chamar de Seleção.Rápido.
Você pode conferir o resultado do método de registro para ver como ele fundiu o padrão arbitrário instâncias com as novas;ele deverá assumi-los.
Se você estiver usando o xUnit extensão você pode evitar chamar a Arb.registrar usando o Arbitraries argumento de PropertyAttribute:
[<Property(Arbitraries=Overides)>]
Outras dicas
Mauricio Scheffer disse, você pode usar NormalFloat tipo de parâmetro de teste.
Exemplo simples para a lista de carros alegóricos:
open FsCheck
let f (x : float list) = x |> List.map id
let propFloat (x : float list) = x = (f x)
let propNormalFloat (xn : NormalFloat list) =
let x = xn |> List.map NormalFloat.get
x = f x
Check.Quick propFloat
//Falsifiable, after 18 tests (13 shrinks) (StdGen (761688149,295892075)):
//[nan]
Check.Quick propNormalFloat
//Ok, passed 100 tests.