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长时间只是断言之前),如果测试停止失败,这是比赛状况的良好指示。
好主意.. 以及我如何得到这个线程的参考? 我正在测试封装这个东西的代码.. – 2009-11-23 19:27:17
“配方”是为了可测试性而设计它,它需要一些工作。您可以使回调/线程/工作对测试可见(使用InternalsVisibleTo或使其成为虚拟并在继承类上测试它)。你可以看看一个例子:http://stackoverflow.com/questions/1770830/c-how-to-test-a-basic-threaded-worker-class/1770886#1770886。 其他我喜欢的选项是通过在Assert调用之前将测试线程休眠来添加一些“缓冲区”。 – Elisha 2009-11-23 21:06:22