如何在.net中测试并发场景
本文关键字:并发 测试 net | 更新日期: 2023-09-27 18:18:22
我曾使用过并发性,但我不知道任何测试它的好方法。
我想知道是否有任何方法可以"强制"任务以特定的顺序执行以模拟测试用例。
例如:- 客户端#1发出请求
- 服务器开始检索数据到客户端#1
- 客户端#2发出另一个请求,而服务器仍在响应客户端#1
- 断言& lt; & lt;东西>>
我见过一些人使用自定义taskscheduler。这有意义吗?
我也多次遇到过这个问题。最后,我创建了一个助手,它可以启动一堆线程来执行并发操作。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)放到服务器上,由哪个部分响应消费者。这样,您的服务器在发送响应之前会有延迟。您可以调用服务请求,只需在循环中创建新线程。