此测试对测试并发性问题有意义吗?

时间:2012-07-09 09:17:51

标签: c# multithreading unit-testing concurrency

我想测试一下从多个线程调用方法时,没有并发问题。我模拟该方法同时被调用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);
}

对我的Parallel.For运行多个同时CustomerCache次迭代是否可以有效地显示任何并发问题?

2 个答案:

答案 0 :(得分:3)

IMO,这种测试并没有透露太多。当然,对于这个特殊情况,很明显结果在最后是正确的,但是在一般情况下,你同时在一个集合中插入项目,测试实际添加的项目数是错误的,因为得到你的东西期望不排除某个地方存在数据竞争的可能性,并且你只是“幸运”。

答案 1 :(得分:1)

测试需要测试特定场景。并发测试需要创建并发问题而不是希望发生。测试应该需要一次运行。如果您的代码中存在困难,请记住,除了可测试代码之外,还有更多功能代码。但是......为了降低风险......你想让你的代码可以测试。

所以,确定你的意思是什么&#39;并发&#39;并使它成为现实。要自信。调用一个方法并模拟它调用的内容。当它调用一些东西告诉你它在关键部分时,然后使用模拟框架来调用另一个调用。

你现在可能想知道&#34;但这意味着多线程&#34;。线程是一个概念,注入用于创建线程的对象以及处理冲突的任何东西。

你必须要看一两行并且思考......&#34;两个人可以到达这个&#34;。测试警卫。