Як я можу записати вихід з одиничного тесту?


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 (" він {ll} o ");" не вдається з "System.FormatException: рядок введення був не в правильному форматі."
Майк К

1
Метод WriteLine в TestContext приймає ті самі параметри, що і Console.WriteWriteLine. Це означає, що рядок є рядком для форматування (задокументовано на docs.microsoft.com/en-us/dotnet/standard/base-types/… ). Щоб використовувати літерал {у рядку, потрібно подвоїти його. Для друку рядка використовуйте WriteLine ("він {{ll}} o");
Вальтер

1
це було цікаво ... хоча я досі не знаю, чому вони не додавали цю та подібні функції до базового класу чи інтерфейсу, який ми могли б використати в рамках, щоб уникнути плутанини.
Ніклас

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
Боже, що "Вихідне" посилання нелегко знайти. Якщо хтось бореться, щоб знайти його, це знаходиться в Провіднику тексту, нижній частині. Коли вибрано тест, він показує вам результат із "Пройденим часом: ххх". Нижче це посилання "Вихід".
кевін

@kevin, в якій версії VS ви це бачили? (Я припускаю, що ви маєте на увазі "Test Explorer" замість "Text Explorer.) Я не бачу вихідного посилання в експресі VS2013.
Mike C

1
Якщо хтось задається питанням (як я), що з них відображається у файлі TRX (результат випробувань), то це все вищезазначене, окрім "Debug.WriteLine".
Badgerspot

4
У Visual Studio 2017 це ще посилання "Вихід".
HankCa

66

У Visual Studio 2017 ви можете побачити результати тестового провідника.

1) у вашому методі тестування, Console.WriteLine ("щось");

2) Виконати тест.

3) У вікні Test Explorer натисніть Пройдений метод тестування.

4) І натисніть посилання "Вихід".

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

І натисніть "Вивід", ви побачите результат Console.Writeline (). введіть тут опис зображення


1
Відмінно. Visual Studio / C # - це не моя норма розвитку, це лише те, що мені потрібно! Дякуємо, що опублікували це.
matt32

10
Я використовую версію 2017 року 15.5.6 біт O не бачу вихідного посилання.
Майк IT

1
Чи залежить це від того, яка тестова основа використовується? Я використовую xUnit 2.4 в тестовому проекті .NET 4.6, і не з'являється панель "Стандартний вихід". Вихід з Console.WriteLineне відображається і на панелі "Вихід" у розділі "Тести".
Qwertie

Для xUnit відповідь jonzim працювала на мене, навіть у іншій темі, породженій тестом.
Qwertie

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 (повідомлення); з бітоксигеном.
Bimal Poudel

Не працює з поточною версією 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 для мого виводу, клацніть правою кнопкою миші на тесті , виберіть Налагодити вибрані тести . Результат результату тепер з’явиться у вікні виводу нижче. Я використовую Visual Studio 2017 проти 15.8.1, з базовою базою тестових програм VS.


0

Ви впевнені, що ви проводите тести своїх одиниць у налагодженні? Debug.WriteLine не буде викликаний у версії версій .

Два варіанти спробувати:

  • Trace.WriteLine (), який вбудований у версії версій, а також налагодження

  • Не визначте DEBUG у налаштуваннях збірки для тестування одиниці



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. Клацніть правою кнопкою миші свій метод тестування в Test Explorer -> Налагодження
  3. Клацніть additional outputпосилання, як показано на скріншоті нижче.

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

Ви можете використовувати:

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

все увійде до додаткового вікна виводу.


-1

Trace.WriteLineповинно працювати, якщо ви вибрали правильний вихід (спадне меню з написом "Показати вихід з", знайдене у вікні виводу ).

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