【发布时间】:2018-10-08 18:52:48
【问题描述】:
.NET 有没有办法,我可以为自动化测试添加假 I/O?
我看到了这个问题:How to best simulate IO bound work?
它在概念上与我想要做的类似,但由于我在此测试中测量的不是时间而是实际的 I/O,因此标记的解决方案将不起作用。本质上,我并不关心操作是什么,因为它与测试无关,但是对于这个测试,我希望增加实际的 I/O,以证明它可以在被测应用程序中被跟踪。我说我不在乎它是什么,但如果可能的话,一个更快的操作会立即提高操作系统测量的 I/O 将是理想的。
我正在使用内置 (Windows) .NET PerformanceCounters,但我不想在此测试中模拟它们 - 我想知道它们正在正确地跟踪,在这种情况下,I/O。
测试代码:
[TestMethod]
public void GetCurrentIO()
{
_SUT.StartTrackingIO();
long result = default;
Parallel.Invoke(
_SimulateIOLoad,
() => { result = _SUT.GetCurrentIO(); }
);
Assert.IsTrue(result > 0, "Current IO value should be above 0");
}
【问题讨论】:
-
您使用的是哪个模拟框架?
-
.NET 库现在对管道有很好的支持...我建议看看这些是否会影响您关心的性能计数器。管道上的 I/O 无需磁盘访问即可发生,因此它几乎与“即时”一样接近。
-
你是在说读/写磁盘吗?将一个大文件加载到 MemoryStream 中,然后将其写入单独的文件并在循环中重复删除它们怎么样?
-
@ryanwebjackson - 是的,它必须是异步的,您才能在 IO 进行时进行检查。您可以使用 Task.Run 之类的东西来启动 IO 操作,然后只要您不等待结果,您应该能够继续前进并在下一行执行其他操作(例如监控影响)并且两者应同时进行。
-
管道不是物理磁盘读取,所以这就是您正在查看的性能计数器不受影响的原因。您需要查看管道的性能计数器。