代码之家  ›  专栏  ›  技术社区  ›  Rickard Lindberg

用python编写单元测试文件

  •  1
  • Rickard Lindberg  · 技术社区  · 15 年前

    我正在为 ConfigParser 在python中为存储和检索应用程序设置提供了一个简单的接口。

    包装器有两种方法, read write 以及一组用于不同应用程序设置的属性。

    这个 方法只是 配置分析器 方法,同时创建 配置分析器 .看起来是这样的:

    def write(self):
        f = open(self.path, "w")
        try:
            self.config_parser.write(f)
        finally:
            f.close()
    

    我想编写一个单元测试,它断言如果文件无法写入,则此方法会引发一个IOERROR,在另一种情况下,会调用配置分析器的WRITE方法。

    第二个测试很容易用模拟对象处理。但是 open 打电话会让事情变得有点棘手。最后,我必须创建一个文件对象来传递给配置分析器。在运行此代码时,实际上会创建一个文件,这并不意味着它对于单元测试非常有用。是否有一些模拟文件创建的策略?这段代码可以用某种方式测试吗?或者只是太简单了,无法测试?

    3 回复  |  直到 15 年前
        1
  •  6
  •   Travis Bradshaw    15 年前

    首先,你实际上不需要单元测试 open() 因为假设标准库是正确的是很合理的。

    接下来,您不希望执行文件系统操作来获取 打开() 为了生成您想要的错误,因为您不是单元测试,所以您要通过包含文件系统来进行功能/集成测试。

    所以你可以换一个 打开() 在带有代理项的全局命名空间中, IOError . 但是,如果继续执行,可能需要确保将事情放回原处。

    但最终,测试有什么价值呢?代码片段中的代码太少了,这是您自己的系统。甚至替换 打开() 最后的结果就是测试说 try finally 在python工作中的声明?”

    我的建议?只需向记录您期望的docstring添加一个语句。”如果无法写入文件,则引发IOERROR。”然后继续。如果这个方法获得了一些复杂性(以及测试的优点),您可以稍后添加单元测试。

        2
  •  4
  •   Tor Valamo    15 年前

    实际上,只有open才能在代码中引发异常。write()的文档没有提到任何异常。可能只有一个值错误或文件指针错误(由于打开失败,这里不可能是这种情况)。

    为open生成ioerror很容易。只需在别处创建文件并打开它进行写入。或者您可以更改它的权限,使您没有访问权限。

    你可能想用 with 但在这里声明,它将处理结束本身。

    在python 2.5中,您需要第一行。在以后的版本中,您不需要它。

    from __future__ import with_statement # python 2.5 only
    
    def write(self):
        with open(self.path, 'w') as f:
            self.config_parser.write(f)
    

    如果 open 成功,如果 打开 提出一个 IOError . 我不知道为什么你需要一个测试来看看是否调用了write。代码上说是的。不要过度测试。;)

        3
  •  2
  •   Roger Pate    15 年前

    记住,您不必测试open()或configparser的工作,它们不是代码的一部分,您只需测试是否正确使用它们。您可以使用自己的open()对模块进行monkeyPatch,就像对instance属性一样,还可以从中返回一个模拟来帮助您进行测试。

    然而,单元测试并不是我唯一的工具,这是一个简单到可以分析和“证明”的功能。 这是有效的。

    γ 我敢肯定,没有数学家想的那么严格,但对我来说已经足够好了。