【发布时间】:2015-05-27 10:40:57
【问题描述】:
我对我的项目有一个要求,即所有视图都应在 500 毫秒内呈现自己,这还没有考虑在视图上绑定数据和/或执行对后端的调用所花费的时间。
应该只测量控件的渲染时间。
我看到了many similar questions here in SO 和其他地方,但没有一个能真正帮助我解决这个问题,因为他们建议在测试之外使用分析器或代码。
到目前为止,我有以下单元测试:
[TestMethod]
public void View_WaitForLoadedEvent_ElapsedTimeDoesNotExceedAllowedLimit()
{
// Arrange.
var dispatcherAction =
new System.Action(() =>
{
this.stopWatch.Stop();
this.elapsedMilliseconds = this.stopWatch.ElapsedMilliseconds;
Dispatcher.ExitAllFrames();
});
this.stopWatch.Start();
Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Loaded, dispatcherAction);
// Act.
var view = new HomeView();
Dispatcher.Run();
// Assert.
Assert.IsTrue(this.elapsedMilliseconds < RenderTimeTests.MaxAllowedRenderingMilliseconds,
RenderTimeTests.GetFormattedErrorMessage(view.ToString(), this.elapsedMilliseconds));
}
现在,在连续执行此测试 10 次后,我得到了 this.elapsedMilliseconds 变量的以下值:
153、140、109、144、131、116、124、127、139、106。 所以平均加载需要 128.9 毫秒。
这些值是相当恒定的,但是在对 StackOverflow 中类似问题的大多数答案中推荐的测试进行测试时,这些值是不同的。
推荐的测试如下:
public HomeView()
{
var sw = new Stopwatch();
sw.Start();
this.Dispatcher.BeginInvoke(
DispatcherPriority.Loaded,
new System.Action(() =>
{
sw.Stop();
MessageBox.Show("Took " + sw.ElapsedMilliseconds + " ms");
}));
this.InitializeComponent();
}
这在消息框上给了我以下值:
206、213、218、203、210、209、210、210、222、230。平均为 213.1。
看起来可能没有那么多,但这些值告诉我实际渲染时间比自动化测试告诉我的要高 60%!
最后,我决定删除MessageBox.Show(...) 方法并用Debug.WriteLine(...) 替换它,只是为了看看是否有任何区别(尽管此时手表不应该再计数了),我得到了以下值:
207, 194, 212, 207, 211, 201, 217, 215, 214, 214。给出平均 209.2,比单元测试结果更接近其他执行。
应用程序使用Caliburn.Micro mvvm 框架和LightInject 进行注入依赖。
所以这让我想到一个问题,这些测试在现实中有多可靠?
【问题讨论】:
-
也许在这里异步执行任务可能有用?
标签: mvvm c# wpf unit-testing rendering