ASP.NET MVC项目商品购买功能的并发测试需求
ASP.NET MVC 购买功能并发测试解决方案
一、先确保代码层面的并发安全性
测试前必须先堵住代码逻辑的漏洞,不然工具操作再正确也会出问题:
- 库存检查与扣减必须放在同一数据库事务内,同时使用行级锁(以SQL Server为例,用
UPDLOCK,HOLDLOCK),避免两个事务同时读取到相同的库存值。示例代码:
using (var transaction = db.Database.BeginTransaction()) { try { // 加行级锁查询商品,防止脏读 var product = db.Products.FromSqlRaw("SELECT * FROM Products WHERE Id = {0} WITH (UPDLOCK, HOLDLOCK)", productId).FirstOrDefault(); if (product == null || product.Stock < quantity) { throw new Exception("库存不足"); } // 扣减库存 product.Stock -= quantity; db.SaveChanges(); // 创建订单 var order = new Order { ProductId = productId, Quantity = quantity, /* 其他字段 */ }; db.Orders.Add(order); db.SaveChanges(); transaction.Commit(); } catch (Exception ex) { transaction.Rollback(); throw; } }
- 绝对不能用「先查询库存、再修改库存」的无锁逻辑,这种写法100%会出现超卖。
二、Postman 并发测试正确操作
Postman没有原生并发功能,但可以用以下方式模拟:
- 把结算接口做成独立请求,配置好参数(商品ID、购买数量、用户Token等)。
- 打开Collection Runner,选择该请求,设置迭代次数为2,延迟时间设为0毫秒。
- 必须给两个请求配置不同的用户凭证(比如不同的Token),避免会话冲突导致购物车数据混乱。
- 运行后查看结果:正常情况下应该一个请求成功创建订单,另一个返回「库存不足」,不会出现两个都成功的超卖情况。
三、JMeter 并发测试精准配置
JMeter是专业压测工具,配置步骤更严谨:
- 添加线程组:设置线程数为2(模拟两个用户),Ramp-Up时间设为0(让两个线程同时启动),循环次数1。
- 添加HTTP请求:配置结算接口的URL、请求方法(POST)、参数、请求头(比如Authorization Token)。
- 添加Cookie管理器:如果项目用Cookie维持会话,必须添加这个来隔离不同用户的会话。
- 添加用户凭证隔离:可以用「用户定义的变量」配合
${__threadNum}给每个线程分配不同Token,或者用「CSV数据集配置」导入多个用户账号。 - 添加查看结果树和响应断言:断言可以检查返回结果是否符合预期(比如一个成功、一个库存不足)。
- 运行测试:如果代码逻辑没问题,不会出现超卖,也不会有异常报错。
四、常见操作错误排查
- Postman测试时如果用同一个用户会话,会因为购物车数据冲突导致测试无效,必须用不同用户。
- JMeter的Ramp-Up时间不能设得太大,否则两个请求不是同时发起,无法模拟真实并发。
- 测试前要把商品库存设置为刚好等于单个用户的购买量(比如库存1,两个用户各买1),这样能直观看到并发处理效果。
- 不要用VS自带的IIS Express测试,它默认是单线程处理请求,会自动排队,无法模拟真实并发环境,要部署到IIS或用Kestrel运行项目。
内容的提问来源于stack exchange,提问作者Mahdi Rh
相关产品推荐
相关产品推荐

