python 和 GUI 测试中的包内引用

Posted

技术标签:

【中文标题】python 和 GUI 测试中的包内引用【英文标题】:Intra-package references in python and GUI tests 【发布时间】:2010-03-29 07:22:25 【问题描述】:

我有关于 python 包和测试的问题。我正在使用 wx python 编写一个应用程序,并且 gui 部分具有以下基本文件夹/包结构。 mainframe.py 窗口依赖于 logpane.py 面板,使用 mainframe.py 中的绝对导入可以轻松导入该面板:

import guiapp.utilviews.logpane

文件夹/包布局:

mainapp
   - main.py
   guiapp
       - __init__.py
       utilviews
           - __init__.py
           - logpane.py
           - other stuff...
       mainview
           - __init__.py
           - mainframe.py
           - other stuff here...
       other views...

但是,对于应用程序的 gui 部分,除了单元测试(它们没有问题)之外,我还希望为每个视图提供一个小的“测试”/示例。也就是说,对于日志窗格,我希望有一个小的可运行示例,它将启动一个显示视图以测试布局是否正常等的裸骨应用程序。 我开始的方式是我有一个

if __name__ == "__main__":
    # create some small window and a wx app
    # instanciate the panel and launch the app
    pass

在面板/视图本身的实际实现文件中。这为日志窗格创造了奇迹。我可以单独运行文件来查看视图并查看它是否结合在一起。

当然,mainframe.py 的策略失败了,因为无法解决对 logpane.py 的依赖。这是因为当前的主模块 mainframe.py 并且 mainframe.py 可以访问 utilviews 包的唯一方法是主/启动模块是否在树中更靠前。

那么我该如何构建这些类型的测试呢?对于单元测试,我使用 nose 这很好并且可以解决问题,因为nose 是根据 mainapp 文件夹启动的(因此所有包内引用都有效)。但是这些测试就像小的独立程序。我根本不能用这些 python 文件弄乱 mainapp 文件夹(会有很多这样的文件)。我还有其他方法可以做到这一点吗?

任何意见都是有价值的。

谢谢, 里卡德

【问题讨论】:

【参考方案1】:

您可以使用PYTHONPATH。在执行测试文件之前,将其设置为您的主项目目录。然后它将能够解析您的所有导入,就像您从该目录执行一样。

$ find
.
./test
./test/test.py
./some
./some/__init__.py

$ cat some/__init__.py 
x = 10

$ cat test/test.py 
import some
print some.x

$ cd test
$ export PYTHONPATH=..
$ python test.py
10

【讨论】:

谢谢。这是一个解决方案。虽然它增加了一些麻烦,因为我希望其他开发人员能够从 SVN 中检查项目,然后能够运行测试。也许我可以在 if name == "main" 子句中添加一些逻辑,该子句从 CWD 向上遍历并以编程方式 () 通过 sys.path) 附加到路径它到达 mainapp 文件夹。那应该可以在任何地方拥有工作副本。我会试试的!谢谢! 是的,修改sys.path 也可以,但我认为这很不合时宜。但是,如果您将测试合并到某个 test/ 目录中,您可以简单地提供一个小的 shell 脚本来执行测试,它会在之前设置 PYTHONPATH

以上是关于python 和 GUI 测试中的包内引用的主要内容,如果未能解决你的问题,请参考以下文章

如何在包内引用 Python 中的***模块?

在 python 中使用 unittest 和主包内目录中的测试模块的正确方法是啥?

在Java中的包内获取一组类文件[重复]

如何在 Eclipse 项目资源管理器中的包内创建子包

Python:导入包含的包

python中多重目录中的包引用怎么样?