【问题标题】:Unit test view rendering time in WPFWPF中的单元测试视图渲染时间
【发布时间】: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 框架和LightInject 进行注入依赖。

所以这让我想到一个问题,这些测试在现实中有多可靠?

【问题讨论】:

  • 也许在这里异步执行任务可能有用?

标签: mvvm c# wpf unit-testing rendering


【解决方案1】:

所以我相信我找到了(至少部分地)我自己的问题的答案:

时间上的差异是因为在通过单元测试进行测量时,只考虑了视图(xaml + cs)的加载时间。

当通过视图构造函数执行此操作时,视图模型也在秒表停止计数之前被加载!

要记住的另一件事是构建选项。在不调试的情况下执行单元测试时,时间大大减少(有问题的视图平均从 128.9 毫秒变为 90 毫秒)。

即使我相信我找到了答案,我也会留下问题,以防有人有比我使用的更好的答案或衡量方法。

【讨论】:

    猜你喜欢
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    相关资源
    最近更新 更多