使用网络依赖代码进行单元测试

时间:2008-09-04 18:00:02

标签: unit-testing testing wmi

我正在尝试更好地对我的代码进行单元测试,但是现在我正在编写大量处理远程系统的代码。 SNMP,WMI,那种事情。对于大多数类,我可以模拟对象来测试它们,但是如何处理单元测试真实系统?例如,如果我的类出去并获取服务器的Win32_LogicalDisk对象,我怎么可能对它进行单元测试?

3 个答案:

答案 0 :(得分:5)

假设你的意思是“我如何测试那些很难/不可能模仿的东西”:

如果你有一个“出去并获取服务器的Win32_LogicalDisk对象”的类并执行其他操作(以某种方式使用'Win32_LogicalDisk'对象),假设您要测试使用此对象的类的片段对象,您可以使用Dependency Injection来模拟“Win32_LogicalDisk”对象。例如:

class LogicalDiskConsumer(object):

    def __init__(self, arg1, arg2, LogicalDiskFactory)
        self.arg1=arg1
        self.arg2=arg2
        self.LogicalDisk=LogicalDiskFactory()

    def consumedisk(self):
        self.LogicalDisk.someaction()

然后在你的单元测试代码中,传入一个'LogicalDiskFactory',它返回'Win32_LogicalDisk'的模拟对象。

答案 1 :(得分:2)

测试难以模拟的东西的最简单方法是以代码(值得测试的逻辑)在一个地方的方式重构代码,并且代码使用的其他东西在单独的模块中。该模块易于模拟,这样您就可以专注于业务逻辑。

答案 2 :(得分:1)

您可以创建一组“测试存根”来替换核心库例程并返回已知值,可能是在适当的延迟之后。

作为一个例子,我最近需要开发代码以在第三方产品中运行。挑战在于我们的“合作伙伴”将进行编译并与基本代码集成:我不允许以任何形式查看他们的代码!我的策略是构建一个非常简单的模拟器,根据他们工程师的信息,完成我思考他们的代码所做的事情。我们使用了一种语言,可以很容易地在每个构建中切换模拟器的各个部分,因此我可以在让我们的合作伙伴参与构建每个新的迭代之前进行大量的测试。

我再次使用相同的方法,因为该特定产品中的软件问题比我们下一个最可靠的产品少一个数量级!