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

时间:2015-07-22 17:56:49

标签: c# unit-testing mstest race-condition staticresource

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

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

Counts是一个静态的Dictionary资源,该类中的所有单元测试都共享。我断言在测试结束时,我断言计数值为6表示Target的某个值(目标是枚举)。当我通过这个测试进行调试时,它总是传递最终的断言,但是,当我只运行它而没有任何断点时,Target的该值的计数可以是7或8,但绝不是6。

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

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

有没有人对这里发生的事情有任何见解?

1 个答案:

答案 0 :(得分:1)

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

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