Is it possible to display progress during the execution of a Visual Studio TestMethod?
unit-testing, visual-studio-2008
Solution
I just start a GUI thread with a Window that has the progressbar.
Here's a snippet to get you started. It simply pops up MyProgressWindow in another thread (rather than another process).
[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();
}
Problem
Is there a way I can show the progress of a single TestMethod In Visual Studio 2008 ? Within a set of unit tests, I have a single TestMethod that runs for a very, very long time - normally it will take between 30 and 60 minutes. I've set the Timeout using the [Timeout] attribute, no problem there. But I'd like to be able to get a visual indication of progress of the test. I know the Test Results window gives a visual progress update of all the test methods. What I want is a visual progress update of a single method. In a WinForms app I would popup a ProgressBar control. In a console app, I would position the cursor and display a status message. But this is a unit test. I can write to the TestContext, but that window is not viewable until the test completes. EDIT: I know there is a way to do it; it's all just software, so there is always a way. But what is a simple, practical way? One way to do it is to create a TestMethodProgressMonitor.exe app, which reads from a named pipe, and updates a progress bar based on the messages that come through the pipe. The TestMethod can shellExec the TestMethodProgressMonitor.exe, then write to the named pipe. When finished, maybe there is a well-known shutdown command that the TestMethod sends to the TestMethodProgressMonitor.exe app. Another option is to construct the TestMethodProgressMonitor.exe as a COM server, and the TestMethod can use COM (DCOM) to update a hosted progress bar within the app. Another option is to use the user32.dll SendMessage() method to send a WM_COPYDATA message to the monitor app. This is sometimes done for remote control of apps. Those are some of the possibilities. Before I set about building one of them, I'd like to know if there is a simpler way.