MSTest 单元测试在 "debug" 模式下通过,但在 "run" 模式下最终断言失败

MSTest unit test passes when in "debug" mode, but fails final assertion in "run" mode

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

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

Counts 是 class 中所有单元测试共享的静态字典资源。我断言,在测试结束时,我断言 Target 的某个值(Target 是一个枚举)的计数为 6。当我通过这个测试进行调试时,它总是通过最后的断言,但是,当我只是 运行 它没有任何断点时,Target 的那个值的计数可以是 7 或 8,但永远不会是 6.

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

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

有人知道这里发生了什么吗?

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

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