Как синхронизировать параллельно выполняющиеся тесты в xUnit? - PullRequest
0 голосов
/ 25 мая 2018

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

Прямо сейчас у меня есть следующая реализация в NUnit:

[TestFixture]
public class ScheduleJobTest
{
    private static readonly Subject<Unit> s_tickets = new Subject<Unit>();

    [OneTimeSetUp]
    public static void SetUp()
    {
        Task.Run(() => s_tickets
            .Throttle(TimeSpan.FromSeconds(1))
            .SelectMany(_ => PollSchedulesNow())
            .DefaultIfEmpty()
            .GetAwaiter()
            .GetResult());
    }

    [OneTimeTearDown]
    public static void TearDown()
    {
        s_tickets.OnCompleted();
    }

    private static IObservable<Unit> PollSchedulesNow()
    {
        // Do something that eventually unblocks all the test cases
    }

    [TestCaseSource(nameof(ProvideNamespaces)), Parallelizable(ParallelScope.Children)]
    public void ScheduleJob(NamespaceConnectionInfo nci)
    {
        // Do something
        s_tickets.OnNext(Unit.Default);
        // Resume - blocks until the actions of PollSchedulesNow take effect
    }

    private static IEnumerable<TestCaseData> ProvideNamespaces()
    {
        return ...
    }
}

Каждый тестовый случай ставит в очередь билет для специального действияэто должно быть сделано только один раз.Регулирование гарантирует, что до тех пор, пока билеты поступают в течение не более чем одного секунды, ничего не происходит.Но как только возникает пауза, она запускает это специальное действие.Если по какой-то причине после этой паузы будет больше тестовых случаев, то специальное действие будет вызвано снова - и это нормально.Я просто не хочу, чтобы он вызывался 100 раз одновременно для 100 одновременных тестовых случаев.

Это лучшее, что я мог придумать в NUnit.Есть ли лучший способ реализовать это в xUnit?Или, может быть, мне нужен другой фреймворк?

1 Ответ

0 голосов
/ 25 мая 2018

Прежде всего: Нет. В NUnit нет способа координировать тесты, если вы сами не написали координирующий код в тестах.Даже тогда вы должны убедиться, что NUnit запускает их все вместе, что он может делать, а может и не делать без вашей помощи.

Но да!Вы можете выполнить то, что вы хотите.Вы пытаетесь смоделировать то, что по сути является одним тестом для нескольких потоков, используя несколько тестов NUnit.Не делай этого!Напишите один тест, который порождает столько отдельных потоков, сколько вы хотите.Дождитесь их завершения, а затем убедитесь, что действие было выполнено только один раз.Здесь есть только одно утверждение, которое доказывает, что есть только один тест.

Вы можете повторить это для разного количества потоков и состояний ошибок столько раз, сколько захотите.Каждый из этих вариантов будет одним тестом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...