C# 这个测试对测试并发性问题有意义吗?

C# 这个测试对测试并发性问题有意义吗?,c#,multithreading,unit-testing,concurrency,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(() => {

我想测试一下,当从多个线程调用一个方法时,不存在并发问题。我模拟该方法同时被调用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);
}
public void应该\u插入\u 2000\u客户\u使用\u并发()
{
var fakeCustomers=InitCustomersFromDb();
Action InsertCustomers从0到1000=新操作(()=>
{
对于(0,1000,x=>
{
CustomerCache.Instance.SetCustomer(x.ToString(),fakeCustomers[0]);
});
});
Action InsertCustomers从_1000_到_2000=新操作(()=>
{
对于(10002000,x=>
{
CustomerCache.Instance.SetCustomer(x.ToString(),fakeCustomers[0]);
});
});
Action InsertCustomers从0到2000=新操作(()=>
{
对于(0,2000,x=>
{
CustomerCache.Instance.SetCustomer(x.ToString(),fakeCustomers[0]);
});
});
列表任务=新列表();
tasks.Add(Task.Factory.StartNew(insertCustomersFrom_0_到_1000));
tasks.Add(Task.Factory.StartNew(insertCustomersFrom_1000_至_2000));
tasks.Add(Task.Factory.StartNew(insertCustomersFrom_0_到_2000));
Task.WaitAll(tasks.ToArray());
var customers=CustomerCache.Instance.GetCustomers();
断言(customers.Count==2000);
}

针对my
CustomerCache
并行运行多个同时的
迭代能否有效地显示任何并发问题?

测试需要测试特定场景。并发性测试需要创建一个并发性问题,而不是希望它发生。测试应该需要一次运行。如果在代码中很难做到这一点,请记住,功能代码比可测试代码多得多。但是为了降低风险。。。您希望使代码可测试

所以,确定你所说的“并发”是什么意思,并让它发生。要有主见。调用一个方法并模拟它正在调用的内容。当它调用告诉您它在关键部分的内容时,使用模拟框架调用另一个调用

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


你一定是在看一两行然后想。。。。“两个人能做到这一点吗?”。测试防护装置。

测试需要测试特定场景。并发性测试需要创建一个并发性问题,而不是希望它发生。测试应该需要一次运行。如果在代码中很难做到这一点,请记住,功能代码比可测试代码多得多。但是为了降低风险。。。您希望使代码可测试

所以,确定你所说的“并发”是什么意思,并让它发生。要有主见。调用一个方法并模拟它正在调用的内容。当它调用告诉您它在关键部分的内容时,使用模拟框架调用另一个调用

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


你一定是在看一两行然后想。。。。“两个人能做到这一点吗?”。测试防护装置。

在我看来,这种测试并没有显示太多。当然,对于这种特殊情况,很明显最终结果是正确的,但在一般情况下,如果同时在集合中插入项,则测试实际添加的项的数量会产生误导,因为得到你所期望的并不排除在某个地方有数据竞争,你只是“幸运”而已。在我看来,这种测试并没有揭示太多。当然,对于这种特殊情况,很明显最终结果是正确的,但在一般情况下,如果同时在集合中插入项,则测试实际添加的项的数量会产生误导,因为得到你所期望的并不排除某个地方有数据竞争,你只是“走运”的可能性。那么你的问题是什么?你是在要求代码审查吗?我想知道这种测试是否适合测试多线程。或者如果它没用的话…Parallel.For是异步的,所以你会根据你有多少cpu/内核使用更多的线程。我认为你的
操作中的3个循环不太可能同时在同一个id值上工作。我不明白这段代码应该做什么。为什么要添加0..1000和1000..2000中的客户,然后通过添加0..2000覆盖这些客户。那么,您的问题是什么?你是在要求代码审查吗?我想知道这种测试是否适合测试多线程。或者如果它没用的话…Parallel.For是异步的,所以你会根据你有多少cpu/内核使用更多的线程。我认为你的
操作中的3个循环不太可能同时在同一个id值上工作。我不明白这段代码应该做什么。为什么要从0..1000和1000..2000添加客户,然后通过从0..2000添加来覆盖它们。