我需要并行地启动几十个测试用例,但是有一个陷阱--它们都达到了一个点,即无论运行多少个测试用例,都应该只执行一个操作一次。一旦此操作结束,测试就可以恢复并继续独立运行。
现在,我在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中实现它?或者我一开始就需要一个不同的框架?
发布于 2018-05-25 00:57:46
首先:不。除非您自己在测试中编写协调代码,否则在NUnit中无法跨测试进行协调。即使如此,您也必须确保NUnit将它们全部运行在一起,如果没有您的帮助,它可能会也可能不会这样做。
但是是的!你可以实现你想要的。您正在尝试使用多个NUnit测试来建模本质上是跨多个线程的单个测试。别干那事!编写一个测试,生成任意数量的独立线程。等待它们完成,然后验证操作只执行了一次。这里只有一个断言,哪种证明只有一个测试。
您可以对不同数量的线程和错误条件重复此操作,次数随您的喜好而定。每一个变体都是一个单一的测试。
https://stackoverflow.com/questions/50520435
复制相似问题