我应该如何对多线程代码进行单元测试?

2023-12-14

到目前为止,我已经避免了测试多线程代码的噩梦,因为它看起来像是一个雷区。我想问人们如何测试依赖线程成功执行的代码,或者人们如何测试仅在两个线程以给定方式交互时才出现的此类问题?

对于当今的程序员来说,这似乎是一个非常关键的问题,恕我直言,汇集我们在这个问题上的知识将很有用。


看,没有简单的方法可以做到这一点。我正在开发一个本质上是多线程的项目。事件来自操作系统,我必须同时处理它们。

处理测试复杂的多线程应用程序代码的最简单方法是:如果它太复杂而无法测试,那么您就做错了。如果您有一个实例,有多个线程对其进行操作,并且您无法测试这些线程相互交叉的情况,那么您的设计需要重做。它既简单又复杂。

有许多方法可以进行多线程编程,以避免线程同时运行实例。最简单的方法是使所有对象不可变。当然,这通常是不可能的。因此,您必须确定设计中线程与同一实例交互的位置,并减少这些位置的数量。通过这样做,您可以隔离实际发生多线程的几个类,从而降低测试系统的整体复杂性。

但您必须意识到,即使这样做,您仍然无法测试两个线程相互干扰的每种情况。为此,您必须在同一个测试中同时运行两个线程,然后准确控制它们在任何给定时刻执行的行。你能做的最好的事情就是模拟这种情况。但这可能需要您专门为测试编写代码,这最多只是迈向真正解决方案的半步。

测试代码是否存在线程问题的最佳方法可能是通过代码的静态分析。如果您的线程代码不遵循一组有限的线程安全模式,那么您可能会遇到问题。我相信VS中的代码分析确实包含一些线程的知识,但可能不多。

看,就目前的情况来看(并且可能在未来的一段美好时光里),测试多线程应用程序的最佳方法是尽可能降低线程代码的复杂性。最大限度地减少线程交互的区域,尽可能地进行测试,并使用代码分析来识别危险区域。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何对多线程代码进行单元测试? 的相关文章

  • ExpectedFailure 被计为错误而不是通过

    我在用着expectedFailure因为有一个我想记录的错误 我现在无法修复 但想将来再回来解决 我的理解expectedFailure是它会将测试计为通过 但在摘要中表示预期失败的数量为 x 类似于它如何处理跳过的 tets 但是 当我
  • 我们可以使用 x86_64 CPU 原子在 PCI Express 上生成复合原子操作吗?

    如您所知 从2 0版本开始 PCI Express支持复合原子操作 FetchAdd Swap CAS https pcisig com sites default files specification documents ECN Ato
  • 无法获取log.d或输出Robolectrict + gradle

    有没有人能够将 System out 或 Log d 跟踪从 robolectric 测试输出到 gradle 控制台 我在用Robolectric Gradle 测试插件 https github com robolectric robo
  • 使用 async/await 抛出和捕获异常的正确方法

    全部请拿下面的二维码 Task
  • 进度条没有进展

    我有一个正在更新 sqlserver 中的表的程序 我有一个表单 我想显示其进度 进度条正在递增 但没有显示 我需要为此使用后台工作者吗 我正在做什么的例子 public void updateTable string tableName
  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • asp.net core / kestrel中的线程管理

    我正在解决我们已迁移到 asp net core 2 0 的 asp net 应用程序的性能 可扩展性问题 我们的应用程序作为应用程序服务托管在 azure 上 并且在任何中等流量的情况下都很容易崩溃 让我困惑的一件事是如何处理多个并发请求
  • Xcode 异步单元测试在主线程上等待

    我正在尝试使用 Xcode 中的单元测试来测试一些异步代码 但主线程被阻塞 问题在于 某些正在测试的代码期望从 iOS 类 AVFoundation 接收回调 但是 AVFoundation 类似乎只会在主线程上回调 问题是 如果我正在进行
  • 无锁算法真的比全锁算法性能更好吗?

    陈雷蒙德 http blogs msdn com b oldnewthing 一直在做一个huge http blogs msdn com b oldnewthing archive 2011 04 15 10154245 aspx ser
  • 如何向 PyQt5 GUI 添加线程?

    所以我使用 QT Designer 创建了一个 GUI 它工作得很好 但在更复杂的调用中 它不会更新主窗口并锁定 我想运行我的CustomComplexFunction 在根据不断变化的后端信息更新主窗口中的文本编辑时 我希望它每 2 秒运
  • 向无锁队列添加阻塞函数

    我有一个基于循环缓冲区的无锁多生产者 单消费者队列 到目前为止 它只有非阻塞push back and pop front 来电 现在我想添加这些调用的阻塞版本 但我想尽量减少这对使用非阻塞版本的代码性能的影响 也就是说 它不应该将它们变成
  • 寻找自定义 SynchronizationContext 的示例(单元测试所需)

    我需要定制同步上下文 http msdn microsoft com en us library system threading synchronizationcontext aspx that 拥有一个运行 Posts 和 Sends
  • 使用ftplib进行多线程上传

    我正在尝试进行多线程上传 但出现错误 我猜想也许不可能在 ftplib 中使用多线程 这是我的代码 class myThread threading Thread def init self threadID src counter ima
  • 如何根据特定条件触发电子邮件以在 Jenkins 中成功构建

    每当某个条件在构建后步骤的执行 shell 中成立时成功的构建 我想触发电子邮件发送 问题是 即使条件不成立 构建也会被视为success 我正在尝试实现的内容 if condition true then
  • 以线程安全的方式获取随机数

    这是一篇描述随机数线程安全性的好文章 以线程安全的方式获取随机数 http blogs msdn com b pfxteam archive 2009 02 19 9434171 aspx 但我坚持使用 RandomGen2 示例 publ
  • 如何测试调用父类的受保护(不需要的)方法的方法?

    我陷入了一个非常奇怪的情况 我有一些需要测试的特定代码 这里是 public class A The real method of real class is so big that I just don t want to test it
  • 如何在其他核心上运行每个线程?

    我有一个 udp 服务器接收数据并计算它 每个角色我都有两个线程 我的CPU是8个多核 我以不同的速度发送数据 但最多我只使用了 cpu 两核 50 的 14 如果我发送更多的数据值 我的缓冲区将填满并且不会使用更多的CPU 为什么每个核心
  • 从创建 UI 的同一线程更新 VCL。为什么?

    我知道我必须调用 Synchronize 来从未创建控件或向窗口发送消息的线程更新 vcl 我经常听到 线程不安全 这个词 但我找不到关于正在发生的事情的实际解释 我知道应用程序可能会因访问冲突而崩溃 但我又不知道为什么 请阐明这个主题 V
  • Java:使用 Java.util.concurrent 线程访问读取线程串行端口

    我正在尝试编写一个 Java 串行设备驱动程序并想使用 对我来说是新的 java util concurrent包裹 我有一种发送数据包然后等待 ACK 的方法 我打算有炭 接收在不同的线程中运行 如果接收线程收到 ACK 它应该使用发送数
  • 单元测试术语概述(存根与模拟、集成与交互)?

    我在我的项目中使用了更多的单元测试 并阅读了我可以在网上找到的所有信息 并且对很多术语感到困惑 因此 我可能在对话和谷歌搜索中错误地使用了这些术语 有人可以概述所有单元测试术语 例如 假 类型以及测试类型 交互与集成 吗 当谈到模拟 假货和

随机推荐

  • 如何使用 React Router v6 导航到上一页,同时将当前页面的状态传递给它?

    我知道我可以使用navigate 1 来自useNavigate 钩子 导航到上一页 但使用navigate 1 state state 似乎不起作用 因为当我转到上一页时我得到一个空值 The navigate函数有两个函数签名 一个需要
  • 在 PHP 中通过正确的身份验证确保安全登录

    如何在 PHP 中编写 组合安全登录 这网站开发者指南说我不应该自己动手 所以参考通过谷歌提供的示例是没有用的 高手们是如何做到的呢 假设您正在 Rails 中构建一个世界级的应用程序 相同的库 技术可以在这里使用吗 Thanks 在 Ra
  • 无法连接到 StreamSocketListener

    我正在尝试连接到 Windows 10 应用程序中的 StreamSocketListener 如果客户端套接字位于同一应用程序内 则此方法有效 但如果我尝试从另一个应用程序 例如 Putty 连接 它就不起作用 几秒钟后 腻子显示 网络错
  • 在java中使用super.paintComponent(g)或getGraphics()

    我对几件事有点困惑 示例代码 显示了我的问题 这是不可编译的 image private BufferedImage image private Graphics2D graphic private changeImage thread l
  • 有没有办法调用被重写的对象的基类方法? (C++)

    我知道有些语言允许这样做 在C 中可以吗 Yes include
  • 围绕角色旋转图像(JAVA)

    是的 我确实知道您可以使用 AffineTransformation 但是我希望我的剑图像围绕我制作的角色 图形中绘制的黑色块 明显旋转 360 度 而不是仅旋转一圈 基本上我想要一个像泰拉瑞亚那样的旋转系统 我知道如何获取角色的 x 和
  • 返回类型不同的方法的类型擦除

    我想知道是否存在某种形式的类型擦除来处理具有相同名称和参数但返回不同值的方法 如下面的示例所示 begin and end 我并不打算在任何地方实际使用它 我只是想知道它是否可能 如果可能的话 将如何完成 我所知道的类型擦除的唯一形式是拥有
  • HTML 和字符编码与 HTML 实体

    在编写 HTML 文档时 是否可以使用直接的特殊字符 例如大写字母 C 下面有一个变音符 作为常规文本 或使用HTML 实体名称这个角色的 Ccedil 我已经看到这两种方法都在实践中被使用 但肯定有一些规则来管理它的适当使用 以及一种方法
  • 如何获取 ul 标签中特定 li 的位置?

    我想要获得一号li我悬停在上面jQuery 这是我的代码 ul li li li li li li I want hover on this element li li li li ul 我希望当鼠标悬停在顶部代码中的某些元素上时获取所有元
  • 使用索引列表访问 pandas 数据框中的条目

    我面临的问题是 我只需要分布在不同行和列上的原始数据帧的子集 例如 My Original dataframe import pandas as pd dfTest pd DataFrame 1 2 3 4 5 6 7 8 9 Output
  • WSL - 当 linux 二进制文件在 Bash 中不可用时如何回退到 exe

    我需要做的是编写既可以在常规 Unix 系统上工作 也可以在 WSL 上工作的脚本 并在 linux 系统未安装 未安装在 PATH 中时尝试使用 EXE 版本的命令 这是我正在使用的当前代码 但我想知道是否可以使用更简单 更简洁的方法 i
  • cudaMemcpy 到主机来获取设备分配的内存仍然不可能吗?

    我有一个带有指针的数据结构 想想链表 在启动读取输入数据的内核之前无法确定其大小 因此 我在输入处理期间在设备上分配数据 但是 尝试将该数据复制回主机失败 据我所知 这是因为 CUDA 存在限制 不允许运行时 API 访问设备分配的内存 然
  • 当没有抛出异常时,C++ 异常会以哪些方式减慢代码速度?

    我读到 使用 C 异常进行异常处理 而不是检查返回值 会产生一些开销 我只是谈论没有抛出异常时产生的开销 我还假设您需要实现实际检查返回值并执行适当操作的代码 无论什么都相当于 catch 块将执行的操作 而且 将抛出内部有 45 个状态变
  • LINQ - 嵌套查询

    我有一个 SQL 语句 正在尝试将其转换为 LINQ 查询 我需要这样做 因为我无法编辑我的数据库 无论如何 我有一个如下所示的 SQL 语句 SELECT CustomerID FirstName LastName Gender Birt
  • 将经度和纬度与 Intent 传递给另一个类

    我试图将纬度和经度从 MainActivity 中的 onLocationChanged 传递到另一个包com route provider classDataPrivider但我收到此错误 我该怎么做 我如何在 DataProvider
  • Res.download() 使用 html 表单提交,但不使用 Axios post 调用

    我正在编写一个小型应用程序 它将来自 React 应用程序的信息提交到 Express 服务器的 download API 然后将新文件写入本地文件系统 并使用 Express res download 在客户端下载新创建的文件 在 fs
  • Android 上的 Google 通讯录 api

    我已经这样做好几天了 我很困惑 我在很多地方读到谷歌提供的java客户端 无法在android上工作 但事实并非如此 有人能指出我正确的方向吗 public void onCreate Bundle savedInstanceState s
  • Python 中的单引号与双引号[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 Locked 这个问题及其
  • IExtenderProvider 根据对象类型仅添加一些属性

    我遇到了一个问题 我不知道这是否确实可行 如果有一种 hacky 方式 我全力以赴 但我还没有找到 我有一个IExtenderProvider我用来拥有自己的组件UITypeEditor对于第三方控件的某些属性 由于显而易见的原因 我无法更
  • 我应该如何对多线程代码进行单元测试?

    到目前为止 我已经避免了测试多线程代码的噩梦 因为它看起来像是一个雷区 我想问人们如何测试依赖线程成功执行的代码 或者人们如何测试仅在两个线程以给定方式交互时才出现的此类问题 对于当今的程序员来说 这似乎是一个非常关键的问题 恕我直言 汇集