这是一种跨越 StackOverflow 和 SuperUser 之间灰色地带的问题。我怀疑答案很可能涉及与代码相关的解决方案,例如创造性地使用 StopWatch
,所以我会在这里提问。
我正在使用 Visual Studio 2013 对依赖 Entity Framework 数据模型的 Controller 执行单元测试。 Test Explorer 在一个简短的列表中很好地展示了我的测试结果以及它们耗时。
不过,我发现我的 Controller 单元测试花费的时间比我预期的要长得多。我开始怀疑这是由于我用来创建模拟(使用 Moq,但这无关紧要)实体模型的初始化代码所致。
果然,显示初始化例程包含在耗时中是一件小事。
[TestClass]
public class InitializeTest
{
[TestInitialize]
public void Initialize()
{
Thread.Sleep(10000);
}
[TestMethod]
public void TestInitializeRuntime()
{
Assert.Inconclusive();
}
}
这在测试资源管理器中产生了以下输出:
这使得我的模拟实体模型支持的测试耗时相当无用,因为初始化代码通常消耗超过 95% 的测试耗时。每种方法看起来都很慢,但实际上并非如此。
是否有替代配置或一些创造性的代码使用(如 StopWatch
,如前所述),允许我仅报告测试方法的耗时,不包括初始化或花费的时间清理测试?
最佳答案
我今天发现了一种在 MSTest 中处理昂贵初始化的方法,而不会导致测试报告缓慢。我发布这个答案以供考虑而不接受它,因为它确实有一点代码味道。
MSTest 每次运行测试时都会创建一个新的测试类实例。由于这种行为,在实例构造函数中编写的代码每次测试只出现一次。这与 [TestInitialize]
方法的行为类似,但有一个异常(exception):MSTest 在创建测试类实例之后和之前 执行 [TestInitialize]
例程。
由于这种特定于 MSTest 的行为,可以将应该从自动生成的计时统计信息中省略的初始化代码放在构造函数中。
为了证明我的意思,请考虑以下测试和生成的输出。
测试:
public class ConstructorTest
{
public ConstructorTest()
{
System.Threading.Thread.Sleep(10000);
}
[TestMethod]
public void Index()
{
}
[TestMethod]
public void About()
{
}
}
输出:
我的想法:
上面的代码确实产生了我正在寻找的效果;然而,虽然它appears safe要使用构造函数或 [TestInitialize]
方法来处理初始化,我必须假设后者存在于此框架中是有充分理由的。
在某些情况下,在计算中包含初始化时间的报告可能会有用,例如在估计大量测试预计会消耗多少实时时间时。
Rich Turner 关于时间敏感的操作如何配得上带断言的秒表的讨论也值得肯定(我也投了赞成票)。另一方面,我将 Visual Studio 提供的自动生成的计时报告视为一种有用的工具,可以识别失控的测试,而无需在每个测试中编写计时样板代码。
总而言之,我很高兴找到了解决方案,也很欣赏这里讨论的替代方案。
干杯!
关于c# - 有没有办法计算忽略初始化时间的测试方法的运行时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28334337/