[xUnit] Переправить Debug.WriteLine() в ITestOutputHelper
От: VladCore  
Дата: 30.10.17 10:45
Оценка:
Хочется весь Debug.WriteLine переправлять в оутпут xUnit.

Посмотрел сюда https://xunit.github.io/docs/capturing-output.html и наколхозил класс DebugOutputAdapter:

    public class FirstTest
    {
        public FirstTest(ITestOutputHelper output)
        {
            DebugOutputAdapter.Bind(output);
        }

        [Fact]
        public void PassingTest()
        {
            Debug.WriteLine("Line 1: " + DateTime.Now);
            Thread.Sleep(4000);
            Debug.WriteLine("Line 2: " + DateTime.Now);
            Assert.Equal(4, Add(2, 2));
        }

        [Theory]
        [InlineData(3)]
        [InlineData(5)]
        [InlineData(6)]
        public void MyFirstTheory(int value)
        {
            Debug.WriteLine("Check theory using " + value);
            Assert.True(IsOdd(value));
        }

        bool IsOdd(int value)
        {
            return value % 2 == 1;
        }
    }

На удивление Resharper "плавно" показывает output в PassingTest. То есть сразу показывает

Line 1: 10/30/2017 1:25:17 PM


потом ждет 4 секунды и показывает

Line 2: 10/30/2017 1:25:21 PM


Вопрос. Как не писать в каждом-каждом тест-классе такой как выше конструктор?
        public Имя_Тест_Класса(ITestOutputHelper output)
        {
            DebugOutputAdapter.Bind(output);
        }


P.S. Понятно выполнение тестов надо сериализовывать что бы output не перемешивался.

P.P.S. и ещё вопрос — xUnit сортирует ли имена классов и методов при сериализации выполнения как и NUnit консольные и решарперовские раннеры?

  Сам банальный класс DebugOutputAdapter
    class DebugOutputAdapter
    {
        static ITestOutputHelper CurrentOutput = null;

        static DebugOutputAdapter()
        {
            Debug.Listeners.Add(new MyTraceListener());
        }

        public static void Bind(ITestOutputHelper output)
        {
            CurrentOutput = output;
        }

        class MyTraceListener : TraceListener
        {
            public override void Write(string message)
            {
            }

            public override void WriteLine(string message)
            {
                if (CurrentOutput != null)
                    CurrentOutput.WriteLine(message);
            }
        }
    }
Отредактировано 30.10.2017 10:50 VladCore . Предыдущая версия . Еще …
Отредактировано 30.10.2017 10:50 VladCore . Предыдущая версия .
Отредактировано 30.10.2017 10:46 VladCore . Предыдущая версия .
Re: [xUnit] Переправить Debug.WriteLine() в ITestOutputHelpe
От: Sinix  
Дата: 30.10.17 12:06
Оценка:
Здравствуйте, VladCore, Вы писали:


VC>Вопрос. Как не писать в каждом-каждом тест-классе такой как выше конструктор?

Простой способ: использовать NUnit. Сложный: захватывать text out и протаскивать его неявно, что-то типа такого. Остальная обвязка в той же папке. Проверяйте только, от версии к версии у xUnit отваливается вывод результатов для canceled и failed тестов.

VC>P.P.S. и ещё вопрос — xUnit сортирует ли имена классов и методов при сериализации выполнения как и NUnit консольные и решарперовские раннеры?

Неа. Стандартный ответ на "как сделать что-то в xUnit": вам это не надо.

P.S. Не, можно извратиться с ITestCollectionOrderer/ITestCaseOrderer, но это тож не очень удобно.
Отредактировано 30.10.2017 12:10 Sinix . Предыдущая версия .
Re[2]: [xUnit] Переправить Debug.WriteLine() в ITestOutputHe
От: VladCore  
Дата: 30.10.17 14:11
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Простой способ: использовать NUnit. Сложный: захватывать text out и протаскивать его неявно, что-то типа такого. Остальная обвязка в той же папке. Проверяйте только, от версии к версии у xUnit отваливается вывод результатов для canceled и failed тестов.


Ну так я и пользуюс NUnit, но он в третей версии output выводит не плавно как во второй, а сразу все вываливает только по окончании тест-метода. сейчас только xUnit плавно (синхронно) выводит в решарпере output.

P.S. про интерфейс сортировки методов я видел. вопрос был про дефолтовое поведение. В NUnit сортирует и классы и методы по алфавиту. без всяких настроек
Отредактировано 30.10.2017 14:13 VladCore . Предыдущая версия .
Re[3]: [xUnit] Переправить Debug.WriteLine() в ITestOutputHe
От: Sinix  
Дата: 30.10.17 19:19
Оценка: 6 (1)
Здравствуйте, VladCore, Вы писали:


VC>Ну так я и пользуюс NUnit, но он в третей версии output выводит не плавно как во второй, а сразу все вываливает только по окончании тест-метода. сейчас только xUnit плавно (синхронно) выводит в решарпере output.


См вот этот коммент и весь топик целиком. Ну и вот это ещё.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.