這個問題適用于任何特定的編程語言。
假設我有一個函式可以將資料結構轉換為十六進制字串。
func toHex(input: data) => string
假設我現在想使用基于屬性的測驗來測驗這個。我如何想出作為測驗基礎的屬性?
我在基于屬性的測驗中看到的所有示例都假定了非常簡單的數學關系。諸如測驗反轉串列或字串是否是另一個字串的子字串之類的事情。
但是在上述toHex函式的情況下,我想不出任何可行的方法來提出屬性,因為看起來唯一的關系是某些資料被轉換為十六進制字串。除了實作查找另一個執行類似操作的庫的轉換功能并將其用于測驗中的斷言之外。但是這樣做會使使用基于屬性的測驗失敗。
關于如何進行基于屬性的測驗以及如何在這種toHex功能的情況下提出在測驗中使用的屬性的任何想法或建議?
uj5u.com熱心網友回復:
信不信由你,這實際上是一個相當普遍的案例,基于屬性的測驗很有用——還有一個補充:
將資料結構轉換為字串(或 JSON、XML 或類似的東西)的函式本身很少有用。通常,您需要它的對應物:反序列化器或決議器。
當您有這樣一對函式時,您可以撰寫Scott Wlaschin 呼叫There 并再次呼叫的 kind 屬性:您生成測驗資料作為序列化器的輸入,然后呼叫序列化器 ( toHex),然后再次呼叫決議器/反序列化器 ( fromHex?) 與序列化資料。因此,屬性是 的輸出fromHex應等于 的輸入toHex。
在撰寫序列化器/決議器對時,這是我首選的測驗策略。你可以在我的文章Types Properties = Software: other properties 中看到一個最小的例子。
有時,根據要解決的問題,當與其他屬性結合時,There and back again屬性可以用作序列化程式的部分描述。這是 FizzBu??zz kata 部分描述的 Haskell QuickCheck 示例:
testProperty "Numbers round-trip" $ \ (i :: Int) ->
let range = [i..i 2]
actual = fizzBuzz <$> range
numbers = catMaybes $ readMaybe <$> actual
in counterexample
(show range "->" show actual) $
all (`elem` range) numbers
該示例取自我的文章Property-based testing is not the same as partition testing。
FizzBu??zz 是一個類似于toHex. 輸入是一個“資料結構”((Integral a, Show a)),輸出是一個String(雖然不是十六進制編碼的)。
決議器通常是回傳Maybe或Either值的部分函式,因此“往返”斷言通常需要驗證諸如Just input === output.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/348010.html
