假设使用Elm模糊测试进行!= b

时间:2016-12-08 07:58:45

标签: elm

我刚刚编写了一个模糊测试,它基本上检查了对不同输入的同一函数的两次调用会产生不同的结果。我想告诉Elm-test,输入不允许相等;否则此测试用例失败的可能性很小。

我不想通过从第一个输入中获取第二个输入来使它们不相等,因为这严重限制了搜索空间。

如何告诉榆树测试模糊器它产生的两个输入不能相等?

编辑:
这是我写的一个完整性测试:

fuzz3 Fuzz.string Fuzz.int Fuzz.int "Decryption is not possible with wrong key" <|
  \msg keySeed keySeed2 ->
    let
      key =
        createKey keySeed

      key2 =
        createKey keySeed2
    in
      let
        encryptedMessage =
          encrypt key msg
      in
        Expect.equal Nothing (decrypt key2 encryptedMessage)

1 个答案:

答案 0 :(得分:2)

您可以创建一个模糊器,生成一个具有如下唯一值的元组:

uniqueTuple : Fuzzer comparable -> Fuzzer (comparable, comparable)
uniqueTuple fuzzer =
    let
        uniquer (a, b) =
            if a == b then
                tuple (constant a, fuzzer)
                    |> Fuzz.andThen uniquer
            else
                constant (a, b)
    in
        tuple (fuzzer, fuzzer)
            |> Fuzz.andThen uniquer

这个想法是它需要一个现有的模糊器(如int),然后生成一个元组。如果两个值相等,则保持第一个并尝试为第二个值生成新的模糊值。递归执行此操作直到值不同。

你可以单独使用模糊测试器进行测试:

fuzz (uniqueTuple int) "All pairs are unique" <|
  \(a, b) ->
      Expect.notEqual a b