标签: tox

如何让 tox 和诗歌一起工作以支持测试 Python 依赖项的多个版本?

我切换当前使用的一个项目pipenv,以poetry作为一个测试,看看差别是什么。该项目是一个简单的、可再分发的 Django 应用程序。它支持 Python 3.6-8,以及 Django 2.2 和 3.0。我有一个tox.ini文件,涵盖了 Python 和 Django 的所有组合,因此:

[tox]
envlist = py{36,37,38}-django{22,30}

[testenv]
whitelist_externals = poetry
skip_install = true

deps =
    django22: Django==2.2
    django30: Django==3.0

commands =
    poetry install -vvv
    poetry run pytest --cov=my_app tests/
    poetry run coverage report -m
Run Code Online (Sandbox Code Playgroud)

我遇到的问题(pipenv世界上不存在)是该poetry install语句将始终用文件中的任何内容覆盖该deps部分中的任何内容poetry.lock(如果它不存在,它将自动生成)。这意味着测试矩阵永远不会针对 Django 2.2 进行测试 - 因为默认情况下每个 tox virtualenv 都会安装 Django 3.0。

我不明白这应该如何工作 - 是否应该使用poetry尊重正在安装的现有环境来安装依赖项?

所以 - 我的问题是 - …

django tox python-poetry

17
推荐指数
1
解决办法
3977
查看次数

错误在尝试运行py.test时收集setup.py?

我试图py.test在我的包上运行,但它试图setup.py从项目根目录解析,即使我试图排除它.

我需要从*.py文件中收集测试,因为测试类包含在模块中.

# setup.cfg
[pytest]
norecursedirs = .svn _build tmp* lib/third lib *.egg bin distutils setup.py
python_files = *.py
Run Code Online (Sandbox Code Playgroud)

还是当我跑的py.test时候会给我ERROR collecting setup.py我已经排除的东西.

/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/distutils/core.py:140: in setup
>           raise SystemExit, gen_usage(dist.script_name) + "\nerror: %s" % msg
E           SystemExit: usage: py.test [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
E              or: py.test --help [cmd1 cmd2 ...]
E              or: py.test --help-commands
E              or: py.test cmd --help
E           
E           error: no commands supplied
Run Code Online (Sandbox Code Playgroud)

python setuptools pytest tox

13
推荐指数
1
解决办法
3201
查看次数

如何将另一个tox项目文件夹指定为tox项目的依赖项

我们有一个启用tox的项目(我们称之为"主"项目),它依赖于另一个tox项目(我们称之为"库"项目) - 所有项目都集成在一个存储库中,因为它是一个大型总体项目的一部分.

该项目如何为普通用户工作

对于作为最终用户的常规安装,您只需先从存储库或任何来源安装"library"然后"main",然后运行它.

我们的问题是tox

但是,作为开发人员,情况有所不同,因为"tox"应该可以工作,并且您可能希望同时拥有多个版本.

您通常检查大型总体存储库,然后文件系统布局是这样的:

overarchingproject/main/
overarchingproject/main/src/
overarchingproject/main/tox.ini
overarchingproject/main/setup.py
...
overarchingproject/library/
overarchingproject/library/src/
overarchingproject/library/tox.ini
overarchingproject/library/setup.py
...
Run Code Online (Sandbox Code Playgroud)

现在如果我进入main /并输入"tox",就会发生这种情况:

  1. 当前行为:它将尝试构建依赖于"库"的"主"项目 - 这显然会导致尝试从pip获取"库".但是,该项目尚未发布(因此不在点)因此它将无法工作 - 即使lib在同一个回购中就在那里.

    结果:它不起作用.

    解决方法1:我们可以设置自己的包索引/要求用户这样做.但是,要求每个参与项目的人都使用DevPI或类似工具来运行单元测试似乎不是一个好主意,所以我们需要集中进行.

    但是如果我们在某个中心位置提供了一个包索引或者为"库"提供了一个pip包,那么人们就无法通过参与他们自己创建的修改版"库"来轻松地运行"main"测试:

    毕竟"库"在同一个存储库中,所以人们不妨在某个时候修改它.

    在"主"项目文件夹中键入"tox"将不会轻易获取当前相邻的"库"版本,但只有预先打包的在线内容并不完全直观.

    解决方法2:我们尝试了sitepackages = True并在系统中安装"library" - 但是,sitepackages = True导致了我们显着的麻烦,一般来说这似乎不是一个好主意.

  2. 期望的行为:我们希望tox在相同的总体存储库中使用该文件夹中的"库"的本地版本,人们通常会在一个存储库中获得:

    该版本可能更新,甚至可能在本地修改,因此这显然是开发用户想要使用的版本.它存在,现在不能说关于pip包.

为什么我们仍然希望使用子项目("main","library",...)而不仅仅是一个项目的总体存储库?

我们开发了一个多守护进程大型项目,其中包含许多用于各种目的的守护进程,在一些库中共享代码以形成大学课程管理系统(处理论坛,课程管理,可以提交事物,附加代码版本系统用于学生项目等等.).

可以只使用守护进程的子集,因此它们是单独的项目是有意义的,但它们仍然足够连接,大多数人都希望拥有大部分 - 因此所有这些都在一个存储库中.

库本身也适用于完全不同的项目,但它通常用于我们的开头 - 因此它就是填充到存储库中的地方.这意味着它总是在给定的相对路径中,但它有单独的tox.ini和单元测试.

TL; DR /摘要

那么,在安装项目时,我们如何让tox在另一个toxable项目文件夹中寻找特定的依赖项而不是pip呢?

当然"main"的常规setup.py安装过程不应该乱用tox或搜索本地磁盘:它应该检查一个特定的相对路径,然后放弃,如果那个不存在(并回退) pip或其他).

