带有网络相关代码的单元测试
时间:2020-03-05 18:47:47 来源:igfitidea点击:
我想在单元测试代码方面做得更好,但是现在我正在写很多处理远程系统的代码。 SNMP,WMI之类的东西。对于大多数类,我可以模拟对象以对其进行测试,但是如何处理真实系统的单元测试呢?例如,如果我的课程结束并获取服务器的Win32_LogicalDisk对象,那么如何对它进行单元测试?
解决方案
回答
假设意思是"我该如何针对难以/不可能嘲笑的事物进行测试":
如果我们有一个类"出去为服务器获取Win32_LogicalDisk对象"并执行其他操作(以某种方式使用" Win32_LogicalDisk"对象),并假设我们要测试消耗该对象的类的各个部分,可以使用依赖注入来模拟" 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"的模拟对象。
回答
我们可能会创建一组"测试存根",以替换核心库例程并返回已知值(可能在适当的延迟之后)。
举例来说,我最近需要开发在第三方产品中运行的代码。挑战在于我们的"合作伙伴"将与他们的基本代码进行编译和集成:不允许我以任何形式查看他们的代码!我的策略是基于工程师的信息,构建一个非常简单的仿真器,以实现我认为的代码效果。我们使用了一种语言,可以轻松地将仿真器的各个部分切换到每个版本中,以及从每个版本中切换出来,因此在让我们的合作伙伴参与构建每个新迭代之前,我可以进行大量测试。
我会再次使用相同的方法,因为该特定产品中的软件问题比我们下一个最可靠的产品要少一个数量级!
回答
测试难以模拟的事物的最简单方法是,以代码(值得测试的逻辑)放在一个地方,而代码使用的其他事物在单独的模块中的方式重构代码。该模块易于模拟,因此我们可以专注于业务逻辑。