使测试中的库导入与包含该库的两个不同程序包兼容

问题描述 投票:0回答:1

我有一个很奇怪的场景和目标。我需要进行完全相同的测试,而无需对可能从两个不同程序包导入的库进行任何更改。

[有一个带有大型python程序包big_sdk的GIT存储库,里面有一个小的库big_sdk.small_lib

我将small_lib库提取到单独的GIT存储库和单独的包small_package.small_lib中。

该代码将在两个地方都存在一段时间,所以我希望代码在两个地方都完全相同。 (这样可以大大简化GIT工作流程,而不会合并任何历史记录。)

small_lib库本身没有问题-它仅在内部使用相对导入,因此完全相同的代码可以在不同的程序包和存储库中运行和工作。

问题出在测试上。测试位于big_sdk/tests/small_lib_tests中,并使用绝对导入:

from big_sdk import small_lib
from big_sdk.small_lib import some_module
from big_sdk.small_lib import some_func

将测试代码提取到小型仓库中时,必须将其更改为

from small_package import small_lib
from small_package.small_lib import some_module
from small_package.small_lib import some_func

由于中断了GIT历史,因此出现问题。

我想找到其他方法。

要求:

  • 目标是使big_sdk/tests/small_lib_tests/small_package/tests/目录中的所有代码完全相同。 (尽管这些目录之外可能还有其他文件)。
  • big_sdk/*中的代码不应提及small_package。这排除了具有多个导入源的简单try/except方法。

我已经尝试将测试切换为从单独的模块small_library.py导入,该模块将一个仓库中的big_sdk.small_lib导入另一个仓库中的small_package.small_lib。它不适用于from big_sdk.small_lib import some_module等较深的导入。然后,我尝试使用修改了sys.modules['component_library'] = big_sdk.small_lib的黑客程序,该程序虽然可以部分工作,但需要“注册”所有子模块(sys.modules['component_library.*']),这并不容易,而且太hacky。

python python-3.x import python-unittest
1个回答
0
投票

我想我只将small_lib目录和small_lib_tests目录作为同级。

之前:

big_sdk/small_lib/*
tests/small_lib_tests/*

之后:

big_sdk/small_lib/*
big_sdk/small_lib_tests/*

这看起来有些丑陋,但是它允许从测试代码中进行相对导入。

from .. import small_lib
from ..small_lib import some_module
from ..small_lib import some_func

这样就不会在代码中提及big_sdksmall_package

© www.soinside.com 2019 - 2024. All rights reserved.