什么是软件测试中的线程测试?

⚡ 智能摘要

线程测试验证单个业务任务在集成系统中运行的关键功能,它在集成测试的早期阶段运行,而不是在每个组件完成后运行。

  • 🧵 核心思想: 一个线程就是一个端到端的业务交易,测试会沿着该路径跨越集成模块进行。
  • ⏱️ 运行时: 在集成测试阶段的早期,作为一种增量式系统集成策略。
  • 🔀 两种口味: 单线程测试一次只执行一个事务,多线程测试一次同时执行多个事务。
  • 🐞 捕获的内容: 单路径测试无法发现的竞争条件、死锁、共享资源冲突和数据损坏。
  • 🧰 运行方法: 使用不同的应用程序组合、多个实例、不同的硬件和代码检查进行重复运行。
  • 📉 诚实的底线: 对于多线程代码,可复现的单元测试仍然很困难,因此时序缺陷可能是间歇性的。

软件测试中的线程测试是什么?它包括单线程和多线程类型。

什么是线程测试?

线程测试 是一种软件测试类型,用于验证特定任务(称为线程)的关键功能。它通常在软件开发的早期阶段进行。 集成测试 阶段。基于线程的测试是系统集成测试中采用的增量策略之一。因此,线程测试更恰当的描述是…… 线程交互测试.

这里的线程不仅仅是指操作系统线程。 软件工程 就术语而言,一个线程就是一个完整的业务交易——例如“客户下单”—— trac它会遍历所有与之交互的模块。线程测试会检查当模块连接在一起后,这条单一路径是否仍然能够正常工作。

下图展示了在组装整个系统之前,各个线程是如何作为一个子系统进行集成和运行的。

线程测试图展示了线程如何逐步集成到子系统,然后再集成到整个系统中。

线程测试的类型

基于线程的测试分为两类,这种区别决定了测试数据和可能发现的缺陷。

  • 单线程测试: 单线程测试一次只处理一个应用程序事务。由于只处理一个请求,因此响应行为是可预测的,而且测试易于编写脚本和重复执行。
  • 多线程测试: 多线程测试是指同时运行多个活跃事务。针对同一服务会创建多个线程,以便在并发负载下观察响应速度和共享状态处理能力。

在单线程测试中顺利通过的事务在多线程运行中仍然可能失败,因为第二次运行会增加对相同记录、连接和内存的争用。

如何进行线程测试

该线程流程侧重于集成活动,而非完整的开发生命周期。在实践中,该方法的工作方式如下。

  • 基于线程的测试是基于会话的测试的一种通用形式,其中会话是线程的一种形式,但线程不一定是会话。
  • 线程或程序(小功能)作为子系统逐步集成和测试,然后在整个系统中执行。
  • 从最基本的层面来说,它能让集成商更好地了解测试范围。
  • 它不直接测试软件组件,而是要求集成商专注于在整个系统的上下文中测试逻辑执行路径。

由于工作单元是业务路径而非组件,线程测试自然而然地位于两者之间。 模块测试 并且充分 系统测试.

多线程测试技巧

多线程缺陷与时序密切相关,因此单次干净运行所能提供的信息非常有限。以下技巧可以提高发现这些缺陷的几率。

  • 通过反复运行不同组合的应用程序来测试您的多线程程序。
  • 通过同时运行程序的多个实例来测试您的多线程程序。
  • 在不同的硬件型号上,以不同的压力水平和工作负载运行您的多线程程序。
  • 使用代码检查,因为有些同步错误更容易阅读,但难以重现。
  • 仅收集主线程以外的线程中发生的错误和故障。

螺纹测试中发现的常见缺陷

并发故障很少会通过清理堆栈来宣告自身。 trace. 以下类别涵盖了多线程运行所暴露的大部分问题,并且每个类别都有一个值得注意的独特症状。

  • 比赛条件: 两个线程无序地读写同一个值,因此最终结果取决于哪个线程先完成。症状:某些运行结果正确,而另一些运行结果错误。
  • 僵局: 两个线程各自持有对方所需的锁,导致双方都无法继续执行。症状:事务无限期挂起,而不是抛出错误。
  • 资源争用: 线程会排队等待同一个连接、文件句柄或记录,导致吞吐量在达到硬件限制之前就崩溃了。
  • 数据损坏: 部分写入的共享结构会将记录置于一种任何有效交易都无法产生的状态。
  • 饥饿: 低优先级线程始终无法获得所需的资源,因此一个用户路径超时,而系统的其他部分看起来运行正常。

