2016-12-08 30 views
4

我剛剛寫了一個模糊測試,基本上檢查對不同輸入的相同函數的兩個調用產生不同的結果。我想告訴Elm-test,輸入不允許相等;否則這個測試案例的失敗概率很低。假設一個!= b 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) 
+0

能否請您提供一些代碼示例,以提供一些更多的上下文這個問題? – halfzebra

+0

@halfzebra增加了一個例子 –

回答

2

您可以創建生成這樣具有唯一值的元組的fuzzer:

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