是否可以在执行Visual Studio TestMethod期间显示进度?

时间:2009-06-16 17:48:50

标签: visual-studio-2008 unit-testing

我有没有办法在Visual Studio 2008中显示单个TestMethod的进度?

在一组单元测试中,我有一个运行非常长时间的TestMethod - 通常需要30到60分钟。我使用[超时]属性设置了超时,没问题。但我希望能够直观地了解测试的进展情况。

我知道“测试结果”窗口提供了所有测试方法的可视化进度更新。我想要的是单个方法的视觉进度更新。在WinForms应用程序中,我会弹出一个ProgressBar控件。在控制台应用程序中,我将定位光标并显示状态消息。但这是一个单元测试。我可以写入TestContext,但在测试完成之前,该窗口是不可见的。


编辑:我知道有办法做到这一点;它只是软件,所以总有办法。但是什么是简单实用的方法呢?

一种方法是创建一个TestMethodProgressMonitor.exe应用程序,该应用程序从命名管道读取,并根据通过管道传递的消息更新进度条。 TestMethod可以shellExec TestMethodProgressMonitor.exe,然后写入命名管道。完成后,可能有一个众所周知的关闭命令,TestMethod发送到TestMethodProgressMonitor.exe应用程序。

另一种选择是将TestMethodProgressMonitor.exe构造为COM服务器,TestMethod可以使用COM(DCOM)更新应用程序中的托管进度条。

另一种选择是使用user32.dll SendMessage()方法将WM_COPYDATA消息发送到监视器应用程序。这有时用于远程控制应用程序。

这些是一些可能性。在我开始构建其中一个之前,我想知道是否有更简单的方法。

4 个答案:

答案 0 :(得分:5)

我刚刚启动一个带有进度条的Window的GUI线程。

这是一个让你入门的片段。它只是在另一个线程(而不是另一个进程)中弹出MyProgressWindow。

[ClassInitialize()]
static public void MyClassInitialize(TestContext testContext)
{
    start_app_in_gui_thread();
}

static Thread t;

private static void start_app_in_gui_thread()
{
    t = new Thread(() => {
        var w = new MyProgressWindow();
        var app = new App();
        app.ShutdownMode = ShutdownMode.OnMainWindowClose;
        app.Run(w);
    });
    t.SetApartmentState(ApartmentState.STA);
    t.Start();
}

答案 1 :(得分:1)

对于我长时间运行的测试,我使用Trace API来附加跟踪侦听器(DbgView或其他自定义)。

让人很容易看到发生了什么,而不必跳过任何篮球。

这不会给你一个进度条体验(尽管你可以很容易地写一个)。

答案 2 :(得分:1)

我遇到了同样的要求,但任何新文件或可执行文件对我来说都太过分了:我正在编写单元测试,而不是应用程序。以下代码将进度写入Debug Output窗口:

    [TestMethod]
    public void ProgressTest()
    {
        int nLastWritten = -1, nTotal = 10000;

        for (int i = 0; i < nTotal; i++)
        {
            int nProgress = 100 * i / nTotal;
            if (nProgress > nLastWritten)
            {
                System.Diagnostics.Trace.WriteLine("Progress: " + nProgress + "%");
                nLastWritten = nProgress;
            }
        }
    }

答案 3 :(得分:0)

不确定这是最简单的方法,但这就是我所做的。我修改了一个发送和接收WM_COPYDATA的类。这是一个收发器。这允许一个Windows应用程序在同一台计算机上与另一个Windows应用程序进行通信,延迟相当低。我把它打包成一个组件。

然后我构建了一个winforms应用程序(UnitTestProgressMonitor.exe),用于创建其中一个收发器,并根据收到的消息更新其UI。消息只是字符串。这就是他们所做的:

  • bars 3 - UI创建并显示3个进度条
  • pb 0 max 100 - 将进度条#0的最大值设置为100
  • pb 0 value 28 - 将进度条#0的值设置为28
  • 停止 - 退出。

然后,在[TestMethod]中,我搜索UnitTestProgressMonitor.exe,然后创建一个收发器并发送应用程序消息。

测试代码将“条3”发送到进度监视器应用程序,告诉它创建3个进度条。第一个跟踪测试中的7个步骤。第二个进度条测量zip文件的进度;文件中的每个条目都是条形图中的一个步骤。第3个栏是个人录入的进度。其中一些是数千兆字节的文件,因此压缩它们可能需要一段时间。在执行测试期间,测试在适当的时间发送“pb 0步”或其他任何内容。这些消息会导致进度条更新。在测试结束时,测试代码向监视器应用程序发送“停止”。响应于此,进度监视器应用程序消失。测试结束。

Unit Test Progress Monitor http://www.freeimagehosting.net/uploads/45b4979b92.jpg