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

2023-12-14

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

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


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

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

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

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

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

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

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

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

  • Java 使用 Mockito 验证 void 方法调用 n 次

    我正在尝试验证是否在 DAO 内部调用了 void 方法 我正在使用一个提交点 该提交点发送截至该点的结果列表 重置列表并继续 假设我的列表中有 4 件事 并且提交点为 1 我希望 发送 方法被调用 4 次 我可以通过编写来验证该方法是否被
  • 多线程——更快的方法?

    我有一堂有吸气剂的课程getInt 和一个二传手setInt 在某个领域 比如说领域 Integer Int 一个类的一个对象 比如说SomeClass The setInt 这里是同步的 getInt isn t 我正在更新的值Int来自
  • UI 函数在快速事件完成之前触发

    我有一个停靠在 Silverlight 应用程序中的 Web 浏览器框架 有时会在其上弹出全窗口 XAML Silverlight UI 元素 我已经或多或少修复了一个老问题 即 Web 框架的内容似乎与 Silverlight 内容不能很
  • 标准 C++ 中的共享递归互斥体

    有一个shared mutex http en cppreference com w cpp thread shared mutex计划用于 C 17 的课程 和shared timed mutex http en cppreference
  • 带完整堆栈跟踪的单元测试

    这似乎是一个愚蠢的问题 但我无法在任何地方找到答案 我正在使用 Rails 3 1 和 Test Unit 当测试失败时 我只能看到堆栈的顶部 例如 ERROR creating a message sends emails 1 35s N
  • 堆栈本地对象的使用和对象的销毁之间是否存在“先发生”的关系?

    我看了赫伯 萨特的演讲 https channel9 msdn com Shows Going Deep Cpp and Beyond 2012 Herb Sutter atomic Weapons 2 of 2 https channel
  • Spring Batch 多线程

    我正在编写一个 Spring Batch 并希望在需要时对其进行扩展 我的 ApplicationContext 看起来像这样 Configuration EnableBatchProcessing EnableTransactionMan
  • Python unittest - 与assertRaises相反?

    我想编写一个测试来确定在给定情况下不会引发异常 测试是否有异常很简单is上调 sInvalidPath AlwaysSuppliesAnInvalidPath self assertRaises PathIsNotAValidOne MyO
  • 从不同的线程关闭启动屏幕?

    我在用着WindowsForms应用程序库 http msdn microsoft com en us library microsoft visualbasic applicationservices windowsformsapplic
  • 从单元测试调用时,Application.Current 为 null

    我有一个尝试从单元测试中调用的方法 该方法在现实生活中将从后台线程运行 它使用一些代码来启动 UI 线程的调用更新 使用Application Current Dispatcher BeginInvoke However Applicati
  • 如何使用 NUnit(或者可能使用其他框架)测试异步方法?

    我有一个 ASP NET Web API 应用程序 带有一个具有异步方法的 ApiController 返回Task lt gt 对象并标有async关键词 public class MyApiController ApiControlle
  • 如何在Python模拟中调用模拟方法

    我想创建一个模拟方法来调用被模拟的底层方法 我正在想象类似以下的内容 但我找不到任何有关模拟对象的文档 该对象包含对被模拟对象的引用 我将其表示为 wrapped method foo below from mock import patc
  • dotNet:有没有办法在 UI 线程上执行 Join 语句?

    我正在编写一个简单的线程应用程序 当单击开始按钮时 应用程序禁用此按钮 运行 5 个线程 只需进行 For 迭代并更新 5 个进度条 最后一个线程正在等待线程结束 以重新启用我的开始按钮 问题 用户看到按钮在进度条达到 100 之前已启用
  • 在角度项目中使用茉莉花进行单元测试订阅方法

    我正在尝试测试ngOnInit 具有的组件的方法subscribe method 成分 import Component OnInit from angular core import SharedDataService from serv
  • Python 线程与 Linux 中的多处理

    基于此question https stackoverflow com questions 807506 threads vs processes in linux我假设创建新流程应该几乎和创造新线程在Linux中 然而 很少的测试显示出截
  • 使用mockito对DAO层进行单元测试

    我正在尝试使用 Mockito 对我的 Spring Hibernate 项目进行单元测试 以下是我的 DAO 类的实现 Repository public class EmployeeDAOImpl implements Employee
  • 如何捕获 Runnable 中的封闭范围

    我正在尝试对 a 进行一系列更新HandlerThread使用下面的类 但我有几个关于变量捕获在 Java 中如何工作的问题 1 Is ret通过引用从封闭范围捕获 2 Does this参考Runnable 或者是从封闭范围捕获的 bon
  • 如何对转换库进行单元测试?

    我刚刚开始使用 C 进行单元测试 我已经阅读有关单元测试的内容很长时间了 并且已经开始使用 NUnit 但这是我第一次真正尝试为真实代码编写真正的测试 但我的问题是 我很难想出可以实际测试的东西 我要测试的项目是一个转换库 将 POCO 列
  • 分配内存时线程争用

    在 C 中 我运行了一个创建许多小对象的玩具代码 我知道最好应该避免这种情况 我只是想研究这个问题 对于创建的对象总量相同 一个线程的运行速度比每个处理器一个线程 Parallel For 的运行速度快 原子操作包括创建一个包含 20k 个
  • Thread.interrupt() 和 Thread.interrupted() 到底是如何工作的? [复制]

    这个问题在这里已经有答案了 从设置线程状态的角度来看 我不清楚这两种方法 Java 文档说 Thread interrupt 设置线程中断状态标志 调用 Thread interrupted 方法给出线程的状态并清除该标志 当这在实际场景中

随机推荐

  • 如何使用 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对于第三方控件的某些属性 由于显而易见的原因 我无法更
  • 我应该如何对多线程代码进行单元测试?

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