MSTest 单元测试在“调试”模式下通过,但在“运行”模式下最终断言失败

All*_*ner 4 c# unit-testing mstest race-condition staticresource

您好,我有一个单元测试,它附加到一个事件并根据处理程序中 eventArgs 的属性更新计数器,如下所示:

protected void UpdateCounts(object sender, EventArgs eventArgs)
{
  lock (lockobject)
  {
    Counts[eventArgs.Target]++;
  }
}
Run Code Online (Sandbox Code Playgroud)

Counts 是该类中所有单元测试共享的静态字典资源。我断言,在测试结束时,我断言对于特定的 Target 值(Target 是一个枚举),计数为 6。当我通过此测试进行调试时,它总是通过最终断言,但是,当我在没有任何断点的情况下运行它时,Target 值的计数可以是 7 或 8,但永远不会是 6。

我意识到许多尝试访问字典中条目的线程可能会出现竞争条件,这就是我在增量周围放置锁的原因。我还有一个 TestInitialize 方法,该方法在每个测试运行之前运行,如下所示:

[TestInitialize]
public void InitTest()
{
  foreach (TargetType x in Enum.GetValues(typeof(Target)))
  {
    Counts[x] = 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

有人对这里发生的事情有任何了解吗?

小智 6

几乎每次我遇到这个问题时,它都会归结为竞争条件,这种情况在调试时不太可能发生,因为在单步执行代码时会减慢执行速度。

我建议在线程到达执行的各个阶段时将调试或跟踪语句添加到线程中,以便确定竞争条件存在的位置。