如何在.net中测试并发场景

本文关键字:并发 测试 net | 更新日期: 2023-09-27 18:18:22

我曾使用过并发性,但我不知道任何测试它的好方法。

我想知道是否有任何方法可以"强制"任务以特定的顺序执行以模拟测试用例。

例如:

  1. 客户端#1发出请求
  2. 服务器开始检索数据到客户端#1
  3. 客户端#2发出另一个请求,而服务器仍在响应客户端#1
  4. 断言& lt; & lt;东西>>

我见过一些人使用自定义taskscheduler。这有意义吗?

如何在.net中测试并发场景

我也多次遇到过这个问题。最后,我创建了一个助手,它可以启动一堆线程来执行并发操作。helper提供同步原语和日志记录机制。下面是一个单元测试的代码片段:

[Test]
public void TwoCodeBlocksInParallelTest()
{
    // This static method runs the provided Action delegates in parallel using threads
    CTestHelper.Run(
        c =>
            {
                Thread.Sleep(1000); // Here should be the code to provide something 
                CTestHelper.AddSequenceStep("Provide"); // We record a sequence step for the expectations after the test
                CTestHelper.SetEvent();
            },
        c =>
            {
                CTestHelper.WaitEvent(); // We wait until we can consume what is provided
                CTestHelper.AddSequenceStep("Consume"); // We record a sequence step for the expectations after the test
            },
        TimeSpan.FromSeconds(10)); // This is a timeout parameter, if the threads are deadlocked or take too long, the threads are terminated and a timeout exception is thrown 
    // After Run() completes we can analyze if the recorded sequence steps are in the correct order
    Expect(CTestHelper.GetSequence(), Is.EqualTo(new[] { "Provide", "Consume" }));
}

它可以用来测试客户端/服务器或组件中的同步,或者只是运行一个超时的线程。我将在接下来的几周继续改进它。以下是项目页面:并发测试助手

这应该不会太难模拟使用任务:

private async Task DoSomeAsyncOperation()
{
    // This is just to simulate some work,
    // replace this with a usefull call to the server
    await Task.Delay(3000);
}

现在,让我们消费它:

public async Task TestServerLoad()
{
   var firstTaskCall = DoSomeAsyncOperation();
   await Task.Delay(1000); // Lets assume it takes about a second to execute work agains't the server
   var secondCall = DoSomeAsyncOperation();
   await Task.WhenAll(firstTaskCall, secondCall); // Wait till both complete
}

这是并发性中基本的生产者-消费者问题。如果您想要测试这种情况,只需将一个Thread.Sleep(100)放到服务器上,由哪个部分响应消费者。这样,您的服务器在发送响应之前会有延迟。您可以调用服务请求,只需在循环中创建新线程。