使用内存磁盘进行 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 单元测试的主要内容,如果未能解决你的问题,请参考以下文章
springboot使用RestTemplate单元测试时,提示ResourceAccess I/O error on POST request for "http(转)