Мне нужно запустить параллельно потенциально десятки тестовых случаев, но есть одна загвоздка - все они достигают точки, когда одно действие должно быть выполнено только один раз, независимо от того, сколько запущено тестовых случаев.Как только это действие завершится, тесты могут возобновиться и продолжить работу независимо.
Прямо сейчас у меня есть следующая реализация в 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?Или, может быть, мне нужен другой фреймворк?