有没有一种方法可以对使用的导入进行单元测试?

发布于 2025-01-12 01:57:41 字数 310 浏览 1 评论 0原文

有没有一种方法可以对 Python 文件中导入的模块进行单元测试(有点像 Java 中的 ArchUnit)?背景是实现六边形架构并希望确保域模型不会导入驻留在适配器中的任何代码。如果存在禁止的导入,我希望单元测试失败。

例如,我可能想测试 foo.bar.domain 中没有模块从 foo.bar.adapter 导入任何内容。应允许从 foo.bar.adapter 内导入 foo.bar.domain

这在 Python 中可行吗?实现这一目标的最佳方法是什么?

Is there a way of unit testing what modules are imported in a Python file (a bit like ArchUnit in Java)? The context is in implementing a hexagonal architecture and wanting to ensure that the domain model does not import any code that resides in an adapter. I'd like unit tests to fail if there are forbidden imports.

For example, I might like to test that no modules within foo.bar.domain import anything from foo.bar.adapter. Imports of foo.bar.domain should be allowed from within foo.bar.adapter.

Is this possible in Python and what's the best way of achieving this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

自我难过 2025-01-19 01:57:41

您可以使用 -Ximporttime Python 标志来跟踪导入。我不完全确定在您的情况下查找禁止导入的逻辑是什么,但这里有一个可能有帮助的愚蠢示例脚本:

import subprocess
import sys

process = subprocess.run(
    ('python3', '-Ximporttime', '-c', 'import ' + 'shlex'),
        stdout=subprocess.DEVNULL,
        stderr=subprocess.PIPE,
        encoding='utf-8',
    )

blacklisted_imports = {'enum', 're', 'zipfile'}

data = [
    x.rpartition('|')[2].strip() for x in process.stderr.split('\n')
]
for import_ in data:
    if import_ in blacklisted_imports:
        print('found bad import:', import_)

输出:

found bad import: enum
found bad import: re

You can use the -Ximporttime Python flag to trace imports. I'm not entirely sure what would be the logic for finding forbidden imports in your case, but here's a silly example script that might help:

import subprocess
import sys

process = subprocess.run(
    ('python3', '-Ximporttime', '-c', 'import ' + 'shlex'),
        stdout=subprocess.DEVNULL,
        stderr=subprocess.PIPE,
        encoding='utf-8',
    )

blacklisted_imports = {'enum', 're', 'zipfile'}

data = [
    x.rpartition('|')[2].strip() for x in process.stderr.split('\n')
]
for import_ in data:
    if import_ in blacklisted_imports:
        print('found bad import:', import_)

Output:

found bad import: enum
found bad import: re
无语# 2025-01-19 01:57:41

我不知道针对这种特定情况是否存在测试方法,但有人可能知道更多。我想到的一件事是 try-catch ,检查其他模块中的方法是否可以调用方法。另一种黑客方法是在每个模块的全局上下文中添加自定义字符串常量,如果它们存在,您就知道子模块导入/使用了其他模块。

详细了解堆栈溢出帖子

I am not aware that testing methods exist for this specific case, but someone might know more about it. One thing that comes to mind are try-catch with the methods from the other module being checked if you can call a method. Another hacky way, would be to add custom string constants in global context of the each module, and if they are exist you know that the submodule imported/used the other module.

Check more on this stack overflow post.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文