Как я могу написать результат модульного теста?

113

Любой вызов в моих модульных тестах к любому Debug.Write(line)или Console.Write(Line)просто пропускается во время отладки, и вывод никогда не печатается. Вызов этих функций из классов, которые я использую, работают нормально.

Я понимаю, что модульное тестирование предназначено для автоматизации, но я все же хотел бы иметь возможность выводить сообщения из модульного теста.

Крис
источник

Ответы:

128

Попробуйте использовать TestContext.WriteLine()какой выводит текст в результатах тестирования.

Пример:

    [TestClass]
    public class UnitTest1
    {
        private TestContext testContextInstance;

        /// <summary>
        ///  Gets or sets the test context which provides
        ///  information about and functionality for the current test run.
        ///</summary>
        public TestContext TestContext
        {
            get { return testContextInstance; }
            set { testContextInstance = value; }
        }

        [TestMethod]
        public void TestMethod1()
        {
            TestContext.WriteLine("Message...");
        }
    }

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

безумный
источник
7
Я обнаружил (с VS2013), что это печатает только что-то, если тест выполняется в режиме отладки.
fusi
3
Похоже, что для использования TestContext требуется VS2015 Enterprise (или премиум-версии предыдущих выпусков), согласно этой документации
Патрик Стедман,
Я заметил, что если в вашей строке есть фигурные скобки, метод взорвется. Итак, "_testContext.WriteLine (" привет ");" работает, но "_testContext.WriteLine (" he {ll} o ");" сбой с "System.FormatException: входная строка была в неправильном формате".
Mike K
1
Метод WriteLine в TestContext принимает те же параметры, что и Console.WriteWriteLine. Это означает, что строка является строкой форматирования (задокументирована на docs.microsoft.com/en-us/dotnet/standard/base-types/… ). Чтобы использовать в строке литерал {, необходимо его удвоить. Чтобы напечатать вашу строку, используйте WriteLine ("he {{ll}} o");
Уолтер
1
это было интересно ... хотя я до сих пор не знаю, почему они не добавили эту и подобные функции в базовый класс или интерфейс, которые мы могли бы использовать из фреймворка, чтобы избежать путаницы.
Niklas
149

Я также пытался заставить Debug, Trace, Console или TestContext работать в модульном тестировании.

Ни один из этих методов не будет работать или отображать вывод в окне вывода:

    Trace.WriteLine("test trace");
    Debug.WriteLine("test debug");
    TestContext.WriteLine("test context");
    Console.WriteLine("test console");

Visual Studio 2012 и выше

(из комментариев) В Visual Studio 2012 значка нет. Вместо этого в результатах теста есть ссылка под названием « Вывод» . Если вы нажмете на ссылку, вы увидите все файлы WriteLine.

До Visual Studio 2012

Затем я заметил в окне результатов теста , после запуска теста, рядом с небольшим зеленым кружком успеха , есть еще один значок. Я дважды щелкнул по нему. Это были мои результаты теста, и он включал все типы писем, перечисленных выше.

Йогурт Мудрый
источник
44
В Visual Studio 2012 значка нет. Вместо этого в результатах теста есть ссылка под названием «Вывод». Если вы нажмете на ссылку, вы увидите все письма.
epotter
16
Боже, эту ссылку "Выход" по сути сложно найти. Если кто-то пытается его найти, то он находится в нижней части текстового проводника. Когда тест выбран, он показывает результат в виде «Истекшее время: xxx». Ниже находится ссылка «Вывод».
Кевин
@kevin, в какой версии VS вы это видели? (Я предполагаю, что вы имеете в виду «Обозреватель тестов», а не «Обозреватель текста».) Я не вижу ссылки на вывод в VS2013 Express.
Майк С.
1
Если кому-то (как и мне) интересно, какие из них появляются в файле TRX (вывод результатов тестирования), то это все вышеперечисленное, кроме «Debug.WriteLine».
Badgerpot
4
В Visual Studio 2017 это по-прежнему ссылка «Вывод».
HankCa 08
66

В Visual Studio 2017 вы можете увидеть результат работы обозревателя тестов.

1) В вашем тестовом методе Console.WriteLine ("что-то");

