在Python 3中测试子包模块

时间:2009-12-17 14:57:47

标签: python unit-testing import python-3.x relative

我一直在尝试各种层次结构的使用,以及绝对和相对导入之间的差异,并且无法弄清楚如何使用包,子包和模块执行常规操作,而无需简单地将所有内容放在sys.path上。我有一个两级包层次结构:

    MyApp  
        __init__.py  
        Application  
            __init__.py  
            Module1  
            Module2  
            ...  
        Domain  
            __init__.py  
            Module1  
            Module2  
            ...  
        UI  
            __init__.py  
            Module1  
            Module2  
            ...  

我希望能够做到以下几点:

  1. 当模块从同一目录中的其他模块导入时,在模块的“if main ”中运行测试代码。
  2. 在每个子包中都有一个或多个测试代码模块,对子包中的模块进行单元测试。
  3. 有一组单元测试,它们位于某个合理的位置,但在子包之外,可以在兄弟包中,在顶级包中,也可以在顶级包之外(尽管所有这些可能最终都在运行)每个子包中的测试)
  4. 从三个子包级别中的任何一个“输入”结构,例如运行仅使用Domain模块的代码,运行仅使用Application模块的代码,但Application使用Application和Domain模块中的代码,从GUI运行代码使用GUI和Application中的代码;例如,应用程序测试代码将导入应用程序模块,但不导入域模块。
  5. 在没有子包的情况下开发大量代码之后,在将模块组织到此层次结构后继续开发和测试。
  6. 我知道如何使用相对导入,以便将MyApp放在其sys.path上的外部代码可以导入MyApp,导入它想要的任何子包,并从其模块中导入内容,而每个子包中的模块可以从中导入其他模块相同的子包或兄弟包。但是,上面列出的开发需求似乎与子包结构不兼容 - 换句话说,我不能两种方式:从外部使用并且也从内部使用的结构良好的多级包层次结构,特别是用于测试但也因为来自一个设计级别(特别是UI)的模块不应该从下一个下面的设计级别导入模块。

    对于这篇漫长的文章感到抱歉,但我认为这相当代表了许多人采用新的相对导入机制的斗争。

2 个答案:

答案 0 :(得分:0)

我正在努力解决同样的问题,我能想到的唯一可行的方法就是放弃或改变你的第二点。 原因 - 据我了解如下:您将只想在子包和子模块中使用相对导入。这意味着必须导入顶级包。所以单元测试应该在顶级包之外并导入它。

如何在每个子包或-module中使用test函数,以及从所有子包导入测试函数并执行它们的单个测试脚本?

答案 1 :(得分:-1)

我不知道这与相对进口有什么关系。相对导入允许与绝对导入完全相同的东西,只使用不同的表示法。