【问题标题】:Make library imports in tests compatible with two different packages that contain the library使测试中的库导入与包含该库的两个不同包兼容
【发布时间】:2020-05-17 21:30:04
【问题描述】:

我有一个非常奇怪的场景和目标。我需要在不对可能从两个不同包导入的库进行任何更改的情况下进行完全相同的测试。

有一个带有大 python 包 big_sdk 的 GIT 存储库,其中有一个小库 big_sdk.small_lib。

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

代码将在这两个地方存在一段时间,所以我希望两个地方的代码完全相同。 (这使得 GIT 工作流程变得更加简单,没有任何历史合并问题。)

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

问题在于测试。测试位于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

将测试代码提取到小repo时,这个要改成

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 导入,该模块在一个 repo 中导入 big_sdk.small_lib,在另一个 repo 中导入 small_package.small_lib。它不适用于像from big_sdk.small_lib import some_module 这样的更深层次的导入。然后我尝试使用修改 sys.modules['component_library'] = big_sdk.small_lib 的 hack,它部分工作,但需要“注册”所有子模块 (sys.modules['component_library.*']),这既不容易也太 hacky。

【问题讨论】:

    标签: python python-3.x import python-unittest


    【解决方案1】:

    我想我将只创建 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_sdk 和small_package 就不会在代码中提及。

    【讨论】:

      猜你喜欢
      • 2020-06-15
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-04-07
      • 2018-08-14
      • 2011-07-09
      • 2021-07-11
      相关资源
      最近更新 更多