在pydev中使用unittest对Python整个项目层级进行单元测试

4 投票
1 回答
1333 浏览
提问于 2025-04-17 12:39

我正在使用unittest模块来对一些用Pydev创建的分层包结构的Python代码进行单元测试。问题出现在我尝试在pydev中为实际的源代码和它的单元测试使用不同的源文件夹时。

project
  |----src
  |     |----com
  |     |     |----myself
  |     |     |       |----MyApplication
  |     |     |       |          |----SampleFileToTest.py  => The application file that I want to test
  |----test
  |     |----com
  |     |     |----myself
  |     |     |       |----MyApplication
  |     |     |       |          |----TestTheSampleFileToTest.py  => My test case file

因为我想分开这些层次结构,所以在测试文件中引用应用程序文件时遇到了问题。有没有可能像Junit那样,使用不同的源文件夹但保持相同的包名呢?

1 个回答

2

这在Python中默认是没有支持的(也就是说和PyDev没有关系)——我也是从Java背景过来的,所以你可能需要忘掉一些Java的概念哦 :)

在Python中,只要找到一个包含__init__.py的文件夹,这个包就不会在其他路径中被搜索了。我记得setuptools有一些小技巧可以让这个工作起来,而且我模糊记得Python 3可能会增加一些支持,但到目前为止,我觉得这并不是普遍推荐的做法……这和Java的方式差别很大——在Python中,扁平结构比嵌套结构更好——也许你知道这一点,但如果不知道,可以试试在Python解释器中输入'import this'来看看 :)

也就是说,简单来说,一旦找到my_app/__init__.py,它就不会在PYTHONPATH的其他地方去寻找my_app的子文件夹了。

所以,你有两种方法……我通常的做法是把测试放在一个名为_tests的包里,靠近模块。也就是说:

/project
/project/src
/project/src/myapp
/project/src/myapp/__init__.py
/project/src/myapp/_tests
/project/src/myapp/_tests/__init__.py
/project/src/myapp/_tests/test_myapp.py

而另一种方法(我必须说我稍微不太喜欢,因为测试和代码感觉更分开了)是为测试单独创建一个包:

/project
/project/src
/project/src/myapp
/project/src/myapp/__init__.py
/project/src/myapp_tests/__init__.py
/project/src/myapp_tests/test_myapp.py

撰写回答