代码之家  ›  专栏  ›  技术社区  ›  cardamom

在测试和核心项目结构之间共享模块

  •  1
  • cardamom  · 技术社区  · 6 年前

    我试图在添加代码库的同时改进项目结构。我找到了一个样本结构 here

    README.rst
    LICENSE
    setup.py
    requirements.txt
    sample/__init__.py
    sample/core.py
    sample/helpers.py
    docs/conf.py
    docs/index.rst
    tests/test_basic.py
    tests/test_advanced.py
    

    我特别注意到 requirements.txt setup.py 在一个比 tests/ sample/

    如果我加上 sample/classes.py 你只需要写信 from classes import MyClass 在里面 sample/core.py 把它放进去。然而,它不可能如此容易地被导入到 tests/test_basic.py ,看起来不像python在导入时那样“眼花缭乱”。

    MANIFEST.in 与requirements.txt和一些并非真正的python文件处于同一级别,但它们只是为运行它的平台设置了一些东西。

    如果 classes.py 要求.txt 测试/ 而且在 样品/ 以及它们的子目录,但它可能需要 __init__.py 不知怎么的,那感觉不太对。

    如果两者都是,它应该去哪里呢 测试/ 样品/ 需要能够使用它吗?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Sraw    6 年前

    让我们简化一下。

    如果我理解正确,问题是 How to import simple module in test from simple.classes import MyClass .

    PYTHONPATH 执行前 python test/test_basic.py .

    这也是IDE在执行测试时为您所做的。

        2
  •  1
  •   Serge Ballesta    6 年前

    假设您使用Python>=3.3,您可以通过添加 __init__.py __初始值 (仅在此处)将父包的路径添加到 sys.path tests .

    我的答案是:

    import os
    import sys
    
    sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
    

    classes.py 从其中一个测试模块中,您只需使用:

    from sample import classes
    

    MyClass :

    from sample.classes import MyClass
    

    因为sample已经是一个包了,并且它的父文件夹已经添加到 什么时候 python unittest 已加载 test


    当然,这只适用于您可以将测试打包的情况。如果出于任何原因它不是一个选项,例如因为您需要单独运行测试模块,那么您应该将 直接在所有测试文件中修改。

    在tests文件夹中写入路径\u helper.py文件:

    import os
    import sys
    
    core_path = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
    if core_path not in sys.path:  # don't add it if it is already here
        sys.path.append(core_path)
    

    然后可以将其导入所有测试文件:

    import path_helper
    ...