首页 > 解决方案 > Python3.6 和单例 - 用例和并行执行

问题描述

我有几个单元测试(只有 python3.6 和更高版本),它们正在导入一个帮助类以在开始测试之前在系统上设置一些东西(例如拉一些 Docker 图像)。

该类在实例化时正在做所有事情。它需要保持活力,因为它保存了一些在运行时评估并用于不同测试的信息。

助手类的调用非常昂贵,我只想加速测试助手类一次。我的方法是使用单例,但有人告诉我在大多数情况下不需要单例。我还有其他选择吗,或者这里的单身人士实际上是一个很好的解决方案吗?该选项应该允许自己执行所有测试和每个测试。

我也会有一些理论问题。如果我在这里使用单例,python 是如何并行执行的?python 是在等待第一个实例完成还是存在竞争条件?如果是,我该如何避免它们?

标签: pythonpython-3.xunit-testingsingleton

解决方案


我只能就您问题的“我还有其他选择”部分给出答案...

将如此复杂的设置用于单元测试(拉 docker 图像等)让我怀疑:

这可能意味着您的测试实际上是集成测试而不是单元测试。如果您的目标是在所涉及的组件之间的交互中或在您的代码与其系统环境之间的交互中找到错误,这可能是非常好的。(您的设置涉及 Docker 映像的事实给人的印象是您打算针对系统环境测试被测系统。)如果是这种情况,我希望您能幸运地回答您问题的其他方面(并行化测试、单例和线程安全)。为了吸引合适的专家,将您的问题标记为“集成测试”而不是“单元测试”也许是有意义的。

另一方面,您的复杂设置可能表明您的单元测试尚未正确设计和/或被测系统尚未设计为易于使用单元测试进行测试:单元测试专注于系统下- 隔离测试 - 与依赖的组件隔离,但也与系统环境的细节隔离。对于正确隔离的被测系统的此类测试,不需要使用 Docker 进行复杂的设置。

如果后者是真的,您可以从熟悉“模拟”、“依赖注入”或“控制反转”等主题中受益,这将帮助您设计被测系统和单元测试用例,以便它们独立于系统环境。然后,您的复杂设置将不再是必要的,并且您问题的其他方面(单例、并行化等)可能不再相关。


推荐阅读