繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM