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

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

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

如何告诉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)

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

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),然后生成一个元组.如果两个值相等,则保持第一个并尝试为第二个值生成新的模糊值.递归执行此操作直到值不同.

你可以单独使用fuzzer进行测试:

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