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

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

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

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

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

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

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

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

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

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

Вывод

введите описание изображения здесь

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

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

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

Давайте будем гением компьютера.