Как написать в Console.Out во время выполнения теста MSTest - PullRequest
108 голосов
/ 03 февраля 2011

Контекст:
У нас есть пользователи, сообщающие о проблемах с функцией загрузки файлов в нашем веб-приложении. Это происходит только изредка и без какой-либо особой картины. Мы пытались выяснить это в течение долгого времени, добавляя отладочную информацию везде, где, как нам кажется, она может помочь, сканируя журналы и т. Д., Но мы не смогли воспроизвести или выяснить это.

Проблема:
Сейчас я пытаюсь воспроизвести это, используя MSTest и WatiN, чтобы повторить операцию, которая должна провалиться большое количество раз (несколько сотен). Чтобы понять, как далеко продвинулся тест, я хочу напечатать что-то вроде:

Console.WriteLine(String.Format("Uploaded file, attempt {0} of {1}", i, maxUploads));

Это, однако, не отображается в окне вывода. Теперь я знаю, что вы получите консольный вывод в результатах теста (а также то, что вы выводите из Debug.Writeline и т. Д.), Но это невозможно до после теста. И поскольку мой тест с сотнями повторений может занять довольно много времени, я хотел бы знать, как далеко он продвинулся.

Вопрос:
Есть ли способ получить вывод консоли в окне «Вывод» во время выполнения теста?

Ответы [ 5 ]

104 голосов
/ 03 февраля 2011

Вывод на консоль не отображается из-за того, что внутренний код не выполняется в контексте теста.

Возможно, вам лучше использовать Trace.WriteLine (в System.Diagnostics) и затем добавить прослушиватель трассировки, который записывает в файл.

В этом разделе MSDN показан способ сделать это.


Согласно комментариям Марти Нила и Дейва Андерсона:

using System;
using System.Diagnostics;

...

Trace.Listeners.Add(new TextWriterTraceListener(Console.Out));
// or Trace.Listeners.Add(new ConsoleTraceListener());
Trace.WriteLine("Hello World");
69 голосов
/ 18 декабря 2012

Используйте Debug.WriteLine.Это немедленно отобразит ваше сообщение в окне Output.Единственное ограничение - запуск теста в режиме Debug.

[TestMethod]
public void TestMethod1()
{
    Debug.WriteLine("Time {0}", DateTime.Now);
    System.Threading.Thread.Sleep(30000);
    Debug.WriteLine("Time {0}", DateTime.Now);
}

Вывод

enter image description here

13 голосов
/ 01 февраля 2012

Я нашел собственное решение. Я знаю, что ответ Andras, вероятно, наиболее соответствует MSTEST, но я не чувствовал необходимости рефакторинга своего кода.

[TestMethod]
public void OneIsOne()
{
    using (ConsoleRedirector cr = new ConsoleRedirector())
    {
        Assert.IsFalse(cr.ToString().Contains("New text"));
        /* call some method that writes "New text" to stdout */
        Assert.IsTrue(cr.ToString().Contains("New text"));
    }
}

Одноразовый ConsoleRedirector определяется как:

internal class ConsoleRedirector : IDisposable
{
    private StringWriter _consoleOutput = new StringWriter();
    private TextWriter _originalConsoleOutput;
    public ConsoleRedirector()
    {
        this._originalConsoleOutput = Console.Out;
        Console.SetOut(_consoleOutput);
    }
    public void Dispose()
    {
        Console.SetOut(_originalConsoleOutput);
        Console.Write(this.ToString());
        this._consoleOutput.Dispose();
    }
    public override string ToString()
    {
        return this._consoleOutput.ToString();
    }
}
3 голосов
/ 01 февраля 2016

У меня была такая же проблема, и я "запускал" тесты.Если я вместо этого «Отладка» тестирую, выходные данные отладки отображаются так же хорошо, как и все остальные трассировки и консоли.Я не знаю, как увидеть результат, если вы «запустите» тесты.

0 голосов
/ 03 февраля 2011

Вам лучше настроить отдельный тест и создать тест производительности из этого теста. Таким образом, вы можете отслеживать прогресс, используя набор инструментов по умолчанию.

...