使用典型的测试目录结构运行unittest

限于喜欢 提交于 2019-12-30 20:09:13

【推荐】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安装,这就是为什么存在诸如virtualenvbuildout之类的工具的原因。


#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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!