首页 > 解决方案 > 使 python COM 客户端可测试

问题描述

我已经阅读了有关 python 中的单元测试的信息,但是我发现的所有示例都是基于模拟对象的简单示例。我不知道如何以一种无需访问 COM 端口即可对其进行测试的方式真正实现项目测试。该项目主要用于通过COM API控制另一个应用程序以及评估应用程序产生的数据并制作报告,因此可以说它是作为python库制作的更高抽象级别的api。COM 接口是非平凡的,主要对象暴露了一些管理器,管理器暴露了对象的容器,这些容器具有对另一个对象的引用,因此一个连接对象的网络负责不同的事物控制应用程序。python 库的架构以某种方式遵循 COM 结构。在库导入期间,主 COM 对象被调度并存储在中心模块中,导入时的管理器级模块从中央模块获取对 COM 管理器对象的引用,然后管理器级方法在其方法中使用此 COM 管理器对象。更好理解的例子

#__init__
from managera import ManagerA
from centralobject import CentralObject
central_object = CentralObject()
manager_a = ManagerA()  #here all initialisation to make everything work,
manager_b = ManagerB()  #so full com object needed to import the package
...

#centalobject
class CentalObject():
    def __init__():
        self.com = Dispatch("application")
...

#managera
from project import central_object
class ManagerA():
    def __init__():
        self.com = central_object.com.manager_a
def manager_a_method1(x):
    foo = self.com.somecontainer[x].somemethod()
    foo.configure(3)
    return foo
...

在当前状态下,很难测试。如果没有连接到 COM 应用程序,甚至无法导入。Dispatch 可以移动到导入后执行的某个 init 函数中,但我看不出它如何使测试成为可能。一种解决方案是制作与原始应用程序结构相似的测试替身,但对于我没有经验的测试头脑来说,在每个方法测试中这样做似乎有点矫枉过正。也许不是,应该这样做,我在问别人更多的经验建议。我想到的第二个解决方案是每次进行任何 COM 调用时分派 COM 对象,然后对其进行模拟,但似乎有很多分派,我看不出它如何使代码更好。也尝试过不将管理器定义为类,而是模块,

应该怎么做才能在不访问 COM 的情况下使测试变得可行和良好?对一切都感兴趣:解决方案、建议或只是我应该阅读更多的主题。

标签: pythonunit-testingmocking

解决方案


推荐阅读