C # xUnit Тест слушателей - PullRequest
       79

C # xUnit Тест слушателей

0 голосов
/ 25 февраля 2019

Я создаю тестовую среду для селена на основе .Net Core, и команда решила использовать xUnit.Все хорошо, все идет хорошо, но какое-то время мы без особой удачи пытались воспроизвести функциональность слушателей Java TestNG.

Я копался в репозитории xunit git и нашелнесколько случаев, когда некоторые интерфейсы, такие как ITestListener были использованы.После более глубокого изучения я обнаружил, что эти слушатели относятся к пакету под названием TestDriven.Framework, и я хотел точно знать, как бы я использовал тестовый слушатель, созданный с использованием этих интерфейсов?

Пока это мой простой тестовый слушатель, которыйследует написать что-то, когда тест не пройден:

public class Listener
{
    readonly int totalTests;

    public Listener(ITestListener listener, int totalTests)
    {
        this.totalTests = totalTests;
        TestListener = listener;
        TestRunState = TestRunState.NoTests;
    }

    public ITestListener TestListener { get; private set; }
    public TestRunState TestRunState { get; set; }

    public void onTestFail(ITestFailed args)
    {
        Console.WriteLine(args.Messages);
    }

}

Теперь я знаю, что вы можете сделать это в отрывном крючке, но помните, это всего лишь простой пример, и я имею в виду нечто более сложное.Чтобы быть точным, где / как именно я зарегистрирую тест, чтобы использовать этот слушатель?В Java TestNg у меня было бы @Listeners, но в C # я не слишком уверен.

Редактировать 1 , поэтому пример сработал и сумел добавить его в мою структуру проекта, но когда япопробуйте использовать это

    class TestPassed : TestResultMessage, ITestPassed
{
    /// <summary>
    /// Initializes a new instance of the <see cref="TestPassed"/> class.
    /// </summary>
    public TestPassed(ITest test, decimal executionTime, string output)
        : base(test, executionTime, output) {
        Console.WriteLine("Execution time was an awesome " + executionTime);
    }
}

У меня проблемы с регистрацией этого, или если я даже регистрирую это правильно.Что касается примеров, я нашел фактические приемники сообщений, но также нашел фактические данные о состоянии теста, которые я не совсем уверен, как использовать.

1 Ответ

0 голосов
/ 03 марта 2019

Я не работал с TestNG, но я сделал небольшое чтение, и я думаю Я вижу, что вы ищете.

Чтобы продемонстрировать, я реализовал очень простойподтверждение концепции xUnit IMessageSink.

public class MyMessageSink : IMessageSink
{
    public bool OnMessage(IMessageSinkMessage message)
    {
        // Do what you want to in response to events here.
        // 
        // Each event has a corresponding implementation of IMessageSinkMessage.
        // See examples here: https://github.com/xunit/abstractions.xunit/tree/master/src/xunit.abstractions/Messages
        if (message is ITestPassed)
        {
            // Beware that this message won't actually appear in the Visual Studio Test Output console.
            // It's just here as an example. You can set a breakpoint to see that the line is hit.
            Console.WriteLine("Execution time was an awesome " + ((ITestPassed)message).ExecutionTime);
        }

        // Return `false` if you want to interrupt test execution.
        return true;
    }
}

Затем приемник регистрируется через IRunnerReporter:

public class MyRunnerReporter : IRunnerReporter
{
    public string Description => "My custom runner reporter";

    // Hard-coding `true` means this reporter will always be enabled.
    //
    // You can also implement logic to conditional enable/disable the reporter.
    // Most reporters based this decision on an environment variable.
    // Eg: https://github.com/xunit/xunit/blob/cbf28f6d911747fc2bcd64b6f57663aecac91a4c/src/xunit.runner.reporters/TeamCityReporter.cs#L11
    public bool IsEnvironmentallyEnabled => true;

    public string RunnerSwitch => "mycustomrunnerreporter";

    public IMessageSink CreateMessageHandler(IRunnerLogger logger)
    {
        return new MyMessageSink();
    }
}

Чтобы использовать мой пример кода, просто скопируйте классы в ваш тестовый проект (вам также необходимо добавить ссылку на пакет xunit.runner.utility NuGet).Платформа xUnit автоматически обнаружит IRunnerReporter - нет необходимости явно регистрировать что-либо.

Если кажется, что он движется в правильном направлении, вы можете найти намного больше информации в исходном коде xUnit.Все задействованные интерфейсы хорошо документированы.В пространстве имен xunit.runner.reporters существует несколько существующих реализаций. AssemblyRunner.cs также демонстрирует один из возможных методов отправки различных типов событий отдельным обработчикам.

Edit 1

Я обновил реализацию MyMessageSink (выше), чтобы продемонстрировать, как вы можете прослушать сообщение ITestPassed.Я также обновил ссылку, встроенную в этот фрагмент кода - предыдущая ссылка была на реализации, но мы действительно должны использовать эти абстракции.

Шаблон if (message is IMessageType) довольно грубый и не будет хорошо масштабироваться, если выхочу слушать много разных типов сообщений.Поскольку я не знаю ваших потребностей, я просто выбрал простейшую вещь, которая могла бы сработать, - надеюсь, достаточно, чтобы вы могли улучшить / расширить ее в соответствии со своими потребностями.

...