我有一个支持python 2.4,2.6和2.7的构建盒.这导致在他们自己的python安装中根据需要安装各种版本的pips.我正在使用tox
测试setup.py
.
每当我运行一个时{python2.7_installation_dir}/bin/python setup.py test
,这会产生一个.tox
目录.在.tox
我运行的目录中
py27/bin/pip --version
pip 1.4.1 from {my_package}/.tox/py27/lib/python2.7/site-packages (python 2.7)
[buildbot@BUILD-SERV-01 .tox]# python2.7
Python 2.7.6 (default, Nov 20 2013, 15:33:09)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-54)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pip
>>> pip.__version__
'1.5.2'
Run Code Online (Sandbox Code Playgroud)
所以.tox目录中的pip版本是1.4.1,其中为我用来执行的python解释器安装的pip setup.py test
是1.5.2.这在运行测试时会导致错误,因为它使用pip来安装目录,其中一些来自外部源,而在1.5.2中我们需要为其中一个模块明确设置--allow-external --allow-unverified标志.在1.4.1中不存在,每次通过tox调用测试时都会导致错误.
只有一个python2.7安装,它是从源安装的.但我认为它正在运行pip 1.4.1,但现在已升级为使用1.5.2.如何使用旧版本?是否有任何.pth
可能遗留下来的文件或内容需要清理?
我可以tox
直接放下并运行pytests,但我更喜欢通过它运行它们tox
.
如果您想查看日志,请告诉我,我可以使用日志更新问题.
我正在更新一个测试覆盖率很差的继承存储库。repo 本身是一个 pytest 插件。我已经将 repo 更改为与tox
一起使用pytest-cov
,并将“原始”测试转换pytester
为在测试插件时按照 pytest 文档中的建议使用。
测试和 tox 构建等效果很好。但是,覆盖率报告了类定义、导入等的错误未命中。这是因为代码本身是作为 pytest 实例化的一部分导入的,并且在测试实际开始之前不会被“覆盖”。
我已经阅读了 pytest 文档、pytest-cov 和覆盖率文档以及 tox 文档,并尝试了几种配置,但都无济于事。我已经用尽了可能会导致我找到一个好的解决方案的谷歌关键字组合池。
pkg_root/
.tox/
py3/
lib/
python3.7/
site-pacakges/
plugin_module/
supporting_module.py
plugin.py
some_data.dat
plugin_module/
supporting_module.py
plugin.py
some_data.dat
tests/
conftest.py
test_my_plugin.py
tox.ini
setup.py
Run Code Online (Sandbox Code Playgroud)
一些带有评论的相关片段:
[pytest]
addopts = --cov={envsitepackagesdir}/plugin_module --cov-report=html
testpaths = tests
Run Code Online (Sandbox Code Playgroud)
这个配置给我一个错误,没有收集数据;在这种情况下不会创建 htmlcov。
如果我只是使用--cov
,我会得到(预期的)非常嘈杂的覆盖范围,它显示了功能命中和未命中,但是上面报告了导入、类定义等的错误未命中。
pytest_plugins = ['pytester'] # Entire contents of file!
Run Code Online (Sandbox Code Playgroud)
def test_a_thing(testdir):
testdir.makepyfile(
"""
def test_that_fixture(my_fixture):
assert my_fixture.foo == …
Run Code Online (Sandbox Code Playgroud) 我有根据当前版本的Python有条件运行的代码,因为我支持来自同一个包的2.6,2.7和3.3.
我目前使用默认版本的Python生成这样的覆盖率报告:
coverage run --source mypackage setup.py test
coverage report -m
coverage html
Run Code Online (Sandbox Code Playgroud)
这很有用但不理想,因为它只报告Python 2.7的内容.相反,我想生成2.6,2.7 和 3.2 的测试覆盖率的累积报告.
如何生成多版本覆盖率报告?
旁注:我已经尝试commands = coverage run --source mypackage setup.py test
为py26,py27,py33中的每一个输入我的tox.ini,但这似乎不会生成累积覆盖率报告.
我有tox 2.9.1
$ tox --version
2.9.1 imported from /Library/Python/2.7/site-packages/tox/__init__.pyc
registered plugins:
tox-pyenv-1.1.0 at /Library/Python/2.7/site-packages/tox_pyenv.pyc
Run Code Online (Sandbox Code Playgroud)
文件结构和内容如下
$ tree .
.
??? setup.py
??? test_env.py
??? tox.ini
0 directories, 3 files
Run Code Online (Sandbox Code Playgroud)
setup.py
$ cat setup.py
from setuptools import setup
setup(name="Tox Testing")
Run Code Online (Sandbox Code Playgroud)
tox.ini
$ cat tox.ini
[tox]
envlist = py35
setenv =
XYZ = 123
[testenv]
deps=pytest
commands=py.test
Run Code Online (Sandbox Code Playgroud)
test_env.py
$ cat test_env.py
import os
def test_env():
assert os.getenv('XYZ') == 123
Run Code Online (Sandbox Code Playgroud)
当我运行tox
命令时,我的测试失败了.
$ tox -v
using tox.ini: /private/tmp/testing/tox.ini
using tox-2.9.1 from /Library/Python/2.7/site-packages/tox/__init__.pyc …
Run Code Online (Sandbox Code Playgroud) 我有以下项目结构:
root
|- module
|- module.py
|- __init__.py
|- tests
|- unit
|- some_test.py
|- integration
|- another_test.py
|- conftest.py
|- setup.py
|- tox.ini
Run Code Online (Sandbox Code Playgroud)
当我运行时,python3 module/module.py ...
它按预期运行。
但是,当我执行时tox
,我得到ModuleNotFoundError: No module named 'dateutil'
.
在我的 setup.pyinstall_requires=['python-dateutil']
和 tox.ini 中有以下(简化的)内容:
[tox]
envlist = py{36, 37}
skipsdist = True
[testenv]
deps = pytest
commands = pytest
Run Code Online (Sandbox Code Playgroud)
有没有人知道为什么运行tox
会让我找不到模块“dateutil”以及如何修复它?
我有一个我使用的python项目:
还有很多。
基本上,我想添加tox
到我的 gitlab 管道中。而几乎一切似乎工作,打电话mypy
,flake8
或black
从TOX工作正常。但是,当我tox -e py37
在启用覆盖率的情况下调用(所以我想运行测试)时,会运行测试,我可以看到它们的结果,但是覆盖率是0%
(100%
仅在空__init__
文件等上)并且我收到警告:Coverage.py warning: No data was collected. (no-data-collected)
。
这是我与 pytest 相关的部分tox.ini
:
[tox]
envlist = flake8,mypy,black,py37
[testenv]
extras = tests
commands=
pytest --cov -ra --tb=short {posargs}
Run Code Online (Sandbox Code Playgroud)
这是我的.coveragerc
:
[run]
branch = True
source =
foo
omit =
foo/__init__.py
foo/__main__.py
foo/bar/__init__.py
foo/baz/__init__.py
[report]
exclude_lines =
pragma: no cover
if __name__ == .__main__.
show_missing …
Run Code Online (Sandbox Code Playgroud) 有没有办法告诉tox
测试自动化工具在安装所有软件包时使用PyPI镜像(显式测试依赖关系tox.ini
和依赖关系setup.py
)?
例如,pip install
有一个非常有用的--use-mirrors
选项,可以将镜像添加到包服务器列表中.
我构建了一个Django应用程序并用它制作了一个包setuptools
.现在,我想做以下事情:
我想用它来运行所有测试python setup.py test
.但是当我发出这个命令时,我得到:
/usr/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'install_requires'
warnings.warn(msg)
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: setup.py --help [cmd1 cmd2 ...]
or: setup.py --help-commands
or: setup.py cmd --help
error: invalid command 'test'
Run Code Online (Sandbox Code Playgroud)我想使用Tox来运行我的测试,但我不知道我应该在command
属性中写什么来运行我的Django app测试.
在我的virtualenv
激活中,我喜欢设置export PYTHONPATH=<mypath>
以便可以直接运行脚本。现在,当我tox
从 virtualenv 中运行时,我收到以下令人震惊的红色警告:
WARNING: Discarding $PYTHONPATH from environment, to override specify PYTHONPATH in 'passenv' in your configuration.
Run Code Online (Sandbox Code Playgroud)
我确实理解这个警告,并且我对 tox 覆盖 PYTHONPATH 没什么意见,但这个警告很烦人。我可以离开 venv 并tox
在没有它的情况下运行,但这也很烦人。
PYTHONPATH=""
运行 tox 时明确归零是个好主意吗?
[testenv]
# Explicitely reset pythonpath to avoid the "discarding" warning
setenv = PYTHONPATH = ""
Run Code Online (Sandbox Code Playgroud)
tox
这是否会影响我尚不知道的可能想要对路径执行的其他操作?
python ×10
tox ×10
coverage.py ×3
pytest ×3
virtualenv ×2
django ×1
pip ×1
pypi ×1
pytest-cov ×1
python-3.x ×1
setenv ×1
setup.py ×1
setuptools ×1
testing ×1
unit-testing ×1
version ×1