2012-07-09 27 views
1

我想测试从多个线程调用某个方法时,没有并发问题。我模拟该方法被同时调用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迭代是在表现出任何的并发问题是否有效?

+2

那么你的问题是什么?你是否要求进行代码审查? – slugster 2012-07-09 09:23:03

+0

我想知道这些测试是否适合测试多线程。或者,如果它没用... – Florian 2012-07-09 09:30:24

+0

Parallel.For是异步的,所以你使用更多的线程,取决于你有多少个CPU /核心。 – Maarten 2012-07-09 09:31:39

回答

1

测试需要测试特定场景。并发测试需要创建并发问题,而不是希望发生。测试应该需要一次运行。如果在你的代码中这很难记住,那里有比可测试代码更多的功能代码。但是......为了降低风险......你想让你的代码可测试。

因此,通过“并发”来确定你的意思并使之成为现实。要自信。调用一个方法并模拟它调用的内容。当它调用告诉你它在关键部分的东西时,则使用模拟框架来调用另一个调用。

你现在可能想知道“但这意味着多个线程”。线程是一个概念,注入用于创建线程的对象和任何处理冲突的对象。

你必须看着一两条线,思考....“两个可以做到这一点”。测试警卫。

3

IMO,这种测试不会透露太多。当然,对于这种特殊情况,很明显,结果在最后是正确的,但是在一般情况下,您要同时在一个集合中插入项目,测试实际添加的项目的数量会产生误导,因为要获取您期望并不排除在某个地方出现数据竞争的可能性,以及你“幸运”的可能性。