2) Запустите тест.

3) В окне обозревателя тестов щелкните Метод пройденного теста.

4) И щелкните ссылку «Вывод».

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

И нажмите «Вывод», вы увидите результат Console.Writeline (). введите описание изображения здесь

monad.gon
источник
1
Превосходно. Visual Studio / C # не является моей нормой для разработки, это просто то, что мне нужно! Спасибо за публикацию.
matt32
10
Я использую версию 15.5.6 2017 г. Бит O не видит выходную ссылку.
Mike IT
1
Зависит ли это от того, какая среда тестирования используется? Я использую xUnit 2.4 в тестовом проекте .NET 4.6, и панель «Стандартный вывод» не отображается. Выходные данные также Console.WriteLineне отображаются на панели «Вывод» в разделе «Тесты».
Qwertie
Для xUnit ответ jonzim работал у меня, даже в другом потоке, порожденном тестом.
Qwertie 04
1
Для тех, кто не видел ссылку "выход". 1) Вам следует выбрать метод тестирования . 2) позвольте окну Test Explorer заполнить окно VS по вертикали, иначе ссылка будет скрыта, а полоса прокрутки слишком мала, чтобы ее можно было заметить или использовать.
Meow Cat 2012,
18

Это зависит от вашего тестового исполнителя ... например, я использую xUnit , поэтому, если вы используете это, следуйте этим инструкциям:

https://xunit.github.io/docs/capturing-output.html

Этот метод группирует ваш вывод с каждым конкретным модульным тестом.

using Xunit;
using Xunit.Abstractions;

public class MyTestClass
{
    private readonly ITestOutputHelper output;

    public MyTestClass(ITestOutputHelper output)
    {
        this.output = output;
    }

    [Fact]
    public void MyTest()
    {
        var temp = "my class!";
        output.WriteLine("This is output from {0}", temp);
    }
}

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

Джонзим
источник
4

Думаю, это все еще актуально.

Вы можете использовать этот пакет NuGet: Bitoxygen.Testing.Pane

Вызовите собственный метод WriteLine из этой библиотеки. Он создает панель тестирования внутри окна вывода и всегда помещает туда сообщения (во время каждого теста он запускается независимо от флагов DEBUG и TRACE).

Чтобы упростить трассировку, я могу порекомендовать создать базовый класс:

[TestClass]
public abstract class BaseTest
{
    #region Properties
    public TestContext TestContext { get; set; }

    public string Class
    {
        get { return this.TestContext.FullyQualifiedTestClassName; }
    }
    public string Method
    {
        get { return this.TestContext.TestName; }
    }
    #endregion

    #region Methods
    protected virtual void Trace(string message)
    {
        System.Diagnostics.Trace.WriteLine(message);

        Output.Testing.Trace.WriteLine(message);
    }
    #endregion
}

[TestClass]
public class SomeTest : BaseTest
{
    [TestMethod]
    public void SomeTest1()
    {
        this.Trace(string.Format("Yeah: {0} and {1}", this.Class, this.Method));
    }
}
Максим
источник
1
Магия находится в: Output.Testing.Trace.WriteLine (message); с BitOxygen.
Бимал Пудель
Не работает с текущей версией Visual Studio, вы получаете сообщение об ошибкеCould not load file or assembly 'Microsoft.VisualStudio.Shell.12.0,
Консоль
@Console Да, ему нужна некоторая поддержка, но я не уверен, интересно ли сообществу такой вывод. xUnit имеет OutputHandler, и VS может показать его результат.
Максим
1

Попробуйте использовать:

Console.WriteLine()

Вызов Debug.WriteLineбудет выполняться только во время определения DEBUG.

