使用Python进行依赖测试
我想写单元测试来检查两个Python包之间是否存在依赖关系。比如说:
a/
__init__.py
models.py
views.py
...
b/
__init__.py
models.py
views.py
...
我想写一个单元测试,检查包b
中的模块是否没有从包a
中的模块导入任何东西。我目前唯一想到的办法是扫描文件,看看源代码中是否有“from a”或者“import a”。还有其他方法吗?一个要求是a/
和b/
必须在同一个目录层级。
我想要这个单元测试,因为我想确保在其他项目中使用包b
时,不需要包a
,而且也不希望其他开发者写的代码会让b
依赖于a
。
3 个回答
有一些模块,比如 coverage.py,可以检查在测试过程中哪些代码被执行了。因此,应该有办法检查在测试中执行的代码属于哪个模块。这个方法应该是可行的,不管Python的动态特性如何,这和@Ben在他回答中说的正好相反。
不过,我不知道有没有现成的模块可以直接做到这一点。所以这听起来需要很多手动操作,但同时也为开发一个新的测试工具提供了很好的机会。
当然可以!请看下面的内容:
在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常需要将它们转换成程序能够处理的格式。
比如说,如果你从一个网页上获取了一些信息,这些信息可能是以文本的形式存在的。为了让程序能够使用这些信息,我们需要把它们转化成程序可以理解的结构,比如列表或者字典。
这个过程就叫做“解析”。解析的意思就是把复杂的东西拆解成简单的部分,方便我们使用。就像把一个大蛋糕切成小块,方便大家吃。
在编程中,解析通常涉及到一些特定的规则和方法。比如,JSON(JavaScript对象表示法)是一种常见的数据格式,它的结构就像一个字典,里面有键值对。我们可以使用编程语言提供的工具来解析这些数据,把它们变成我们可以直接使用的对象。
总之,解析就是把复杂的数据变得简单易懂,让程序能够轻松处理。希望这个解释能帮助你理解这个概念!
import sys
sys.modules['a'] = None
import b
# run unit tests for b to try and catch local import statements in b's functions
Python 语言太灵活了,没法做到 100% 正确。想想看,你可以通过调用 __import__
来导入模块,这个函数需要一个字符串作为参数,所以你可以在运行时动态构造要导入的模块名。而且,__import__
是个函数,它可以绑定到其他名字上,所以你根本无法确保能检测到所有导入的情况。
而且,从一个模块调用另一个模块的函数也是有可能的,这个函数会导入一个模块并返回它。所以,你绝对不能仅仅通过分析包 b
来搞定这个问题。
还有一个 exec
函数,可以执行在运行时构造的任意 Python 代码……
你能做到的最接近的办法,可能就是尝试让你的单元测试在 PYTHONPATH
中有 a
的时候去测试 b
,以及在没有 a
的时候去测试 b
。但这也不完全可靠,因为这只能告诉你在没有 a
的情况下,b
的所有测试都通过了,并不能保证它永远不需要 a
。而且如果你运气不好,b
可能会做一些很糟糕的事情,随便改动 sys.path
,然后还是能导入 a
。
不过,如果这些代码都是你自己写的,并且你知道自己没有做过这种奇怪的事情,那么一个简单的脚本扫描文件中的 import
语句可能是你最好的选择。这种方法在其他人的随机代码上也可能会很有效。总之,想要做到完美且通用是很难的。