【发布时间】:2019-11-26 17:07:34
【问题描述】:
我正在尝试对上传到 Azure 的 WebApi 进行压力测试。具体来说,此测试用于登录应用程序。我决定使用 c# 制作一个模拟客户端并创建一个任务列表,每个任务都会向我的 WebApi 发送相同的请求。我的问题是它在使用超过 300 个任务后抛出异常。
异常:“线程已被取消”
内部异常:“对象引用未设置为对象的实例。”
发生异常的代码:await (Task.WhenAll(tasks));
我在测试代码中做错了吗?如果是这样,是什么?以及如何纠正错误?谢谢!
注意事项: -我已经尝试在本地针对 API 运行测试代码
-API 代码被一个 try catch 块包围,当针对它运行测试代码时,它没有命中我在 catch 块中设置的断点,并且测试代码中仍然抛出异常。
-由于这是一个工作中的项目,我已将真实登录凭据和 API 的 URL 替换为替身
下面是我的测试代码
public static async Task<decimal> LoginTestParallel3Async(){
Stopwatch timer = new Stopwatch();
var tasks = new List<Task>();
LoginRequestModel request = new LoginRequestModel();
int numOfRequests = 500;
decimal totalTimeForTasks = 0;
string jsonObject = "";
request.UserName = "User";
request.Password = "Password";
request.UserId = 0;
jsonObject = Newtonsoft.Json.JsonConvert.SerializeObject(request);
try
{
using (var client = new HttpClient())
{
for (int i = 0; i < numOfRequests; i++)
{
//tasks.Add(client.PostAsync("URLForAzure", new StringContent(jsonObject, Encoding.UTF8, "application/json")));
tasks.Add(client.PostAsync("URLForLocal", new StringContent(jsonObject, Encoding.UTF8, "application/json")));
}
timer.Start();
await (Task.WhenAll(tasks));
timer.Stop();
totalTimeForTasks = timer.ElapsedMilliseconds;
Console.WriteLine("total time for request: " + totalTimeForTasks + " milliseconds");
Console.ReadLine();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message.ToString());
return totalTimeForTasks;
}
return totalTimeForTasks;
}
【问题讨论】: