【问题标题】:Dependency Testing with Python使用 Python 进行依赖测试
【发布时间】:2011-09-18 09:36:54
【问题描述】:

我想编写单元测试来测试两个 python 包之间是否存在依赖关系。例如:

a/
    __init__.py
    models.py
    views.py
    ...
b/
    __init__.py
    models.py
    views.py
    ...

检查包b 中的模块不会从包a 中的模块导入任何内容的单元测试。到目前为止,我唯一的解决方案是扫描文件并检查源代码中是否没有“from a”或“import a”。还有其他方法吗?其中一项要求是a/b/ 必须位于同一目录级别。

我想进行这个单元测试,因为我想确保我可以在没有包a 的其他项目中使用包b,并且也没有其他开发人员编写会使b 依赖的代码a.

【问题讨论】:

    标签: python django unit-testing dependencies


    【解决方案1】:

    有像coverage.py 这样的模块能够检查在测试期间执行了哪些代码。因此,必须有一种方法来检查在测试期间执行的代码属于哪个模块。无论 Python 的动态特性如何,这种方法都应该有效,这与 @Ben 在他的回答中所说的相反。

    但是我不知道有一个模块可以为您开箱即用。所以这听起来像是很多手工工作,但也很有可能为此发布一个新的测试实用程序。

    【讨论】:

      【解决方案2】:
      import sys
      sys.modules['a'] = None
      
      import b
      # run unit tests for b to try and catch local import statements in b's functions
      

      【讨论】:

        【解决方案3】:

        Python 过于动态,无法 100% 正确执行此操作。考虑您可以通过调用__import__ 来导入模块,它接受一个字符串参数,因此可以在运行时构造要导入的模块的名称。另外,__import__ 是一个函数,所以它可以绑定到其他名称,所以当 something 被导入时,你甚至无法确定检测到所有情况。

        从技术上讲,一个模块可以从另一个模块调用一个函数,该函数导入一个模块并返回它。所以你绝对不能仅仅通过分析包b来做到这一点。

        然后还有exec来执行运行时构造的任意python代码……

        aPYTHONPATH 上,以及a 不在PYTHONPATH 上时,你能得到的最接近的可能是尝试进行单元测试练习b。仍然不是万无一失的,因为这只会告诉您bPYTHONPATH 上完成了所有没有a 的测试,并不是说它不需要a 做任何事情。如果你真的不走运,b 会做一些非常愚蠢的事情并在飞行中摆弄sys.path 并设法以某种方式导入a

        但是,如果这都是您自己的代码,并且您知道自己不会做这种古怪的废话,那么扫描文件以查找 import 语句的简单脚本可能是您最好的选择。它也可能经常在随机其他人的代码上工作。完全笼统地完成这项工作是不可能的。

        【讨论】:

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