C#接口测试如何连续提交100个交易JSON返回200状态码
原有写法错误原因
- 第一种写法报错:
StringContent构造函数没有接收List<string>类型的重载,仅支持传入字符串类型的内容,因此直接传列表会触发语法错误。 - 第二种写法接口仅识别1笔交易:直接拼接100个JSON对象会生成非法JSON格式(形如
{"type":"transaction",...}{"type":"transaction",...}),服务端解析时只会读取第一个完整的JSON对象,剩余内容会被忽略。
方案1:接口支持批量提交(单次请求传多笔交易)
先构造合法的JSON数组结构,将100个交易对象放入数组后再序列化传入请求体:
[Test] public async Task Create100TransactionsReturns200() { var singleTransactionJson = JsonReader.ReadJson("Transaction"); var singleTransaction = JObject.Parse(singleTransactionJson); // 构造JArray存储100个交易对象 JArray transactionsArray = new JArray(); for (int i = 0; i < 100; i++) { // DeepClone避免重复引用同一个对象 transactionsArray.Add(singleTransaction.DeepClone()); } var content = new StringContent(transactionsArray.ToString(), Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync(CreateNewTransactionURL, content); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); }
注意:如果后端要求的批量格式不是数组,而是外层包对象的结构(如{"transactions": [xxx]}),自行调整JArray的外层结构即可。
方案2:接口仅支持单笔提交,需连续发起100次请求
循环调用单笔创建接口,每次发起独立请求,普通功能测试用串行提交即可:
[Test] public async Task Create100TransactionsReturns200() { var singleTransactionJson = JsonReader.ReadJson("Transaction"); var jObject = JObject.Parse(singleTransactionJson); var json = jObject.ToString(); // 串行提交,每次等上一笔完成再发下一笔 for (int i = 0; i < 100; i++) { var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await HttpClient.PostAsync(CreateNewTransactionURL, content); Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); } }
如果是压测场景需要并行提交,可以改用Task.WhenAll批量执行请求:
[Test] public async Task Create100TransactionsReturns200() { var singleTransactionJson = JsonReader.ReadJson("Transaction"); var jObject = JObject.Parse(singleTransactionJson); var json = jObject.ToString(); var tasks = new List<Task<HttpResponseMessage>>(); for (int i = 0; i < 100; i++) { var content = new StringContent(json, Encoding.UTF8, "application/json"); tasks.Add(HttpClient.PostAsync(CreateNewTransactionURL, content)); } var responses = await Task.WhenAll(tasks); foreach (var response in responses) { Assert.AreEqual(HttpStatusCode.OK, response.StatusCode); } }
内容的提问来源于stack exchange,提问作者Natali
相关产品推荐
相关产品推荐

