什么是软件测试中的并发测试?
什么是并发测试?
并发测试 是一种用于检测应用程序在多用户登录情况下缺陷的测试技术。换句话说,它监控多个用户同时执行相同操作时的影响。
并发测试也称为 多用户测试测试并发程序比测试顺序程序更具挑战性,因为存在不确定性和同步问题:即使代码没有发生任何变化,同一个测试也可能在一次运行中通过,而在下一次运行中失败。
下图说明了这一概念——多个用户在同一时刻访问同一个应用程序资源,测试观察应用程序如何处理重叠部分。
为什么需要并发测试
有两个问题值得我们付出努力,而且这两个问题对于单用户功能运行都是不可见的。
- 它能识别同时访问相同数据库记录、模块或应用程序代码所产生的影响。
- 它可以识别和衡量死锁、锁定、单线程代码的使用以及对共享资源的受限访问的程度。
某个功能对一个用户来说可能完全正确,但对于一毫秒后到达的第二个用户来说仍然会丢失数据,这就是为什么这项技术与……并存的原因。 性能测试 而不是在功能测试内部。
如何执行并发测试
并发测试遵循可重复的顺序。以下步骤从 sco 开始。ping 以解决。
- 步骤 1)识别容易发生并发的流程。 查找共享状态:同时登录、座位或股票预订、余额更新、批量作业写入同一张表以及路径中的任何单线程组件。
- 步骤 2)设置并发目标。 根据实际使用高峰期而非整数,确定同一时刻必须有多少用户采取行动。
- 步骤 3)设计测试用例。 每 测试用例 将共享资源、竞争行为和预期的最终状态配对——例如,两个会话从同一个帐户取款不能同时成功。
- 步骤 4)编写脚本并选择工具。 需要一个能够生成可配置虚拟用户的负载生成器; JMeter 是常见的开源选择,其线程组设置直接映射到并发场景。
- 步骤5) Ramp 逐渐地。 分阶段增加并发用户数,而不是一下子增加。ping 到达目标位置,因此可以清楚地看到争斗开始的层级。
- 步骤 6)监测和分析。 观察锁等待、响应时间差异、错误率和数据库阻塞情况——并发缺陷通常会先表现为时间异常,然后才会表现为错误。
- 步骤 7)解决问题并重新运行。 修复同步、索引或锁定原因,然后重复相同的运行以确认行为已改变而不是发生了变化。
常见并发缺陷
并发缺陷可以归为少数几个可识别的类别,正确命名类别通常可以直接指出修复方法。
| 缺陷 | 会发生什么 | 典型症状 |
| 竞争条件 | 结果取决于哪个会话先结束。 | 有些比赛的总分正确,有些比赛的总分错误。 |
| 僵局 | 两个会话各自持有对方所需的锁 | 事务挂起而不是返回错误 |
| 丢失更新 | 第二次写入操作会覆盖第一次写入操作,而不会读取第一次写入操作。 | 已保存的更改悄无声息地消失了。 |
| 数据损坏 | 共享结构仅部分写入 | 处于无法创建有效交易的状态的记录 |
| 饥饿 | 某个会话始终无法获得它所等待的资源。 | 系统运行正常时,单个用户路径超时。 |
由于这些故障是间歇性的,因此每次运行都需要记录日志和时间戳;否则,无法通过以下方式令人信服地提出缺陷: 缺陷管理流程.
并发测试示例
假设一家网店库存中只剩最后一件商品。两名顾客同时打开商品页面,并同时按下购买按钮。 购买房产.
- 场景: 两个会话读取库存 = 1,都通过了可用性检查,并且都写入库存 = 0。
- 预期结果: 一个订单已确认,另一个订单收到缺货通知,库存永远不会变为负数。
- 缺陷指标: 两个订单都确认,或者库存变为 -1,这表明可用性检查和减量操作不是作为一个原子步骤执行的。
- 值得尝试的变体: 相同的两个会话编辑同一个个人资料记录,对同一个请求进行两次审批,并在用户保存时通过批量作业更新表格。
同样的模式可以推广:找到一个资源、两个写入者,但没有顺序保证。在运行场景期间 系统测试在添加负载之前,保持诊断清晰。
并发测试的优势
- 它将并发交互的范围限制在少数几个广泛使用、经过充分测试的组件上,从而相对减少了测试应用程序所需的工作量。
- 封装使得无需审查整个代码库即可分析程序的一部分的行为。
- 它有助于提高并发程序的可靠性和鲁棒性。
- 它能及早发现锁定和阻塞限制,因此容量决策取决于实际争用情况,而不是估计情况。
并发测试的缺点
测试人员在执行并发测试时通常会遇到以下缺点。
- 该应用程序需要在多个平台上进行测试。
- 并发场景需要比顺序场景更密集的测试。
- 函数不会立即将结果返回给调用者;相反,结果可以稍后通过通知、代码块、回调函数或类似机制传递,这使得测试更加困难。
- 信息或程序流未反映在调用堆栈中。
- 由于并发系统中的进程在执行过程中会相互交互,因此系统中的执行路径数量可能非常庞大。
- 并发程序的失败率比顺序程序高。
- 调试并发程序很困难,因为附加调试器会改变导致故障的时序。

