it-swarm.com.ru

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

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

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

75
Chris

Попробуйте использовать 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 как «Среда тестирования автоматически устанавливает свойство, которое затем можно использовать в модульных тестах».

93
frennky

Немного поздно к разговору.

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

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

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

VS2012 и Большой
(из комментариев) В Visual Studio 2012 значок отсутствует. Вместо этого в результатах теста есть ссылка, которая называется Output . Если вы нажмете на ссылку, вы увидите все WriteLine.

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

129
Yogurt The Wise

В Visual Studio 2017 вы можете увидеть выходные данные из тестового проводника.

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

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

3) В окне «Проводник тестов» щелкните «Метод пройденного теста».

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

 enter image description here

И нажмите «Вывод», вы можете увидеть результат Console.Writeline () .  enter image description here

35
monad.gon

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

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

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

 используя Xunit; 
 используя Xunit.Abstractions; 

 открытый класс MyTestClass 
 {
 закрытый доступ только для чтения ITestOutputHelper; 

 public MyTestClass (вывод ITestOutputHelper) 
 {
 this.output = output; 
 } 

 [Факт]
 public void MyTest () 
 {
 var temp = "мой класс!"; 
 output.WriteLine («Это вывод из {0}», temp); 
 } 
} 

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

9
jonzim

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

Вы можете использовать этот пакет NuGet: https://www.nuget.org/packages/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));
    }
}
4
Maxim

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

Есть два варианта:

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

  • Отключите DEBUG в настройках сборки для юнит-теста

0
Jason Williams

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

public void CheckConsoleOutput()
    {
        Console.WriteLine("Hi Hi World");
        Trace.WriteLine("Trace Trace the World");
        Debug.WriteLine("Debug Debug WOrld");
        Assert.IsTrue(true);
    }

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

0
Mike

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

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

0
Goodies

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

0
user4711269

Я не получаю вывод, когда мои настройки Test/Test Settings/Default Processor Architecture и сборки, на которые ссылается мой тестовый проект, не совпадают. В противном случае Trace.Writeline () работает нормально.

0
Arthur Greef

Просто столкнулся с этим. Причина/решение - другой вариант вышеупомянутого, поэтому я отправлю.
Моя проблема заключалась в том, что я не получал вывод, потому что я записывал набор результатов из асинхронного вызова 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
Richard Strickland

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

Console.WriteLine()

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

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

Есть также опция (не уверенная, есть ли у VS2008), но вы все равно можете использовать Debug.WriteLine при запуске теста с Test With Debuggeroption в IDE

0
VoodooChild

Я использую xunit, вот что я использую: Debugger.Log(0, "1", input);

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

0
Ivandro Ismael