Python3.6和单例-用例和并行执行

时间:2018-09-23 16:36:13

标签: python python-3.x unit-testing singleton

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

对单元测试使用如此复杂的设置(拉动docker映像等)使我感到怀疑:

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

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

如果后者是正确的,那么您可以通过熟悉“模拟”,“依赖注入”或“控制反转”等主题而受益,这将有助于您设计被测系统和单元测试用例这样它们就独立于系统环境。然后,您将不再需要进行复杂的设置,并且问题的其他方面(单例,并行化等)可能不再适用。