使用Python进行依赖测试

7 投票
3 回答
1151 浏览
提问于 2025-04-16 19:52

我想写单元测试来检查两个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 个回答

0

有一些模块,比如 coverage.py,可以检查在测试过程中哪些代码被执行了。因此,应该有办法检查在测试中执行的代码属于哪个模块。这个方法应该是可行的,不管Python的动态特性如何,这和@Ben在他回答中说的正好相反。

不过,我不知道有没有现成的模块可以直接做到这一点。所以这听起来需要很多手动操作,但同时也为开发一个新的测试工具提供了很好的机会。

1

当然可以!请看下面的内容:

在编程中,有时候我们需要处理一些数据,这些数据可能来自不同的地方,比如用户输入、文件或者网络请求。为了让程序能够理解这些数据,我们通常需要将它们转换成程序能够处理的格式。

比如说,如果你从一个网页上获取了一些信息,这些信息可能是以文本的形式存在的。为了让程序能够使用这些信息,我们需要把它们转化成程序可以理解的结构,比如列表或者字典。

这个过程就叫做“解析”。解析的意思就是把复杂的东西拆解成简单的部分,方便我们使用。就像把一个大蛋糕切成小块,方便大家吃。

在编程中,解析通常涉及到一些特定的规则和方法。比如,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
5

Python 语言太灵活了,没法做到 100% 正确。想想看,你可以通过调用 __import__ 来导入模块,这个函数需要一个字符串作为参数,所以你可以在运行时动态构造要导入的模块名。而且,__import__ 是个函数,它可以绑定到其他名字上,所以你根本无法确保能检测到所有导入的情况。

而且,从一个模块调用另一个模块的函数也是有可能的,这个函数会导入一个模块并返回它。所以,你绝对不能仅仅通过分析包 b 来搞定这个问题。

还有一个 exec 函数,可以执行在运行时构造的任意 Python 代码……

你能做到的最接近的办法,可能就是尝试让你的单元测试在 PYTHONPATH 中有 a 的时候去测试 b,以及在没有 a 的时候去测试 b。但这也不完全可靠,因为这只能告诉你在没有 a 的情况下,b 的所有测试都通过了,并不能保证它永远不需要 a。而且如果你运气不好,b 可能会做一些很糟糕的事情,随便改动 sys.path,然后还是能导入 a

不过,如果这些代码都是你自己写的,并且你知道自己没有做过这种奇怪的事情,那么一个简单的脚本扫描文件中的 import 语句可能是你最好的选择。这种方法在其他人的随机代码上也可能会很有效。总之,想要做到完美且通用是很难的。

撰写回答