使用两个模拟对象的Python单元测试,如何验证调用顺序?

2024-02-02

我正在编写一个类,它协调两个仪器(一个远程可控电源单元和一个用于控制被测设备的总线控制器),以便在被测设备 (DUT) 上执行各种测量。

对这两种工具的访问均以 Python 类的形式实现,并且新类可以使用对每种工具的引用。 DUT 比较脆弱,具有非常特定的加电顺序,涉及对电源和总线控制器的调用,并且必须按照该特定顺序进行以避免损坏 DUT。

现在我想为这个类编写一个单元测试。我目前正在使用鼻子测试和模拟包。所以我的想法是模拟这两个仪器类并验证它们的正确调用顺序。

验证每个模拟类本身的调用顺序似乎很容易。因此,我能够查明电源是否被命令首先正确施加电池电压,然后是数字域电压,然后是模拟域电压。我还可以发现数字寄存器已被编程为正确的值。但是,我无法确定写入数字寄存器的调用是否发生在施加数字域电压和模拟域电压之间。

所以我的问题是:如果我有两个模拟对象,如何验证这些对象之间的特定调用顺序?我的第一个任务是检查呼叫的时间戳,但这些时间戳似乎不存在。


你能做的就是把你的模拟放在一个新的Mock()对象并检查新模拟的模拟调用。也许举个例子更容易理解:

>>> from unittest.mock import *
>>> m0, m1 = Mock(), Mock()
>>> m = Mock()
>>> m.m0, m.m1 = m0, m1
>>> m0()
<Mock name='mock.m0()' id='140660445334224'>
>>> m1()
<Mock name='mock.m1()' id='140660445334608'>
>>> m.mock_calls
[call.m0(), call.m1()]

好的,现在我们处于有利位置:我们可以检查以下呼叫m验证顺序是否正确:

>>> m.assert_has_calls([call.m0(), call.m1()])
>>> m.assert_has_calls([call.m1(), call.m0()])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/mock.py", line 863, in assert_has_calls
    'Actual: %r' % (calls, self.mock_calls)
AssertionError: Calls not found.
Expected: [call.m1(), call.m0()]
Actual: [call.m0(), call.m1()]

正如我们想要的,第一遍和逆序失败。

当你使用patch只需获取补丁返回的模拟并将它们放入新的Mock()作为容器。检查记录子呼叫顺序的容器。

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

使用两个模拟对象的Python单元测试,如何验证调用顺序? 的相关文章

