繁体   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