C# 在单元测试中测量方法的执行时间以在异常运行过慢时抛出异常,这是一种好的做法吗?

C# 在单元测试中测量方法的执行时间以在异常运行过慢时抛出异常,这是一种好的做法吗?,c#,unit-testing,mstest,C#,Unit Testing,Mstest,所有这些都在标题中,我想知道这是否是一种好的做法: [TestMethod] public void Compute_Array_In_Less_1_Second() { Stopwatch watcher = new Stopwatch(); int[] A = Enumerable.Range(0, 50000).Select(i => GetRandomNumber(MIN_INT, MAX_INT)).ToArray(); watcher.Start()

所有这些都在标题中,我想知道这是否是一种好的做法:

[TestMethod]
public void Compute_Array_In_Less_1_Second()
{
    Stopwatch watcher = new Stopwatch();

    int[] A = Enumerable.Range(0, 50000).Select(i => GetRandomNumber(MIN_INT, MAX_INT)).ToArray();

    watcher.Start();
    int[] R = Program.MethodThatReturnsAnArray(A);
    watcher.Stop();

    if (watcher.ElapsedMilliseconds > 1000)
        Assert.Fail("The method runs in more 1 second");
}
不,不是

单元测试不是在“正常”条件下进行的,因此结果将是无用的

使用单元测试来验证代码的正确语义


在接近生产环境的条件下设置性能测试(通常是端到端)

我认为这部分取决于测试的内容。如果这是可能超时的事情(比如,获得网络连接,这确实应该在特定时间内发生),那么它可能是合适的。正如Magrangs所提到的,计时实际上更多的是性能测试,而不是单元测试。单元测试只是检查运行的东西是否真的在做它应该做的事情,而不是检查它是否像它应该做的那样快。

您应该使用测试框架提供的适当机制,例如:


但请注意,您不希望在任何地方都这样做(以测量性能),而是测试单元是否实际按时完成,或者如果需要,是否超时。

这取决于应用程序

如果由于某些外部进程运行太慢而导致数据丢失,则可能需要抛出异常


但你还是要处理它。为什么不在发生故障的地方处理呢?

不。它会将您的单元测试失败/成功与机器/环境联系起来。你不希望机器速度较慢的人因为。。。嗯,速度较慢的机器


这些测试可能仍然有自己的位置,但不是作为单元测试—可能更多的是功能测试或集成测试,而不是由团队中的每个开发人员运行。

单元测试应该测试代码的功能是否正常。您通常不会使用它们来测试性能,性能测试方面的问题:-)我同意这一点,因为您通常会在单元测试中使用mock。有时,如果您希望确保某些方法不被等待,这可能会很有帮助。这看起来也很不可靠。我认为它主要用于测试带有超时参数的方法。