Чи можу я записатись на консоль в одиничному тесті? Якщо так, то чому не відкриється вікно консолі?


148

У мене є тестовий проект у Visual Studio. Я використовую Microsoft.VisualStudio.TestTools.UnitTesting .

Я додаю цей рядок в одному з моїх одиничних тестів:

Console.WriteLine("Some foo was very angry with boo");
Console.ReadLine();

Коли я запускаю тест, тест проходить, але вікно консолі взагалі не відкривається.

Чи є спосіб зробити доступним для взаємодії вікно консолі за допомогою тестування одиниць?


1
Це дійсно залежить від бігуна. Ви можете використовувати TestDriven.Net (чудовий, безкоштовний для особистого користування, тестовий бігун) - Console.WriteLine запише на вихідну панель VS.
щоденник

1
Дякуємо за поширення слова на TestDriven.Net
GrayFox374

NCrunch також має цю особливість, яка лише робить її вартістю IMO. У мене є Dumpметод розширення, який виводить вміст об'єкта в консоль, що робить речі набагато простішими для налагодження. i.imgur.com/MEZwy7X.png
DharmaTurtle

Відповіді:


125

ПРИМІТКА. Оригінальна відповідь, наведена нижче, повинна працювати для будь-якої версії Visual Studio, що перебуває через Visual Studio 2012. Схоже, у Visual Studio 2013 більше немає вікна результатів тесту. Натомість, якщо вам потрібен тестовий вихід, ви можете використовувати пропозицію @ Stretch про те, Trace.Write()щоб записати вихід у вікно виводу.


Console.WriteМетод не записує на «консолі» - це пише все , що зачепило до стандартного виводу рукоятки для процесу , запущеного. Аналогічно, Console.Readзчитується вхід з того, що підключено до стандартного вводу.

Під час запуску одиничного тесту через Visual Studio 2010, стандартний висновок переспрямовується тестовим джгутом і зберігається як частина тестового виводу. Ви можете побачити це, клацнувши правою кнопкою миші вікно Результати тестування та додавши на дисплей стовпець "Вихід (StdOut)". Це покаже все, що було написано на стандартний вихід.

Ви можете вручну відкрити вікно консолі, використовуючи P / Invoke, як каже sinni800 . Прочитавши AllocConsoleдокументацію, видно, що функція буде скинута stdinта stdoutобробляється, щоб вказувати на нове вікно консолі. (Я не впевнений у цьому на 100%; мені здається, це неправильно, якщо я вже перенаправлявся stdoutна Windows, щоб викрасти його у мене, але я не намагався.)

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


Спробуйте відкрити нову програму WindowsApplication, використовуючи AllocConsole для виділення консолі, і вона запише туди. Я не знаю, що це насправді, але це може не працювати в середовищі Unit Test. Дійсно було б добре знати ...
sinni800

грн. перечитавши AllocConsoleдокументацію, я можу помилитися, але мені доведеться перевірити її.
Майкл Еденфілд,

2
Для мене цей коментар від Майкла сказав усе, що мені потрібно було подумати: "Коли ви запускаєте тестовий блок через VS2010, стандартний висновок перенаправляється тестовим джгутом і зберігається як частина тестового виходу".
Роберт Паттерсон

5
у VS2013, якщо ви пишете на консолі, на TestExplorer / Test / Summary буде мітка посилання [Output]. Клацніть по ній і отримаєте потрібний вихід. Чекати? Ви також хочете зателефонувати на Console.ReadLine () ??
Візар

3
У V2017 (Спільнота) перейдіть до "тестового провідника", виберіть у списку пункт результату тестування, а потім натисніть на посилання "вихід" в іншому вікні (тестовий вікно результатів?). Оскільки воно, ймовірно, буде усічене, використовуйте "копіювати все" та минуле десь в іншому місці.
heringer

181

Хтось прокоментував цю, очевидно, нову функціональність у Visual Studio 2013. Спочатку я не був впевнений, що він має на увазі, але тепер, коли я це роблю, я думаю, що він заслуговує на власну відповідь.

