2

メソッドが複数のスレッドから呼び出されたときに、同時実行性の問題がないことをテストしたいと思います。メソッドが同時に 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);
}

my に対して複数の同時Parallel.Forイテレーションを実行すると、同時実行CustomerCache性の問題を効果的に示すことができますか?

4

2 に答える 2

3

IMO、この種のテストではあまり明らかになりません。確かに、この特定のケースでは、結果が最後に正しいことは明らかですが、コレクションにアイテムを同時に挿入する一般的なケースでは、実際に追加されたアイテムの数をテストするのは誤解を招くでしょう。 expect は、どこかでデータ競合が発生し、「運が良かった」という可能性を排除するものではありません。

于 2012-07-09T10:03:16.703 に答える
1

テストでは、特定のシナリオをテストする必要があります。並行性テストでは、並行性の問題が発生することを期待するのではなく、それを作成する必要があります。テストには1回の実行が必要です。コードでこれが難しい場合は、テスト可能なコードよりもはるかに多くの関数型コードがあることを忘れないでください。しかし...リスクを減らすために...あなたはあなたのコードをテスト可能にしたいのです。

したがって、「並行」とはどういう意味かを特定し、それを実現させます。断定的であること。メソッドを呼び出し、それが呼び出しているものをモックします。クリティカルセクションにあることを示す何かを呼び出すときは、モックフレームワークを使用して別の呼び出しを呼び出します。

あなたはおそらく「しかしそれは複数のスレッドを意味する」と思っているでしょう。スレッドは概念であり、スレッドの作成に使用されるオブジェクトや、競合を処理するものすべてを注入します。

あなたは一行か二行を見て考えているに違いありません....「二人はこれに到達できますか」。警備員をテストします。

于 2012-07-09T10:02:34.783 に答える