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


114

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

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

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

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

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


Если вы ищете способ печати для вывода результата теста: stackoverflow.com/a/4787047/621690
Risadinha

Ответы:


111

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

Вам, вероятно, лучше использовать 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");

73
так в основном, Trace.Listeners.Add(new TextWriterTraceListener(Console.Out)); Trace.WriteLine("Hello World");
Марти Нил

7
Хммм, я обнаружил, что предложение @Martin Neal отправляет оба Trace.WriteLine()и Console.WriteLine()вывод в представление результатов тестирования , а не в представление вывода . (И заметьте , что в результаты испытаний View , может быть необходимо добавить выход (Stdout) столбец , щелкнув правой кнопкой мыши и выбрав Add / Remove Columns ... ) . Но, возможно , я еще не видел выход в выходной Вид означает, что я что-то
упускаю

3
Trace.Listeners.Add(new ConsoleTraceListener());достаточно, а затем Показать вывод отладки в окне вывода.
Дэйв Андерсон

3
Я изо всех сил пытался найти результат в VS2017 ... Окно TestExplorer -> Щелкните отдельный тест -> Если тест был выдан, в окне подробностей под прошедшим временем есть слово «выход», которое является ссылкой на новое окно.
Майк Уолш

2
Если вы используете Xunit, просто введите ITestOutputHelper через ctor и вызовите для него WriteLine. Прошло некоторое время, прежде чем я научился писать во время интеграционного тестирования, надеюсь, это кому-то поможет.
Александр Хёст

69

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

Вывод

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


8
требуетusing System.Diagnostics;
kmote

5
Не используйте DateTime.Now. Лучше использовать секундомер ( msdn.microsoft.com/en-us/library/… )
suizo

1
Я не мог заставить это работать. Когда я запускаю тест, окно вывода немедленно переключается на сборку, и в отладку ничего не отправляется. Твои мысли?
InteXX

5
@InteXX убедитесь, что вы нажимаете «Отладка теста», а не «Запустить тест». у меня это сработало
Джон Хенкель

@JohnHenckel: Попался. Спасибо. Сделаю это. На самом деле Шалиасос говорит именно об этом в своем ответе; не уверен, как я это пропустил.
InteXX

13

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

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


Я могу кое-что показать System.Diagnostics.Debug.WriteLineпри отладке тестов, но как вы приступите Console.WriteLineк работе? Для меня это не заканчивается нормальным (обновленным в реальном времени) выводом.
OR Mapper

Вы нашли какие-нибудь способы увидеть результаты во время выполнения тестов?
hima 03

0

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


«Таким образом, вы можете отслеживать прогресс, используя набор инструментов по умолчанию». - как? Проблема, которую я вижу, заключается в том, что после запуска теста это черный ящик, и я вижу результат (который я постепенно пишу во время выполнения теста) только после того, как тест завершится, в окне вывода .
OR Mapper

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.