Ken*_*ams 6 python testing coverage.py tox
我正在使用tox并coverage.py在我的连续构建服务器中运行我的Python项目的测试.我也有一个pkg_x来自我已安装使用的供应商的包(在PyPI上不可用),python3.5 setup.py install它将其放入/usr/lib/python3.5/site-packages.现在我需要将该包用于测试代码.
我的当前tox.ini看起来像这样:
[tox]
envlist = py35
[testenv]
deps = nose
coverage
commands = coverage run -m nose []
sitepackages = True
Run Code Online (Sandbox Code Playgroud)
我像这样运行测试:
python3.5 -m tox -- --verbose --with-doctest
Run Code Online (Sandbox Code Playgroud)
这失败了 - 没有找到我本地列出的依赖包setup.py(例如像公共的东西more_itertools),即使它确实创建了类似于.tox/py35/lib/python3.5/site-packages/more_itertools包含相关包的目录.如果我开火.tox/py35/bin/python3.5,sys.path看起来像这样:
>>> [re.compile('.*\\.tox').sub('.tox', x) for x in sys.path]
['',
'.tox/py35/lib64/python35.zip',
'.tox/py35/lib64/python3.5',
'.tox/py35/lib64/python3.5/plat-linux',
'.tox/py35/lib64/python3.5/lib-dynload',
'/usr/lib64/python3.5',
'/usr/lib/python3.5',
'.tox/py35/lib/python3.5/site-packages']
Run Code Online (Sandbox Code Playgroud)
如果我删除了我的sitepackages = True行tox.ini,那么我确实得到了更多,在那些包中,现在可以找到more_itertools我的setup.py依赖项中的其他东西了,但是pkg_x我上面提到的供应商包仍然找不到.而且sys.path看起来是这样的:
>>> [re.compile('.*\\.tox').sub('.tox', x) for x in sys.path]
['',
'.tox/py35/lib64/python35.zip',
'.tox/py35/lib64/python3.5',
'.tox/py35/lib64/python3.5/plat-linux',
'.tox/py35/lib64/python3.5/lib-dynload',
'/usr/lib64/python3.5',
'/usr/lib/python3.5',
'.tox/py35/lib/python3.5/site-packages',
'/usr/lib64/python3.5/site-packages',
'/usr/lib/python3.5/site-packages']
Run Code Online (Sandbox Code Playgroud)
在任何情况下,.tox/py35/似乎都不包含供应商包pkg_x.虽然/usr/lib/python3.5/site-packages我.tox/py35/bin/python3.5手动启动时列出了目录,但pkg_x在运行测试时实际上并未找到.
它看起来与sitepackages = True它在http://tox.readthedocs.io/en/latest/config.html#confval-sitepackages=True|False中记录的内容有相反的效果
,对吧?
建议非常感谢!
Tox创建一个virtualenv,然后从该环境内部运行它的测试.
该--sitepackages参数是确定virtualenv是否可以访问全局安装的包的开关.
运行tox的"正常"方式就是简单地说tox; 通过pip或OS软件包安装它应该把它放到你的路径中.即:
$ tox
Run Code Online (Sandbox Code Playgroud)
这跟说:
$ tox -c tox.ini
Run Code Online (Sandbox Code Playgroud)
你直接调用tox的地方python -m tox,它可能会做一些事情,但这对我来说是一个红旗.此命令似乎不太可能激活相关的虚拟环境,这可以解释您的软件包可用性问题.它适合,因为当你省略时sitepackages,它实际上添加了全局包,因为它认为它在virtualenv中,所以添加,它认为是localsitepackages,虽然它们实际上是全局的.当你把它变成真的时会发生相反的情况,因为当它寻找全局包时它找不到它们.无论如何,因为你没有像预期的那样调用tox,它就像我们一样困惑.
所以只需使用tox提供的命令即可.
但是等等还有更多:你说你有一个必需的包,但在pypi上没有.那么tox如何安装呢?tox文档提出了两种方法(使用requirements.txt),但这里最直接的描述是激活env并手动安装.
如果您需要进一步调试也很好:进入.tox目录并手动激活venv.例如:
$ source .tox/testenv/bin/activate
Run Code Online (Sandbox Code Playgroud)
(testenv您在括号中使用的名称在哪里tox.ini).
现在安装包,不过你之前做过,例如: pip install pkg_x
完成后以这种方式停用venv:
$ deactivate
Run Code Online (Sandbox Code Playgroud)
tox现在试试?
如果我们在正确的轨道上了解更多关于virtualenv的信息
| 归档时间: |
|
| 查看次数: |
866 次 |
| 最近记录: |