【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
即使是一个简单的Python模块,最常见的目录结构似乎也是将单元测试分成各自的test
目录:
new_project/
antigravity/
antigravity.py
test/
test_antigravity.py
setup.py
etc.
例如,请参见此Python项目howto 。
我的问题是,实际上运行测试的通常方法是什么? 我怀疑这对除我以外的所有人来说都是显而易见的,但您不能仅从测试目录运行python test_antigravity.py
,因为其import antigravity
将失败,因为模块不在路径上。
我知道我可以修改PYTHONPATH和其他与搜索路径有关的技巧,但我不敢相信这是最简单的方法-如果您是开发人员,那很好,但如果用户只是想检查测试结果,就不能期望用户使用通过。
另一种选择是将测试文件复制到另一个目录中,但是似乎有点愚蠢,并且错过了将它们放在一个单独目录中的意义。
那么,如果您刚刚将源代码下载到我的新项目中,将如何运行单元测试? 我希望有一个答案可以对用户说:“要运行单元测试,请执行X。”
#1楼
使用setup.py develop
来使您的工作目录成为已安装的Python环境的一部分,然后运行测试。
#2楼
从您链接到的文章:
创建一个test_modulename.py文件,并将您的unittest测试放入其中。 由于测试模块与代码位于不同的目录中,因此您可能需要将模块的父目录添加到PYTHONPATH中才能运行它们:
$ cd /path/to/googlemaps $ export PYTHONPATH=$PYTHONPATH:/path/to/googlemaps/googlemaps $ python test/test_googlemaps.py
最后,鼻子还有一个更流行的Python单元测试框架(那很重要!)。 鼻子有助于简化和扩展内置的单元测试框架(例如,可以自动找到您的测试代码并为您设置PYTHONPATH),但是标准Python发行版中并未包含。
也许您应该按照提示看一下鼻子 ?
#3楼
如果您运行“ python setup.py development”,则该软件包将位于路径中。 但是您可能不想这样做,因为您可能会感染系统python安装,这就是为什么存在诸如virtualenv和buildout之类的工具的原因。
#4楼
对用户而言,最简单的解决方案是提供一个可执行脚本( runtests.py
或类似的脚本),该脚本引导必要的测试环境,包括在需要时将根项目目录临时添加到sys.path
。 这不需要用户设置环境变量,类似这样的东西在引导脚本中可以很好地工作:
import sys, os
sys.path.insert(0, os.path.dirname(__file__))
然后,您对用户的说明就可以像“ python runtests.py
”一样简单。
当然,如果您真正需要的路径是os.path.dirname(__file__)
,则根本不需要将其添加到sys.path
中。 Python始终将当前正在运行的脚本的目录放在sys.path
的开头,因此,根据您的目录结构,只需将runtests.py
定位在正确的位置即可。
而且, Python 2.7+中的unittest模块 (已反向移植为Python 2.6及更早版本的unittest2 )现在具有内置的测试发现功能,因此,如果您要进行自动测试发现,则不再需要鼻子:您的用户说明可以很简单python -m unittest discover
#5楼
我有一个相同的问题,有一个单独的单元测试文件夹。 根据上述建议,我将绝对源路径添加到sys.path
。
以下解决方案的好处是,您可以运行文件test/test_yourmodule.py
而无需首先更改为test/test_yourmodule.py
目录:
import sys, os
testdir = os.path.dirname(__file__)
srcdir = '../antigravity'
sys.path.insert(0, os.path.abspath(os.path.join(testdir, srcdir)))
import antigravity
import unittest
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3151092