如果相对路径可以以某种方式存储在tox.ini中,那么最好.

或者这只是一个非常糟糕的主意?我们是否应该以不同的方式解决这个问题,以使我们的"主要"项目能够轻松地使用本地存储库中存在的最新本地开发版"库"?

python dependencies setuptools setup.py tox

13
推荐指数
2
解决办法
2288
查看次数

flax8/pylint在Tox测试环境中失败,引发InvocationError

我一直在学习如何在tox中为我的python项目进行测试.

我有(应该是)一个相当标准的tox初始化文件,如下所示:

[tox]
envlist=py27,flake8
...
[testenv:flake8]
deps=flake8
commands=flake8 library # 'library' is temp. name of project
Run Code Online (Sandbox Code Playgroud)

一切看起来都很正常,所有测试工作,甚至flake8输出都通过(下面的输出).但是,tox引发了一个InvocationError(它在使用pylint进行测试时也是如此)

flake8 recreate: /Users/shostakovich/projects/project_templates/library/.tox/flake8
flake8 installdeps: flake8
flake8 inst: /Users/shostakovich/projects/project_templates/library/.tox/dist/library-0.1.0.zip
flake8 installed: flake8==2.4.1,library==0.1.0,mccabe==0.3,pep8==1.5.7,pyflakes==0.8.1,wheel==0.24.0
library/__main__.py:12:1: F401 'os' imported but unused
library/__main__.py:13:1: F401 're' imported but unused
...
ERROR: InvocationError: '/Users/shostakovich/projects/project_templates/library/.tox/flake8/bin/flake8 library'
Run Code Online (Sandbox Code Playgroud)

我在MaxOSX 10.9.5上运行tox 2.0.2.如果我直接调用flake8或pylint(上面显示了flake8的版本),问题就消失了.

python testing tox flake8

13
推荐指数
1
解决办法
5700
查看次数

如何在tox中只运行一个测试?

我正在尝试为项目编写一个新测试,我只想在tox中测试一个测试.我已经完全确定其他测试都没问题,我不需要每次都运行它们.我发现的唯一建议不起作用

ERROR: InvocationError: could not find executable 
Run Code Online (Sandbox Code Playgroud)

python tox

13
推荐指数
2
解决办法
8085
查看次数

如何说服python tox只为可用的python解释器运行测试?

我使用python tox为几个版本的python运行python unittest,但是这些python解释器并非在我运行tox的所有机器或平台上都可用.

我如何配置tox,这样只有在python解释器可用时它才会运行测试.

示例tox.ini:

[tox]
envlist=py25,py27

[testenv]
...
[testenv:py25]
...
Run Code Online (Sandbox Code Playgroud)

最大的问题是我确实想要一个自动检测到的python环境列表.

python tox

12
推荐指数
1
解决办法
1432
查看次数

在python Tox ini文件中使用source时出错

我想让Tox和Conda一起玩好.主要是因为我需要安装很多非python依赖项,并且很容易创建Conda发行版.然后我可以用简单的方式安装所有东西conda install.

但是,我在激活conda环境时遇到了麻烦.

