Python中的包内引用与GUI测试

1 投票
1 回答
822 浏览
提问于 2025-04-15 20:58

我在使用Python包和测试方面遇到了一些问题。我正在用wx python写一个应用程序,下面是我为图形界面部分准备的基本文件夹/包结构。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...

不过,对于应用程序的图形界面部分,我希望除了单元测试(这没问题)之外,还能为每个视图准备一个小的“测试”/示例。也就是说,对于logpane,我想要一个小的可运行示例,能够启动一个简单的应用程序,展示这个视图,以测试布局是否正常等。

我开始的方式是在面板/视图的实际实现文件中添加一个

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

这对logpane非常有效。我可以独立运行这个文件,查看视图并确认它是否正常显示。

但当然,这种方法在mainframe.py中就不行了,因为它无法解决对logpane.py的依赖。因为当前的主模块是mainframe.py,而mainframe.py要访问utilviews包,必须要有一个更高层次的模块来启动。

那么,我该如何组织这些类型的测试呢?对于单元测试,我使用nose,这很好,能够解决问题,因为nose是从mainapp文件夹启动的(这样所有的包内引用都能正常工作)。但这些测试就像小的独立程序。我实在不想把这些Python文件堆在mainapp文件夹里(因为会有很多这样的文件)。有没有其他方法可以实现这个目标?

任何建议都很有价值。

谢谢,
Rickard

1 个回答

2

你可以使用 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

撰写回答