首先是某些背景:我正在研究mutation testing tool for C# + NUnit,为了速度,我是
在单独的AppDomain中使用内部类NUnit 2.6.4核心程序集(RemoteTestRunner)到run tests(请参阅底部的DoTests
方法)。
问题: 我有一个单元测试,轮询变量,直到它变为非null。此变量是字典赋值为null,然后由Timer触发的Action重新分配给真实字典。在使用代码优化构建测试程序集时,它永远不会结束。有问题的代码:
[Test]
public void WeirdOne()
{
using (var accumulator = new Accumulator<string>(5, TimeSpan.FromMilliseconds(500)))
{
Dictionary<int, string> pack = null;
accumulator.NewPack += p => pack = p;
accumulator.Add("D");
accumulator.Add("A");
accumulator.Add("M");
accumulator.Add("N");
while (pack == null) ;
Assert.That(pack.Count, Is.EqualTo(4));
}
}
Here如果需要,可以使用Accumulator实现。
我找到了什么:
while
循环中放置了一些内容(使用Thread.Sleep
和WriteLine
进行了测试),那么我将测试运行到最后没有问题NewPack
方法触发Accumulator.Add
操作,则测试结束File.Create()
Action之前添加NewPack
。无论是否使用代码优化,都创建了文件由于NUnit可以启动它并直到最后,我怀疑在实例化所有RemoteTestRunnner环境时我遗漏了一些东西。
是否有人遇到此类调试/发布版本问题?关于我缺少什么的任何主角?
感谢阅读!
编辑:正如Aleksey L指出的那样。
将此变量定义为实例字段并将其标记为易失性
避免无限循环,但仍然没有暗示nunit-console如何工作
答案 0 :(得分:2)
也许处理器将pack
值缓存为null
。尝试将此变量定义为实例字段并将其标记为volatile
(为安全起见)。虽然这并没有解释为什么使用nunit-console(2.6.2 / 2.6.4)启动时没问题,有或没有优化