[tox]
envlist = py27

[testenv]
whitelist_externals =
    conda
    source
    py.test
setenv =
    PYTHONPATH = {toxinidir}:{toxinidir}/damlarces
install_command =
    python build_env.py --conda-env {toxworkdir}/conda {packages}
commands =
    source activate {toxworkdir}/conda
    py.test --basetemp={envtmpdir}
Run Code Online (Sandbox Code Playgroud)

python build_env.py --conda-env {toxworkdir}/conda {packages}负责创建环境(如果需要),安装包等的问题来的source activate {toxworkdir}/conda线.我收到一个ERROR: InvocationError: could not find executable 'source'错误.直接在命令行中键入命令可以正常工作.

对于那些有兴趣的人.这build_env.py是在这个要点:https://gist.github.com/JudoWill/70450979353fa2d12823 ...目前它只是安装Python依赖,但在其预期的环境中,它将安装不一定是python库的Conda repo.有什么想法吗?

automated-tests python-2.7 tox conda

12
推荐指数
2
解决办法
5906
查看次数

Tox将错误版本的pip安装到它的虚拟环境中

我使用tox来管理一些测试环境.我有一个依赖(backports.ssl-match-hostname)我无法使用最新版本的pip下载,所以我需要恢复到pip 8.0.3以允许安装工作.

我在我的tox.ini文件中包含了8.0.3版本的pip用于依赖项.

deps=
    pip==8.0.3
Run Code Online (Sandbox Code Playgroud)

但是,当我跑

source .tox/py27/bin/activate
Run Code Online (Sandbox Code Playgroud)

并进入虚拟测试环境,然后运行

pip --version
Run Code Online (Sandbox Code Playgroud)

我结束了

8.1.2
Run Code Online (Sandbox Code Playgroud)

但是,在我的tox环境之外,当我运行相同的命令时,我得到了

8.0.3
Run Code Online (Sandbox Code Playgroud)

抓住点子时,tox有什么特别之处吗?为什么我无法指定要用作依赖项的pip版本?

编辑:添加到这个,似乎我能够获取依赖pip == 8.0.3,但对于其他依赖,它们仍然从使用pip == 8.1.2启动的命令运行

所以,我需要首先抓住pip == 8.0.3,然后一旦安装,抓住其他一切.仍然不确定为什么tox以pip == 8.1.2开头

python linux dependencies pip tox

12
推荐指数
1
解决办法
2349
查看次数

在requirements.txt或setup.py更改时,使用tox重新安装virtualenv

以前我手动使用的Makefile看起来像这样:

.PHONY: all
all: tests

.PHONY: tests
tests: py_env
    bash -c 'source py_env/bin/activate && py.test tests'

py_env: requirements_dev.txt setup.py
    rm -rf py_env
    virtualenv py_env
    bash -c 'source py_env/bin/activate && pip install -r requirements_dev.txt'
Run Code Online (Sandbox Code Playgroud)

这有一个很好的副作用,如果我更改了requirements_dev.txt或setup.py,它将重建我的virtualenv.但感觉有点笨重.

我想tox用来做类似的事情.我明白tox有一个--recreate选择,但我宁愿在我需要时才打电话.

我的新设置是这样的:

# Makefile
.PHONY: all
all: tests

.PHONY: tests
tests:
    tox
Run Code Online (Sandbox Code Playgroud)

# tox.ini
[tox]
project = my_project
envlist = py26,py27

[testenv]
install_command = pip install --use-wheel {opts} {packages}
deps = -rrequirements_dev.txt
commands =
    py.test …
Run Code Online (Sandbox Code Playgroud)

python makefile virtualenv tox

11
推荐指数
2
解决办法
3164
查看次数

从 github 运行 tox 时出现“ERROR: py37: InterpreterNotFound: python3.7”

我在 GitHub 上有一个带有 tox.ini 文件的项目:

[tox]
envlist = py3

[testenv]
deps = -rrequirements.txt
commands =
    pytest --doctest-modules
Run Code Online (Sandbox Code Playgroud)

效果很好。但是当我用“py37”替换“py3”时,它失败并出现错误:

ERROR:  py37: InterpreterNotFound: python3.7
Run Code Online (Sandbox Code Playgroud)

据我所知,tox应该支持Python 3.7。这是 github 上的 tox 特有的问题吗?

github tox python-3.7 github-actions

11
推荐指数
1
解决办法
1万
查看次数