使用内存磁盘进行 I/O 单元测试

Posted

技术标签:

【中文标题】使用内存磁盘进行 I/O 单元测试【英文标题】:Using Memory Disk for I/O unit tests 【发布时间】:2012-03-14 08:33:11 【问题描述】:

我在 C# 中有以下设置 - 我有一个组件,它在构造函数中获取文件夹路径,然后,一些巨大的数据由它处理并以多个文件的形式写入磁盘(数量级约为 1Gb ,非常 IO 密集型)。在检索时,数据被读入(也是 IO 密集型),我的单元测试(nunit 和 MOQ,实际上是组件测试)将它们与原始数据进行比较。问题 - 单元测试需要几分钟才能完成,这很烦人。我想,有没有办法在测试夹具设置中创建 RAMDrive 或 RAMFolder,并在拆卸时将其删除。我不能使用内存文件或内存流,因为在组件之外没有人应该知道确切使用了哪些文件。

有什么想法吗?

最好的问候, 彼得

【问题讨论】:

【参考方案1】:
    获取 SSD 减少单元测试 在单独测试的子组件中抽象存储访问...然后使用内存中的数组模拟文件。

三种可行的方法。我会尝试使用 3 - 并且仍然购买 SSD。 SSD 非常适合大量的小型 IO 内容,猜猜编译是什么(甚至 C# - 大量的源文件)。

【讨论】:

SSD 会很好,但它需要不是一个,而是每个员工 1 个(TDD,在交付策略之前运行所有测试)以及多个构建服务器 - 那不是(还;))我的决定水平。减少单元测试在这里也不成问题。添加一个子组件级别 - 也许,我需要考虑这一点,但它也需要对不止一个组件进行介绍。 好吧,我现在将所有磁盘替换为 120gb ssd 供开发人员使用。另外 - 我的构建服务器会检查签入(在将更改合并到主干之前在服务器上构建和测试)。 好吧,如果你能说服公司将所有 5000 名开发人员全部切换到 SSD,或者至少我们的大约 250 人的部门 - 我当然会玩;) 这很容易 - 认真。我不知道你付给开发人员多少钱,但在我的世界(和水平)中,120gb SSD 的成本相当于大约一个小时的发票时间。即使在印度或中国,5000 名开发人员的基础设施成本完全使 SSD 的成本相形见绌。【参考方案2】:

为什么你需要在测试后拆掉它?为什么不在ClassCleanup 中进行单元测试后清空所有文件?

作为 RAMdisk 软件,您可能需要通过http://www.superspeed.com/desktop/ramdisk.php查看 RAMDisk 11。

您当然也可以模拟文件的实际写入,不是吗?

【讨论】:

我很快调查了 RAMDisk,但它需要安装。对我来说,获得一个不需要安装的解决方案会更好,因为它需要安装在多个构建服务器(我无法真正访问)和所有员工机器上。可能需要在这里搜索模拟选项...【参考方案3】:

我会尝试让业务对象带有两个 api,一个带有文件名(用于现有代码),一个带有流。

文件 api 只是一个将调用转换为处理完成的 streamapi 的薄层。

单元测试可以使用stream-api(即内存流),而wole系统通过fileapi处理文件流

【讨论】:

以上是关于使用内存磁盘进行 I/O 单元测试的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 命令行单元测试(和文件 I/O)

springboot使用RestTemplate单元测试时,提示ResourceAccess I/O error on POST request for "http(转)

使用内存数据库进行单元测试

用于单元测试的内存 DBMS

如何在内存中进行单元测试 Spring-Jersey

领域模型在运行单元测试时不存储数据