Могу ли я писать в консоль в модульном тесте? Если да, то почему не открывается окно консоли?

157

У меня есть тестовый проект в Visual Studio. Я использую Microsoft.VisualStudio.TestTools.UnitTesting .

Я добавляю эту строку в один из своих модульных тестов:

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

Когда я запускаю тест, он проходит успешно, но окно консоли вообще не открывается.

Есть ли способ сделать окно консоли доступным для взаимодействия с помощью модульного теста?

карандашТорт
источник
1
Это действительно зависит от бегуна. Вы можете использовать TestDriven.Net (отличный, бесплатный для личного использования, тестовый запуск) - Console.WriteLine будет писать в панель вывода VS.
seldary
1
Спасибо за распространение информации на TestDriven.Net
GrayFox374
NCrunch также имеет эту функцию, которая сама по себе оправдывает свою цену. У меня есть Dumpметод расширения, который выводит содержимое объекта в консоль, что значительно упрощает отладку. i.imgur.com/MEZwy7X.png
DharmaTurtle
Как правило, в модульном тесте нет необходимости печатать строку. Но, если вам нужно, есть еще одна ссылка, которая идеально решит вашу проблему. Как мне написать вывод модульного теста? . Вам следует открыть тестовую консоль, а не обычную консоль.
linsir

Ответы:

131

ПРИМЕЧАНИЕ. Исходный ответ ниже должен работать для любой версии 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%; мне кажется неправильным, если я уже перенаправил stdoutWindows, чтобы украсть его у меня, но я не пробовал.)

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

Майкл Эденфилд
источник
Попробуйте открыть новое приложение WindowsApplication, используя AllocConsole для выделения консоли, и оно будет писать туда. Я не знаю, что он делает на самом деле, но он может не работать в среде модульного тестирования. Было бы неплохо узнать ...
sinni800
хрм перечитывая AllocConsoleдокументацию, я могу ошибаться, но мне придется проверить это.
Майкл Эденфилд
2
Для меня этот комментарий Майкла сказал все, о чем мне нужно было подумать: «Когда вы запускаете модульный тест через VS2010, стандартный вывод перенаправляется тестовой оснасткой и сохраняется как часть результатов теста».
Роберт Паттерсон
5
в VS2013, если вы пишете в консоли, на TestExplorer / Test / Summary будет метка ссылки [Output]. Щелкните по нему, и вы получите желаемый результат. Подождите? Вы также хотите вызвать Console.ReadLine () ??
Visar
3
В V2017 (Сообщество) перейдите в «Обозреватель тестов», выберите в списке пункт с результатами теста, затем щелкните ссылку «Вывод» в другом окне (окно результатов теста?). Поскольку он, вероятно, будет усечен, используйте «скопировать все» и вставить в другое место.
heringer
183

Кто-то прокомментировал эту явно новую функциональность в Visual Studio 2013. Сначала я не был уверен, что он имел в виду, но теперь, когда я это сделал, я думаю, что это заслуживает отдельного ответа.

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

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

Тьяго Дуарте
источник
2
Отличное решение. Убедитесь, что он работает в VS2015 Enterprise.
garfbradaz
6
К сожалению, нельзя выделить текст в этой области вывода для копирования и вставки :( О чем они думали ?!
ИЛИ Mapper
3
@ORMapper, щелкните правой кнопкой мыши область «Стандартный вывод» и выберите «Копировать все»
случайно
2
@ Ovi-WanKenobi: попробуйте вывести что-нибудь с помощью Console.Write
Тиаго Дуарте
5
В vs 2017 вам нужно выбрать КАЖДЫЙ запускаемый тест, затем щелкнуть вывод - не очень полезно, когда у вас много тестов. Я хочу видеть весь вывод вместе, а не в отдельных окнах.
inliner49er
40

Вы можете использовать эту строку для записи в окно вывода Visual Studio:

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

Должен работать в режиме отладки.

Дмитрий Павлов
источник
7
Это не написано на моем VS
Луис Филипе
1
подробности смотрите в этой ветке - stackoverflow.com/questions/1159755/…
Дмитрий Павлов,
1
Это отлично сработало для меня, используя MSTest и R # для просмотра вывода. Благодарность!
Исаак Бейкер,
3
@William он появляется, если вы отлаживаете тест, но не, если вы просто запускаете его без отладки.
yoyo
29

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

Однако вы можете отлаживать модульные тесты, как и любой другой код. Самый простой способ - использовать Debugкнопку на вкладке «Результаты теста».

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

По сути, точки трассировки позволяют вам писать в окно вывода (или, точнее, в стандартный вывод). При желании вы можете продолжить работу или остановиться как обычную точку останова. Это дает вам «функциональность», которую вы просите, без необходимости перестраивать код или заполнять его отладочной информацией.

Просто добавьте точку останова, а затем щелкните ее правой кнопкой мыши. Выберите вариант «При попадании ...»:

При выборе варианта

Это вызывает диалог:

Когда достигается точка останова

Несколько замечаний:

  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.
йойо
10

Ты можешь использовать

Trace.WriteLine()

для записи в окно вывода при отладке модульного теста.

Стурла
источник
5

В Visual Studio 2017 TestContext не отображает ссылку вывода в обозревателе тестов.

Однако Trace.Writeline () показывает выходную ссылку.

Наз Хассан
источник
Просто к вашему сведению, это Trace.WriteLine
TroySteven
4

Во-первых, модульные тесты по замыслу должны выполняться полностью без взаимодействия.

Помимо этого, я не думаю, что об этом думали.

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

sinni800
источник
1
Хм ... Мой главный мотив - написать дополнительные данные на консоль, чтобы увидеть более глубокие детали. Это будет специальная вещь, которая мне может не понадобиться позже.
PencilCake
3

Также можно использовать Debug.WriteLine ().

Джеки
источник
1
или Debug.Print ()
Мохамед Селим
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.");

Вы можете создать для этого отдельный класс.

DevCod
источник
Я подумал, что добавлю и это. В Visual Studio 2019 с помощью XUNIT вы можете делать следующее: Assert.True (успех, «УДАЛЕНИЕ ЗАПИСИ НЕ УДАЛОСЬ»); После этого в обозревателе тестов VS 2019 появится сообщение DELETE RECORD FAILED. Опять же, как и ответ выше, это работает только тогда, когда ваш модульный тест не прошел ожидаемое условие.
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в своем коде.

SwiftАрхитектор
источник