用于测试C代码的仿真/伪造文件系统?

时间:2010-07-07 10:51:48

标签: c unit-testing cross-platform filesystems

我正在寻找跨平台方法来测试我的应用程序中需要访问文件系统(写入和读取二进制数据)的一些功能。在现实生活中,我的应用程序在Linux上运行并在/usr/local/etc目录中存储特殊数据。但是应用程序的主要部分是跨平台库,它应该在Windows和Linux上进行测试。此外,我不希望我的测试直接向/usr/local/etc写入/读取数据,因为在这种情况下它会破坏测试隔离。

所以我正在考虑用文件系统的特殊模拟器替换对文件系统的实际访问。因此,每个需要访问文件系统的测试都可以创建vistual文件系统对象的新实例,我可以单独运行测试,并在Windows上正确支持测试。

我试图找到一些现有的开放/免费实现,但到目前为止找不到C代码。任何提示?

更新: chroot的仅限Linux的解决方案对我来说不适用。

3 个答案:

答案 0 :(得分:4)

我会使文件系统位置可配置 - 使用命令行选项,或者使用环境变量(这两者在Linux和Windows中都可以正常工作)。

默认值可以是/usr/local/etc/,但是对于测试(或在Windows上),您可以指定其他位置。如果您正在运行多个命令,那么环境变量方法的效果特别好,因为您可以将变量设置一次,然后只运行命令,就像它们使用默认存储位置时一样。

对于这两种方法,值得考虑是否存在任何安全隐患,使位置可配置 - 通常不存在(可执行文件只能执行用户可能已经完成的操作),但是如果你你正在运行可执行的setuid,你可能需要更多的思考。

答案 1 :(得分:1)

在Linux下,你可以执行fakeroot技巧:LD_PRELOAD一个拦截openreadwrite来电的图书馆,并将它们重定向到您想要的任何内容去做。我不知道是否有一种等效的方式将代码注入到Windows二进制文件中。

chroot是另一种为测试程序提供自己的fs层次结构的方法。您也可以尝试为fopen和friends编写自己的libc存根,并将此lib链接到您的测试程序,但这不会拦截其他库的调用。

另一种方法可能是一个io抽象层,比如openssl BIO,可以通过替换抽象库轻松拦截io调用。

答案 2 :(得分:1)

如何在qemu下进行测试并使用相同的预先制作的文件系统映像开始每次运行?