我正在尝试更好地对我的代码进行单元测试,但现在我正在编写大量处理远程系统的代码。SNMP、WMI 之类的。对于大多数类,我可以模拟对象来测试它们,但是你如何处理对真实系统的单元测试呢?例如,如果我的班级出去并获得了服务器的 Win32_LogicalDisk 对象,我怎么可能对它进行单元测试?
3 回答
假设您的意思是“我如何针对难以/不可能模拟的事物进行测试”:
如果您有一个“出去并为服务器获取 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”返回一个模拟对象。
测试难以模拟的东西的最简单方法是重构代码,使您的代码(值得测试的逻辑)在一个地方,而您的代码使用的其他东西在单独的模块中。该模块很容易模拟,这样您就可以专注于您的业务逻辑。
您可能会创建一组“测试存根”来替换核心库例程并返回已知值,也许在适当的延迟之后。
例如,我最近需要开发代码以在第 3 方产品中运行。挑战在于我们的“合作伙伴”将与他们的基本代码进行编译和集成:我不允许以任何形式查看他们的代码!我的策略是根据工程师提供的信息构建一个非常简单的模拟器,它可以按照我认为他们的代码所做的那样工作。我们使用的语言可以轻松地在每次构建中切换模拟器的各个部分,因此在让我们的合作伙伴构建每个新迭代之前,我可以进行大量测试。
我会再次使用相同的方法,因为该特定产品中的软件问题比我们下一个最可靠的产品中的软件问题要少一个数量级!