【问题标题】:Add fake I/O for test添加假 I/O 进行测试
【发布时间】: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 操作,然后只要您不等待结果,您应该能够继续前进并在下一行执行其他操作(例如监控影响)并且两者应同时进行。
  • 管道不是物理磁盘读取,所以这就是您正在查看的性能计数器不受影响的原因。您需要查看管道的性能计数器。

标签: c# .net


【解决方案1】:

我没有伪造它,而是创建了一个文件并循环测量:

private long _SimulateIOLoad()
{
    long current = 0;
    while (current <= 0)
    {
        var count = 0;
        var file = Path.GetTempPath() + $"simulateIOLoad-{count}.txt";
        File.WriteAllText(file, "simulateIOLoad");
        File.Delete(file);
        current = _SUT.GetCurrentIO();
        ++count;
    }
    return current;
}

在我的测试中,这证明可以测量大于 0 的 I/O 值。这不是我最初想要的,但它的运行速度非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多