Haskell IO 测试

8
我一直在尝试找出是否已经有一种被广泛接受的方法来测试Haskell中的文件IO操作,但是我还没有找到任何对我所要做的事情有用的信息。
我正在编写一个小型库,执行各种文件系统操作(递归遍历目录并返回所有文件的列表;同步多个目录,使每个目录都包含相同的文件,使用inode作为等式测试和硬链接……),我想确保它们确实有效,但我能想到的唯一测试它们的方法是创建一个具有已知结构的临时目录,并将在此临时目录上执行的函数的结果与已知结果进行比较。问题是,我希望尽可能地获得测试覆盖范围,同时仍然主要是自动化:我不想手动创建目录结构。
我搜索了Google和Hackage,但我在Hackage上看到的软件包没有使用任何测试 - 也许我只选择了错误的软件包 - 而我在Google上找到的任何东西都没有涉及IO测试。
感谢您的帮助
谢谢,詹姆斯
4个回答

2
也许你可以找到一种方法使这个对你有用。
编辑:

我看到的Hackage上的软件包没有使用任何测试。

我在Hackage上找到了一个Haskell的单元测试框架(Test-HUnit)。包括这个框架,也许你可以使用断言来验证你需要的文件是否位于你想要它们存在的目录中,并且它们符合其预期的用途。

谢谢你提供的链接,但我之前已经阅读过那个页面了,它似乎只适用于纯函数,而我现在关心的是测试函数中的不纯部分。不过还是感谢你提供的链接。 - James
是的,我打算使用HUnit和一些更高级的框架,比如test-framework。不过我更感兴趣的是,是否有一种方法可以创建一个模拟虚拟目录结构,并拦截对文件系统的调用以指向虚拟目录,或者是否有一个框架可以自动生成临时目录结构供使用...不过没关系,我想我已经想出了一个小框架的想法,应该很容易实现。谢谢。 - James

2

HUnit是进行基于IO的测试常用的库。我不知道是否有一组用于文件操作的属性/组合器,这将非常有用。


好的,看起来我得想出点什么了。谢谢回复。 - James

1

你的测试代码完全可以创建一个临时目录,在运行不纯净的代码后检查其内容,这样做没有任何问题。


那可能就是我最终要到达的地方,我只是想知道是否有任何标准方法来执行这些检查,不过还是谢谢。 - James
那其实就是你应该这样做的方式。文件夹/文件结构是你的测试数据,操作后的结构是你的测试结果。你需要为你的测试准备它。如果你不想手动创建它,请使用Haskell基本的IO函数在testSetUp中创建这个结构,然后在测试完成后在testTearDown中删除它。或者基本上是在测试之前创建,在测试之后删除。 - yoosiba

1

如果您想对单子代码进行主要的自动化测试,您可能需要研究单子 QuickCheck。您可以编写应该成立的性质,例如

  • 如果您创建具有读取权限的文件,则可以打开该文件以进行阅读。

  • 如果您删除文件,则无法打开文件。

  • 其他任何您能想到的...

QuickCheck将生成随机测试。


谢谢提供链接,我会去查看。 - James
这是以可控的方式完成的,例如,已删除的文件不会永久删除。 - amindfv
现在有其他人控制了chalmers.se域名。 - DJG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接