簡體   English   中英

如何測試抽象數據類型?

[英]How to test an abstract data type?

假設我們有一個定義抽象類型T的模塊:

module AbstractType (T, lexer) where

data T = T String deriving Show

lexer = (fmap T) . words

(請注意,我們不會為T導出任何類型構造函數,因此用戶將無法手動草擬實例。)

一個單元如何測試lexer功能?

當然我們可以使用T的Show屬性,如下所示:

module Main where

import AbstractType

main = test
    (show $ lexer "summer is miles and miles away")
        "[T \"summer\",T \"is\",T \"miles\",T \"and\",T \"miles\",T \"away\"]"

test :: (Eq a) => a -> a -> IO ()
test expression expectation
    | expression == expectation = putStrLn "Test passed."
    | otherwise = error "Test failed."

- 但是當我們的抽象類型不是允許轉換為另一個可構造類型的類的實例時,這既不美觀又不適合。

有補救措施嗎?

PS為案例提供一些理由:假設我們有一系列函數,如parser . lexer parser . lexer我們可以進行集成測試,看看它是否全部有效。 由於手頭的鏈條變得更加復雜,因此可能需要單獨對每個鏈路進行單元測試。

該示例是我正在編寫的實際玩具文本處理器的簡化摘錄。

對於暴露的模塊A普遍接受的最佳實踐是創建內部模塊A.Internal是:

  1. 暴露但記錄不穩定或不安全。

  2. 不暴露給包的用戶,而只暴露給測試設施。 (這可以通過Cabal 2.0中發布的內部庫功能實現。)

我的理解是,未暴露的功能享受更激進的優化,特別是內聯。 我不確定它是否也適用於內部庫中的函數。

另一方面,當用戶迫切需要您的庫的某些內部功能並最終分叉並修補它以獲得訪問權限時,通常會出現這種情況。 當然,這是不幸和不可取的。

我一般會說抽象類型的實現最好保存在內部庫中作為安全措施,但你應該在每個特定情況下使用你的判斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM