Можно ли отобразить прогресс во время выполнения Visual Studio TestMethod? - PullRequest
7 голосов
/ 16 июня 2009

Есть ли способ показать прогресс одного TestMethod в Visual Studio 2008?

В рамках набора юнит-тестов у меня есть один TestMethod, который работает очень и очень долго - обычно это занимает от 30 до 60 минут. Я установил время ожидания с помощью атрибута [Timeout], никаких проблем нет. Но я бы хотел получить визуальное представление о ходе теста.

Я знаю, что в окне «Результаты теста» отображается визуальное обновление всех методов тестирования. То, что я хочу, это визуальное обновление прогресса одного метода. В приложении WinForms я бы выскочил элемент управления ProgressBar. В консольном приложении я бы поместил курсор и отобразил сообщение о состоянии. Но это юнит тест. Я могу написать в TestContext, но это окно невозможно просмотреть, пока тест не завершится.


РЕДАКТИРОВАТЬ : Я знаю, что есть способ сделать это; это всего лишь программное обеспечение, поэтому всегда есть способ. Но что такое простой, практичный способ?

Один из способов сделать это - создать приложение TestMethodProgressMonitor.exe, которое читает из именованного канала и обновляет индикатор выполнения на основе сообщений, поступающих через канал. TestMethod может выполнить ShellExec TestMethodProgressMonitor.exe, а затем записать в именованный канал. Когда закончите, возможно, есть известная команда выключения, которую TestMethod отправляет приложению TestMethodProgressMonitor.exe.

Другим вариантом является создание TestMethodProgressMonitor.exe в качестве COM-сервера, и TestMethod может использовать COM (DCOM) для обновления размещенного индикатора выполнения в приложении.

Другой вариант - использовать метод SendMessage () user32.dll для отправки сообщения WM_COPYDATA в приложение монитора. Иногда это делается для удаленного управления приложениями.

Это некоторые из возможностей. Прежде чем приступить к созданию одного из них, я хотел бы знать, есть ли более простой способ.

Ответы [ 4 ]

5 голосов
/ 16 июня 2009

Я просто запускаю поток 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 голос
/ 30 марта 2012

Я выполнил то же требование, но любой новый файл или исполняемый файл звучит для меня слишком много: я пишу юнит-тест, а не приложение. Следующий код записывает прогресс в окно вывода отладки:

    [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;
            }
        }
    }
1 голос
/ 16 июня 2009

В своих длительных тестах я использую API-интерфейсы Trace для подключения прослушивателя трассировки (DbgView или что-то другое)

Упрощает наблюдение за происходящим без необходимости прыгать через обручи.

Это не даст вам индикатор выполнения (хотя вы могли бы написать его довольно легко).

0 голосов
/ 17 июня 2009

Не уверен, что это самый простой способ, но это то, что я сделал. Я взломал класс, который отправляет и получает WM_COPYDATA. Это трансивер. Это позволяет одному приложению Windows взаимодействовать с другим на одном компьютере с достаточно низкой задержкой. Я упаковал его как сборку.

Затем я создал приложение winforms (UnitTestProgressMonitor.exe), которое создает один из этих трансиверов и обновляет его пользовательский интерфейс на основе полученных сообщений. Сообщения - это просто строки. Вот что они делают:

  • баров 3 - пользовательский интерфейс создает и отображает 3 индикатора выполнения
  • pb 0 max 100 - устанавливает максимум для индикатора выполнения № 0 на 100
  • pb 0 value 28 - устанавливает значение для индикатора выполнения от 0 до 28
  • Стоп - выход.

Затем, в [TestMethod], я shellexec UnitTestProgressMonitor.exe, затем создаю приемопередатчик и отправляю сообщения приложения.

Тестовый код отправляет «бары 3» в приложение монитора прогресса, чтобы сообщить ему о создании 3 индикаторов выполнения. Первый отслеживает 7 шагов в тесте. 2-й индикатор выполнения показывает прогресс в zip-файле; каждая запись в файле - это шаг вдоль панели. 3-й бар - это прогресс для отдельной записи. Некоторые из них представляют собой файлы размером в несколько гигабайт, поэтому их сжатие может занять некоторое время. Во время выполнения теста, тест отправляет «шаг pb 0» или что-то еще, в соответствующие моменты времени. Эти сообщения вызывают обновление индикаторов. В конце теста тестовый код отправляет «стоп» в приложение монитора. В ответ на это приложение монитора прогресса исчезает. Тест заканчивается.

Монитор хода выполнения модульных испытаний http://www.freeimagehosting.net/uploads/45b4979b92.jpg

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...