Як написати в 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(In 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 ... ) . Але, можливо , я ще не бачив вихід в вихідний Перегляд означає, що мені чогось не вистачає ...
DavidRR

3
Trace.Listeners.Add(new ConsoleTraceListener());достатньо, а потім у вікні виводу відобразити вихід з налагодження.
Дейв Андерсон

3
Я намагався фактично знайти вихід у VS2017 ... Вікно TestExplorer -> Клацніть на окремому тесті -> Якщо тест закінчився, у вікні деталей під минулий час є слово "ouput", яке є посиланням на нове вікно.
Майк Уолш

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: Gotcha. Дякую. Зробимо це. Насправді Шаліасос каже саме це правильно у своїй відповіді; не впевнений, як я пропустив це.
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

У мене був такий самий випуск, і я "запускав" тести. Якщо я замість цього "налагоджую" тести, то вихід налагодження показує чудово, як і всі Trace та Console. Я не знаю, хоч як побачити вихід, якщо ви "запустіть" тести.


Я можу щось показати, використовуючи System.Diagnostics.Debug.WriteLineпід час тестів налагодження, але як вам Console.WriteLineдоводиться працювати? Це не закінчується нормальним для мене результатом (оновленим в реальному часі).
АБО Mapper

Чи знайшли ви якісь способи бачити результати під час запуску тестів?
хіма

0

Ви краще налаштуйте єдиний тест і створіть тест ефективності з цього тесту. Таким чином ви можете відстежувати хід за допомогою набору інструментів за замовчуванням.


"Таким чином ви можете відстежувати хід за допомогою набору інструментів за замовчуванням." - як? Проблема , яку я бачу точно , що один раз в тестових прогонів, це чорний ящик , і я тільки отримую , щоб побачити результат (який я поступово писати в той час як тест працює) після випробування завершення роботи, в Output вікні .
АБО Mapper

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.