我想测试一下从多个线程调用方法时,没有并发问题。我模拟该方法同时被调用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
次迭代是否可以有效地显示任何并发问题?
答案 0 :(得分:3)
答案 1 :(得分:1)
测试需要测试特定场景。并发测试需要创建并发问题而不是希望发生。测试应该需要一次运行。如果您的代码中存在困难,请记住,除了可测试代码之外,还有更多功能代码。但是......为了降低风险......你想让你的代码可以测试。
所以,确定你的意思是什么&#39;并发&#39;并使它成为现实。要自信。调用一个方法并模拟它调用的内容。当它调用一些东西告诉你它在关键部分时,然后使用模拟框架来调用另一个调用。
你现在可能想知道&#34;但这意味着多线程&#34;。线程是一个概念,注入用于创建线程的对象以及处理冲突的任何东西。
你必须要看一两行并且思考......&#34;两个人可以到达这个&#34;。测试警卫。