Как писать в Console.Out во время выполнения теста MSTest

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

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

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

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

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

Ответ 1

Выход Console не появляется, потому что код backend не работает в контексте теста.

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

Этот раздел из MSDN показывает способ сделать это.

Ответ 2

Используйте 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

Ответ 3

Я нашел свое решение. Я знаю, что ответ Андраса, вероятно, наиболее согласуется с 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();
    }
}

Ответ 4

У меня была такая же проблема, и я был "Running" тестов. Если я вместо этого "Отлаживаю" тесты, вывод Debug отображается просто отлично, как и все остальные Trace и Console. Я не знаю, как увидеть результат, если вы "Запускаете" тесты.

Ответ 5

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