Можно использовать и другие предложения:, Trace.WriteLineно я этого не пробовал.

Также есть опция (не уверен, есть ли она в Visual Studio 2008), но вы все равно можете использовать ее Debug.WriteLineпри запуске теста с Test With Debuggerопцией в IDE.

ВудуРебенок
источник
1

Решено на следующем примере:

public void CheckConsoleOutput()
{
    Console.WriteLine("Hello, World!");
    Trace.WriteLine("Trace Trace the World");
    Debug.WriteLine("Debug Debug World");
    Assert.IsTrue(true);
}

После запуска этого теста в разделе «Тест пройден» есть возможность просмотреть результат, который откроет окно вывода.

Майк
источник
1

Это действительно зависит от исполнителя тестов, как упоминал @jonzim. Для NUnit 3 мне пришлось использовать NUnit.Framework.TestContext.Progress.WriteLine()для запуска вывода в окне вывода Visual Studio 2017.

NUnit описывает, как: здесь

Насколько я понимаю, это связано с дополнительным распараллеливанием выполнения тестов, которое получили участники тестирования.

Пеберминте Ларс
источник
0

Я не получаю выходных данных, если настройки моей тестовой / тестовой архитектуры / архитектуры процессора по умолчанию и сборки, на которые ссылается мой тестовый проект, не совпадают. В противном случае Trace.Writeline () работает нормально.

Артур Греф
источник
0

Console.WriteLine не будет работать. В режиме отладки будут работать только Debug.WriteLine () или Trace.WriteLine ().

Я делаю следующее: включаю в тестовый модуль использование System.Diagnostics . Затем используйте Debug.WriteLine для вывода, щелкните тест правой кнопкой мыши и выберите Debug Selected Tests . Результат вывода теперь появится в окне вывода ниже. Я использую Visual Studio 2017 против 15.8.1 с платформой модульного тестирования по умолчанию, которую предоставляет VS.

Вкусности
источник
0

Вы уверены, что запускаете модульные тесты в Debug? Debug.WriteLine не будет вызываться в сборках Release.

Можно попробовать два варианта:

  • Trace.WriteLine (), который встроен в сборки выпуска, а также в отладку

  • Отмените определение DEBUG в настройках сборки для модульного теста

Джейсон Уильямс
источник
0

Я использую xUnit, поэтому вот что использую:

Debugger.Log(0, "1", input);

PS: вы Debugger.Break();тоже можете использовать , чтобы вы могли видеть свой логин out.

Ивандро И.Г. Джао
источник
Что это за " out"?
Питер Мортенсен
0

Другой вариант причины / решения:

Моя проблема заключалась в том, что я не получал вывода, потому что я записывал набор результатов из асинхронного вызова LINQ на консоль в цикле в асинхронном контексте:

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345");

p.ForEachAsync(payment => Console.WriteLine(payment.Amount));

Таким образом, тест не записывался в консоль до того, как объект консоли был очищен средой выполнения (при запуске только одного теста).

Решение заключалось в том, чтобы сначала преобразовать набор результатов в список, чтобы я мог использовать неасинхронную версию forEach ():

var p = _context.Payment.Where(pp => pp.applicationNumber.Trim() == "12345").ToList();

p.ForEachAsync(payment =>Console.WriteLine(payment.Amount));
Ричард Стрикленд
источник
0

В VS 2019

  1. в главном меню VS щелкните: View->Test Explorer
  2. Щелкните правой кнопкой мыши свой метод тестирования в обозревателе тестов -> Отладка.
  3. Щелкните additional outputссылку, как показано на скриншоте ниже.

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

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

  • Debug.WriteLine
  • Console.WriteLine
  • TestContext.WriteLine

все войдут в дополнительное окно вывода.

Легенды
источник
-1

Trace.WriteLineдолжен работать при условии, что вы выбрали правильный вывод (раскрывающийся список с надписью «Показать вывод из» находится в окне вывода ).

Питер Мортенсен
источник