Ми можемо використовувати Console.WriteLine як правило, і вихід відображається не тільки у вікні Вихід, а у новому вікні, після того як ми натискаємо «Вихідні дані» у тестових деталях.

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


2
Відмінне рішення. Переконайтесь, що він працює в VS2015 Enterprise.
garfbradaz

6
На жаль, не можна вибрати будь-який текст у цій області виводу для копіювання та вставки :( Що вони думали ?!
АБО Mapper

3
@ORMapper, клацніть правою кнопкою миші на області «Стандартний вихід» та виберіть копіювати все
від

2
@ Ovi-WanKenobi спробуйте вивести щось із Console.Write
Tiago Duarte

5
У порівнянні з 2017 роком ви повинні вибрати тест EACH, який виконується, а потім натиснути вихід - не дуже корисно, коли у вас багато тестів. Я хочу бачити весь результат разом - не в окремих вікнах.
inliner49er

37

Ви можете використовувати цей рядок, щоб записати у вихідне вікно Visual Studio:

System.Diagnostics.Debug.WriteLine("Matrix has you...");

Повинно працювати в режимі налагодження.


7
Це не пише на моєму VS
Луїс Філіпе

1
перевірте цю тему для деталей - stackoverflow.com/questions/1159755/…
Дмитро Павлов

1
Для мене це спрацювало за допомогою MSTest та R # для перегляду результатів. Дякую!
Ісаак Бейкер

2
@William він з’являється, якщо ви налагоджуєте тест, але не, якщо ви просто запускаєте його без налагодження.
yoyo

29

Як зазначено, одиничні тести розроблені для роботи без взаємодії.

Однак ви можете налагоджувати тестові одиниці, як і будь-який інший код. Найпростіший спосіб - скористатися Debugкнопкою на вкладці Результати тестування.

Можливість налагодження означає вміти використовувати точки прориву. Тоді мати можливість використовувати точки прориву означає можливість використовувати Tracepoints , що я вважаю надзвичайно корисним у щоденній налагодженні.

По суті, Tracepoints дозволяють писати у вікно Output (або, точніше, на стандартний вихід). За бажанням ви можете продовжувати біг або зупинятись, як звичайна точка перерви. Це дає вам "функціональність", про яку ви просите, без необхідності перебудовувати код або заповнювати його інформацією про налагодження.

Просто додайте точку розриву, а потім клацніть правою кнопкою миші на цій точці розриву. Виберіть опцію "При попаданні ...":

При ударі варіант

Що відкриває діалог:

При попаданні точки розриву

Кілька речей, які слід зазначити:

  1. Зауважте, що точка розриву тепер показана як алмаз, а не сфера, що вказує на точку сліду
  2. Ви можете вивести значення змінної, додавши її на зразок {this}.
  3. Зніміть прапорець "Продовжити виконання", щоб перервати код на цьому рядку, як і будь-який звичайний прорив
  4. У вас є можливість запустити макрос. Будьте уважні - ви можете викликати шкідливі побічні ефекти.

Детальнішу інформацію див. У документації.


24

Існує декілька способів записати вихідні дані з тесту Visual Studio на C #:

  • Console.Write - Тестовий джгут Visual Studio зафіксує це та покаже його, коли ви виберете тест у Провіднику тестів та натисніть посилання Вихід. Хіба НЕ відображається у вікні виводу Visual Studio , коли або працює або налагодження модульного тестування (можливо , це помилка).
  • Debug.Write - Тестовий джгут Visual Studio зробить це і відобразить його у тестовому висновку. З'являється у вікні виводу Visual Studio під час налагодження тесту одиниці, якщо тільки параметри налагодження Visual Studio не налаштовані для перенаправлення виводу на негайне вікно. Нічого не з’явиться у вікні вихідних (або негайних), якщо ви просто запустите тест без налагодження. За замовчуванням доступний лише у збірці налагодження (тобто коли визначена константа DEBUG).
  • Trace.Write - Тестовий джгут Visual Studio зробить це та відобразить його у вихідному тесті. З'являється у вікні виводу Visual Studio (або негайне) під час налагодження тесту одиниці (але не при простому запуску тесту без налагодження). За замовчуванням доступні як у налагодженнях налагодження, так і у версії (тобто, коли визначена константа TRACE).

Підтверджено у Visual Studio 2013 Professional.


1
Зауважте, що правила дещо відрізняються, якщо ви використовуєте NUnit та розширення NUnit Test Adapter для Visual Studio, а не вбудовану тестову рамку Microsoft.
yoyo

9

Можна використовувати

Trace.WriteLine()

записати у вікно виводу під час налагодження тесту одиниці.


5

У Visual Studio 2017 "TestContext" не показує посилання Output в Test Explorer.

Однак Trace.Writeline () показує посилання Output.


Просто FYI, його Trace.WriteLine
TroySteven

4

Перш за все, проектні випробування, за задумом , повинні працювати повністю без взаємодії.

З огляду на це, я не думаю, що існує можливість, про яку думали.

Ви можете спробувати зламати програму AllocConsole P / Invoke, яка відкриє консоль, навіть якщо ваша поточна програма є додатком GUI. Потім Consoleклас буде розміщуватися на відкритій консолі.


1
Гмм .. Головний мій мотив - написати кілька додаткових даних для консолі, щоб побачити більш глибокі деталі. Це буде річ, яка мені згодом, можливо, не знадобиться.
pencilCake


2

IMHO, вихідні повідомлення в більшості випадків актуальні лише для помилкових тестових випадків. Я склав формат нижче, і ви можете зробити свій власний. Це відображається у самому вікні провідника провідної програми Visual Studio.

Як ми можемо кинути це повідомлення у вікно провідника провідної програми Visual Studio?

Приклад такого коду повинен працювати:

if(test_condition_fails)
    Assert.Fail(@"Test Type: Positive/Negative.
                Mock Properties: someclass.propertyOne: True
                someclass.propertyTwo: True
                Test Properties: someclass.testPropertyOne: True
                someclass.testPropertyOne: False
                Reason for Failure: The Mail was not sent on Success Task completion.");

Ви можете мати окремий клас, присвячений цьому для вас.


Я змагався, я також додав би це. У Visual Studio 2019 за допомогою XUNIT ви можете виконати наступні дії: Assert.True (успіх, "ВИДАЛИТИ ЗАПИСИ ЗНАТИ"); DELETE RECORD FAILED з'явиться у VS 2019 Test Explorer. Знову ж таки, як і відповідь вище, це працює лише тоді, коли ваш тест на пристрій не зміг очікуваного стану.
TroySteven

1

У мене є більш просте рішення (що я використовував себе недавно, з безлічі лінивих причин). Додайте цей метод до класу, в якому ви працюєте:

public static void DumbDebug(string message)
{
    File.WriteAllText(@"C:\AdHocConsole\" + message + ".txt", "this is really dumb. I wish Microsoft had more obvious solutions to its solutions problems.");
}

Потім ... відкрийте каталог AdHocConsole і упорядкуйте створений час. Переконайтесь, що ви додаєте свої "друковані заяви". Хоча вони виразні, інакше буде жонглювання.


0

Visual Studio для Mac

Жодне з інших рішень не працювало на Visual Studio для Mac

Якщо ви використовуєте NUnit , ви можете додати невеликий .NET проект консолі до свого рішення, а потім посилатися на проект, який ви хочете перевірити, у посиланнях цього нового проекту консолі .

Все, що ви робили у своїх [Test()]методах, можна зробити в Mainконсольній програмі таким чином:

class MainClass
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Console");

        // Reproduce the unit test
        var classToTest = new ClassToTest();
        var expected = 42;
        var actual = classToTest.MeaningOfLife();
        Console.WriteLine($"Pass: {expected.Equals(actual)}, expected={expected}, actual={actual}");
    }
}

Ви можете вільно користуватися Console.Writeі Console.WriteLineв коді за цих обставин.

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