有没有一种方法可以计算测试方法的运行时间,忽略初始化所花费的时间?

2023-11-30

这种问题属于 StackOverflow 和 SuperUser 之间的灰色地带。我怀疑答案可能涉及与代码相关的解决方案,例如创造性地使用StopWatch,我就在这里问一下。

我正在使用 Visual Studio 2013 对依赖于实体框架数据模型的控制器执行单元测试。测试资源管理器在一个简短的列表中很好地呈现了我的测试结果及其经过的时间。

但我发现我的控制器单元测试花费的时间比我预期的要长得多。我开始怀疑这是由于我用来创建模拟(使用 Moq,但这并不重要)实体模型的初始化代码所致。

果然,显示初始化例程包含在经过的时间里是一件小事。

[TestClass]
public class InitializeTest
{
    [TestInitialize]
    public void Initialize()
    {
        Thread.Sleep(10000);
    }

    [TestMethod]
    public void TestInitializeRuntime()
    {
        Assert.Inconclusive();
    }
}

这在测试资源管理器中产生了以下输出:

Screenshot of Test Explorer

这使得我的模拟实体模型支持的测试所用时间相当无用,因为初始化代码通常消耗超过测试所用时间的 95%。每种方法看起来都很慢,但实际上并非如此。

是否有替代配置或对代码的一些创造性使用(例如StopWatch,如前所述),这将允许我仅报告测试方法所花费的时间,不包括初始化或清理测试所花费的时间?


今天我发现了一种在 MSTest 中处理昂贵的初始化的方法,而不会导致测试报告缓慢。我发布这个答案以供考虑,但没有接受它,因为它确实具有适度的代码味道。

MSTest 每次运行测试时都会创建测试类的新实例。由于这种行为,实例构造函数中编写的代码每次测试都会发生一次。这与以下行为类似[TestInitialize]方法,但有一个例外:MSTest 开始对单元测试计时after创建测试类的实例并before执行[TestInitialize]常规。

由于这一特定于 MSTest 的行为,我们可以将应从自动生成的计时统计信息中省略的初始化代码放入构造函数中。

为了证明我的意思,请考虑以下测试和生成的输出。

Test:

public class ConstructorTest
{
    public ConstructorTest()
    {
        System.Threading.Thread.Sleep(10000);
    }

    [TestMethod]
    public void Index()
    {
    }

    [TestMethod]
    public void About()
    {
    }
}

Output:

Screenshot of results

我的想法:

上面的代码确实产生了我想要的效果;然而,虽然它看起来很安全使用构造函数或[TestInitialize]方法来处理初始化,我必须假设后者存在于这个框架中是有充分理由的。

在某些情况下,在计算中包含初始化时间的报告可能很有用,例如在估计一大组测试预计消耗多少实时时间时。

Rich Turner 关于时间敏感操作如何值得带有断言的秒表的讨论也值得认可(并且得到了我的投票)。另一方面,我将 Visual Studio 提供的自动生成的计时报告视为有用的工具,可以识别失控的测试,而无需在每个测试中编写计时样板代码。

总而言之,我很高兴找到了解决方案,并且也很欣赏这里讨论的替代方案。

Cheers!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有一种方法可以计算测试方法的运行时间,忽略初始化所花费的时间? 的相关文章

随机推荐