[英]Does this test make sense for testing concurrency problems?
我想测试一下,当从多个线程中调用一个方法时,没有并发问题。 我模拟该方法被同时调用3次,并将2000个客户插入我的缓存中,以确保没有并发问题。
public void Should_Insert_2000_Customers_Using_Concurrency()
{
var fakeCustomers = InitCustomersFromDb();
Action insertCustomersFrom_0_to_1000 = new Action(() =>
{
Parallel.For(0, 1000, x =>
{
CustomerCache.Instance.SetCustomer(x.ToString(), fakeCustomers[0]);
});
});
Action insertCustomersFrom_1000_to_2000 = new Action(() =>
{
Parallel.For(1000, 2000, x =>
{
CustomerCache.Instance.SetCustomer(x.ToString(), fakeCustomers[0]);
});
});
Action insertCustomersFrom_0_to_2000 = new Action(() =>
{
Parallel.For(0, 2000, x =>
{
CustomerCache.Instance.SetCustomer(x.ToString(), fakeCustomers[0]);
});
});
List<Task> tasks = new List<Task>();
tasks.Add(Task.Factory.StartNew(insertCustomersFrom_0_to_1000));
tasks.Add(Task.Factory.StartNew(insertCustomersFrom_1000_to_2000));
tasks.Add(Task.Factory.StartNew(insertCustomersFrom_0_to_2000));
Task.WaitAll(tasks.ToArray());
var customers = CustomerCache.Instance.GetCustomers();
Assert.That(customers.Count == 2000);
}
在我的CustomerCache
上同时运行多个Parallel.For
迭代是否可以有效地显示任何并发问题?
海事组织,这种测试并没有太多揭示。 当然,对于这种特殊情况,很显然结果在最后是正确的,但是在通常情况下,如果您同时在集合中插入项目,则测试实际添加的项目数会产生误导,因为Expect不排除在某处发生数据争用并且您只是“幸运”的可能性。
测试需要测试特定的场景。 并发测试需要创建一个并发问题,而不是希望发生一个并发问题。 该测试应该需要运行一次。 如果在您的代码中很难做到这一点,请记住,那里有比可测试代码更多的功能代码。 但是……为了降低风险……您想使代码可测试。
因此,确定“并发”的含义并使其实现。 要有主见。 调用一个方法并模拟它所调用的内容。 当它告诉您的内容位于关键部分时,请使用模拟框架调用另一个调用。
您现在可能想知道“但这意味着多个线程”。 线程是一个概念,注入用于创建线程的对象以及任何处理冲突的对象。
您必须看着一两行,然后思考..“两个人可以做到这一点”。 测试警卫。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.