我想编写单元测试来测试两个 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 过于动态,无法 100% 正确地执行此操作。考虑到您可以通过调用 __import__
来导入模块,它采用字符串参数,因此可以在运行时构造要导入的模块的名称。此外,__import__
是一个函数,因此它可以绑定(bind)到其他名称,因此您甚至无法确定是否检测到正在导入某物 的所有情况。
从技术上讲,一个模块可以从另一个模块调用一个函数,该模块导入一个模块并返回它。所以你绝对不能通过只分析包b
来做到这一点。
然后是 exec
来执行在运行时构造的任意 python 代码...
当 a
位于 PYTHONPATH
上时,您最接近的可能是尝试进行单元测试练习 b
,并且当a
不在 PYTHONPATH
上。仍然不是万无一失的,因为它只告诉你 b
在 PYTHONPATH
上没有 a
的情况下完成了所有测试,而不是它永远不需要a
代表任何东西。如果你真的不走运,b
会做一些非常愚蠢的事情,并在飞行中摆弄 sys.path
并设法以某种方式导入 a
。
但是,如果这都是您自己的代码,并且您知道自己不会做这种古怪的废话,那么扫描文件以查找 import
语句的简单脚本可能是您最好的选择赌注。它也可能经常在其他人的随机代码上工作。完全通用地完美地完成工作是不可能的。
关于python - 使用 Python 进行依赖测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406707/