将RemoteTestRunner与优化的单元测试代码

时间:2016-06-16 10:09:37

标签: c# .net unit-testing nunit cil

首先是某些背景:我正在研究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.SleepWriteLine进行了测试),那么我将测试运行到最后没有问题
  • 如果我从NewPack方法触发Accumulator.Add操作,则测试结束
  • 为了确保Timer有效地完成其工作,我尝试在调用File.Create() Action之前添加NewPack。无论是否使用代码优化,都创建了文件
  • 使用nunit-console(2.6.2 / 2.6.4)启动时没有问题,无论是否有优化

由于NUnit可以启动它并直到最后,我怀疑在实例化所有RemoteTestRunnner环境时我遗漏了一些东西。

是否有人遇到此类调试/发布版本问题?关于我缺少什么的任何主角?

感谢阅读!

编辑:正如Aleksey L指出的那样。

  

将此变量定义为实例字段并将其标记为易失性

避免无限循环,但仍然没有暗示nunit-console如何工作

1 个答案:

答案 0 :(得分:2)

也许处理器将pack值缓存为null。尝试将此变量定义为实例字段并将其标记为volatile(为安全起见)。虽然这并没有解释为什么使用nunit-console(2.6.2 / 2.6.4)启动时没问题,有或没有优化