在单元测试中测量一个方法的执行时间,如果它运行得太慢,就会抛出异常,这是一种好的做法吗

本文关键字:抛出异常 一种 一个 测量 单元测试 方法 执行时间 运行 如果 | 更新日期: 2023-09-27 18:27:35

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

[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");
}

在单元测试中测量一个方法的执行时间,如果它运行得太慢,就会抛出异常,这是一种好的做法吗

不,不是。

单元测试不是在"正常"条件下进行的,因此结果将毫无用处。

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

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

您应该使用测试框架提供的适当机制,如:http://nunit.org/index.php?p=timeout&r=2.5

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

否。它将测试失败/成功的单元与机器/环境相结合。你不希望机器较慢的人因为…而导致单元测试失败。。。嗯,机器慢一点?

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

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

这取决于应用程序。

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

但你仍然必须处理它。为什么不在它发生的地方处理它呢?