【问题标题】:Unit testing with network-reliant code使用依赖网络的代码进行单元测试
【发布时间】:2008-09-04 18:00:02
【问题描述】:

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

【问题讨论】:

    标签: unit-testing testing wmi


    【解决方案1】:

    假设您的意思是“我如何针对难以/不可能模拟的事物进行测试”:

    如果您有一个“出去并为服务器获取 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”返回一个模拟对象。

    【讨论】:

      【解决方案2】:

      测试难以模拟的事物的最简单方法是重构代码,使您的代码(值得测试的逻辑)位于一个位置,而您的代码使用的其他事物位于不同的模块中.该模块易于模拟,这样您就可以专注于您的业务逻辑。

      【讨论】:

        【解决方案3】:

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

        例如,我最近需要开发代码以在第 3 方产品中运行。挑战在于我们的“合作伙伴”将与他们的基本代码进行编译和集成:我不被允许以任何形式查看他们的代码!我的策略是构建一个非常简单的仿真器,根据他们工程师提供的信息,我认为他们的代码可以做到这一点。我们使用的语言可以轻松地在每次构建中切换模拟器的各个部分,因此我可以在让我们的合作伙伴参与构建每个新迭代之前进行大量测试。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多