我有没有办法在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消息发送到监视器应用程序。这有时用于远程控制应用程序。
这些是一些可能性。在我开始构建其中一个之前,我想知道是否有更简单的方法。
答案 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。消息只是字符串。这就是他们所做的:
然后,在[TestMethod]中,我搜索UnitTestProgressMonitor.exe,然后创建一个收发器并发送应用程序消息。
测试代码将“条3”发送到进度监视器应用程序,告诉它创建3个进度条。第一个跟踪测试中的7个步骤。第二个进度条测量zip文件的进度;文件中的每个条目都是条形图中的一个步骤。第3个栏是个人录入的进度。其中一些是数千兆字节的文件,因此压缩它们可能需要一段时间。在执行测试期间,测试在适当的时间发送“pb 0步”或其他任何内容。这些消息会导致进度条更新。在测试结束时,测试代码向监视器应用程序发送“停止”。响应于此,进度监视器应用程序消失。测试结束。
Unit Test Progress Monitor http://www.freeimagehosting.net/uploads/45b4979b92.jpg