随机推荐

  • 在包安装期间执行 R 脚本

    希望这有一个简单的答案 但我还没有找到它 我正在编写一个 R 包 当安装在 Windows 上时 我希望它执行一个搜索系统文件的脚本 即list files path C Program Files 然后将该路径保存到包目录作为文本文件以供
  • 使用 jquery 将 html 表格转为 excel

    我有这个有效的 jquery 函数 但我需要添加一些东西 我在桌子上设置了一个过滤器来隐藏列 当我隐藏列并单击导出时 它无论如何都会使用所有字段 如何只导出未隐藏的表列 var write to excel function var uri
  • 使用 ggplot 在 R 中创建堆积百分比条形图

    我一直在寻找一种方法 能够根据受访者的性别分类 将堆积条形图响应显示为百分比值 我成功地使用变量 性别 进行填充创建了堆积条形图 但我希望该图显示该变量之间的比例 我知道使用 count sum count 和 scale y 可以更改 y
  • 使用WCF上传文件

    我需要一个 WCF 服务来由用户上传大文件 以下哪一项提供了更优化的性能 OperationContract public void UploadFile Stream inputsreaam or OperationContract pu
  • 在 EF6 中将匿名类型转换为 IEnumerable<>

    我正在使用实体框架开发 MVC 应用程序 我想从表中获取 5 列并将它们返回到一个IE可枚举类型 我的代码是 IEnumerable
  • T-SQL 将日期时间修剪为最近的日期?

    重复的 删除日期时间值 SQL Server 的时间部分的最佳方法是什么 https stackoverflow com questions 2775 我有一个列 用于跟踪使用日期时间创建事物的时间 但我想生成一个按天分组的报告 因此我需要
  • R 中具有两个单独值的词云

    作为 R 新手 我正在制作一个显示两个变量的词云 frequency and rating 使用通用表格 我希望按州显示假设的大学数量 字体 数字从大到小 以及假设的平均大学评级 1 绿色 良好 3 黄色 平均 5 红色 坏 我能够创建这个
  • 当 CreatePackageOnPublish 设置为 true 时,TFS Team Build 中的长路径出现问题。

    由于 TFS Team Build 在参数设置时创建的长路径 我们在构建时遇到了问题发布时创建包被设定为true 在目录中软件包临时表 见后图 包被存储 但我不明白为什么这个目录结构是必要的以及如何定制它 问题是部署或新的 TFS 构建会因
  • 如何在 JNI 中从 C++ 调用 Java 方法

    所以我正在编写一个使用大型 C 库的 Android 应用程序 我已经一切正常 以便 java 应用程序可以调用 c 委托方法 但我发现自己希望可以将消息从 c 记录到 Android 日志中 这对于java来说很容易 但是我不知道如何从c
  • CSS 计算不适用于 宽度

    我想要Cell A为剩下的两个单元格留出 100px 的空间 我会想calc 100 100px 就足够了 因为这在许多其他情况下都可以正常工作 为什么这里不起作用 table width 100 border collapse colla
  • 我可以使用 Deref 从 Other 继承特征实现吗?

    我有一个String newtype https doc rust lang org rust by example generics new types html ErrorMessage我用它来解决原型箱中的错误 我知道这是一个不好的做
  • PyCharm:如何推断运行时创建的对象的类型

    我正在尝试使用一个创建对象的库 并在运行时将它们添加到全局命名空间 PyCharm 无法找到对对象的引用 因为它们最初不在命名空间中 如何让 PyC harm 内省不抱怨 找不到参考 我不想用noinspection tags 示例代码 为
  • JTextArea 中的文本更改事件?如何?

    我一直在尝试为我的文本更改事件处理机制JTextArea 出于我的目的 每当文本的文本发生变化时就必须触发一个事件JTextArea 我尝试使用KeyListener接口 这是我的代码 txtArea addKeyListener new
  • 通过 Win 10 Oct 2018 更新,Windows 可以感知闰秒。现在.NET 的DateTime 也是如此吗?

    2012年 这里有一个关于SO的问题 NET的DateTime是否能够识别闰秒 1 答案是否定的 文档仍然明确指出事实并非如此 2 但是 Windows Server 2019 和 Windows 10 October 2018 更新Win
  • 并发 JUnit 测试

    我有一个大型 JUnit 测试套件 我很想同时运行所有测试 原因有两个 利用多个核心更快地运行整个测试套件 希望能够检测到由于非线程安全全局对象而导致的一些错误 我认识到这将迫使我重构一些代码以使其线程安全 但我认为这是一件好事 让 JUn
  • 如何为 CORS 配置 Azure API 管理

    我已经创建了 Azure API 管理服务并连接了我的 API 我添加了CORS对他们的政策 我检查了计算有效政策结果就是这个政策
  • 我是否需要 DispatchQueue.main 在 Alamofire 请求后更新 UI?

    我正在学习有关使用的教程REST web requests 在本教程中 我们正在开发一个 Pokedex 应用程序 我们使用 API 从 API 获取 Pokemon 详细信息Alamofire 然后在我们的 UI 中显示该数据 这是相关代
  • 如何像 Whatsapp 和 Viber 一样在电话簿/联系人中添加我的应用程序连接?

    我想要我的 Android 应用程序联系要添加到contact 我将根据结果检查用户是否正在使用我的应用程序 我需要在existing联系人 我已经参考了很多 但它通过添加连接添加了新的联系人 我使用过的示例之一是here https gi
  • 在 React JSX 中循环内循环

    我正在尝试在react jsx 循环内的循环中渲染 就像下面这样 this state ans map function item return this state quest map function item1 return item
  • 使用两个模拟对象的Python单元测试,如何验证调用顺序?

    我正在编写一个类 它协调两个仪器 一个远程可控电源单元和一个用于控制被测设备的总线控制器 以便在被测设备 DUT 上执行各种测量 对这两种工具的访问均以 Python 类的形式实现 并且新类可以使用对每种工具的引用 DUT 比较脆弱 具有非