这些都需要将失败的运行过程记录在日志中,因为如果缺陷在五十次尝试中只出现一次,则无法通过其他方式提出。 缺陷管理流程.

线程测试、并发测试和集成测试

这三个术语含义重叠,在测试计划中经常混淆。下表根据其用途对它们进行了区分。

方面 线程测试 并发测试 整合测试
受测单元 跨模块的一次业务交易 多个用户或线程同时执行操作 两个或多个组件之间的接口
主要问题 这条关键路径是否能够端到端运行? 同时访问时会出现什么问题? 各个模块之间通信正常吗?
典型阶段 早期集成测试 系统或性能测试 单元测试之后
针对的缺陷 执行路径断裂,交接环节缺失 僵局、竞争条件、锁争 接口不匹配,数据连接错误tracts
关系 多线程变体与并发测试存在重叠 比线程测试的多线程部分范围更广 线程测试是其中的一种增量策略。

总之, 并发测试 线程测试考察的是并发访问对系统的影响,而线程测试则考察的是某个重要路径在集成后是否仍然有效。同时进行这两项测试的团队通常会先安排线程测试。

螺纹测试的优势

该技术因其诸多实际原因而在集成方案中占有一席之地。

  • 关键业务路径会尽早得到验证,以便在整个系统组装完成之前发现交接环节出现问题。
  • 集成商可以清晰地了解测试范围,因为测试单元是一个可识别的事务,而不是一个抽象的概念。tract分量边界。
  • 在系统上下文中测试逻辑执行路径会暴露出原本孤立的故障。 组件测试 看不见。
  • 多线程运行可以解决并发缺陷——死锁、竞态条件和资源冲突——否则这些缺陷就会影响生产环境。
  • 增量集成可以保持调试范围较小,因为一次只添加一个线程。
  • 结果直接影响到 回归测试因为传递的线程显然是回归测试套件的候选对象。

线程测试的缺点

  • 对于多线程测试而言,最大的挑战是能够为单元测试编写可复现的测试用例。
  • 为多线程代码编写单元测试是一项具有挑战性的任务。
  • 多线程测试的测试标准与单线程测试有所不同。对于多线程测试,当代码在不同的硬件上运行时,内存大小、存储容量和时序问题等因素都会有所不同。
  • 线程在所跨越的模块可用之前无法进行测试,因此调度取决于集成顺序。
  • 间歇性故障很容易被当作环境噪音而忽略,因此,有条不紊的记录至关重要。

常见问题

测试负责人与业务分析师合作,根据收入影响和使用频率对交易进行排序。价值最高的路径会优先集成和串联,以便在项目进度允许的情况下,及时发现关键的交接故障。

它记录了业务路径、经过的模块、模块间传递的数据以及预期的最终状态。这与组件不同。 测试用例,通过条件位于整个事务的末尾。

通常的做法是使用能够生成可配置虚拟用户的负载生成器—— JMeter 是常见的开源选项。线程数、加速和循环设置直接对应于多线程场景。

机器学习模型对数千次重复运行的日志模式进行聚类,并标记出导致程序挂起或记录损坏的交错序列。这样就能将间歇性时序故障缩小到一小部分可疑序列。

GitHub 副驾驶 它能快速地模拟线程池、闩锁和压力循环。测试人员仍然需要确定哪些同步点至关重要,因为生成的测试通常无需强制执行真正的交错操作就能通过。

没有固定的运行次数。团队会在不同的工作负载和硬件上重复运行测试,直到故障不再出现,然后将此场景保留在夜间测试套件中,因为环境变化会导致时序缺陷再次出现。

每个优先级线程都能完整执行,没有未解决的缺陷;多线程运行达到目标并发度;并且不存在死锁或数据损坏类错误等未解决问题。 测试生命周期.

是的——线程变成了跨服务的请求路径,而不是跨模块的请求路径。分布式 tracing 替换了本地调用堆栈,同样的问题也适用:一个业务事务能否在每一跳中完整地保留下来?

总结一下这篇文章: