假设我在一个类中有一个后台工作程序,它在后台线程中执行数据库查询。
我想测试这门课程
所以我模拟我的数据库并返回一些目前为止这么好的集合, 确保我的后台工作人员称之为工作 而且我想确保结束也发生了。
我注意到测试通过并随机失败(我认为它与线程有关)
任何建议
答案 0 :(得分:1)
您可能在后台线程和断言/验证之间存在竞争条件。
例如:
[Test]
public void TestWithRaceCondition()
{
bool called = false;
new Thread(() => called = true).Start();
Assert.IsTrue(called);
}
线程不一定在断言之前结束,有时它会,有时它不会。这种情况的解决方案是加入后台线程:
[Test]
public void TestWithoutRaceCondition()
{
bool called = false;
var thread = new Thread(() => called = true);
thread.Start();
thread.Join()
Assert.IsTrue(called);
}
检查它是否是竞争条件的一种方法是延迟测试线程(在断言之前长时间调用Thread.Sleep)以及测试是否停止失败,这是竞争条件的良好指示。