我有一个需要一些编译的 Python 项目。tox使sdist和bdist_wheel成功。但是,当tox运行测试时,源代码模块始终是导入的模块,导致测试失败(因为那里没有二进制文件)。发生这种情况是因为项目的根目录始终是第一个文件夹sys.path,我无法弄清楚这是如何发生的。
project\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 foo\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bar.c <-- turns into bar.so in bdist_wheel\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tests\n\xe2\x94\x82 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 test_bar.py\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 tox.ini\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\nRun Code Online (Sandbox Code Playgroud)\n\ntox.ini[tox]\nenvlist =\n py37\n\n[testenv]\nchangedir = {toxinidir}/tests\nsetenv =\n PYTHONPATH = {envsitepackagesdir}\ncommands = {envpython} -m pytest --cov=bar --cov-report=html\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,我设置changedir为确保项目根目录不是工作目录。我还设置PYTHONPATH为仅有毒环境的站点包。我还强制运行 tox 环境的 Python。
尽管如此,这是sys.path我在测试运行期间打印出来的结果:
[\n '/home/me/foo', # Bad, bad, bad\n '/home/me/foo/tests', # Good, this is the CWD\n '/home/me/foo/.tox/py37/lib/python3.7/site-packages', # …Run Code Online (Sandbox Code Playgroud) tox 中是否可以触发tox -e hellohello 环境并在全局环境列表上运行?
运行tox针对 py2 和 py3 正确运行。
运行tox -e hello仅针对 py3 运行。
[tox]
skipsdist = True
envlist = py{27,37}
[testenv]
deps =
pytest
!py27: mock
commands =
{envpython} --version
; How to run this hello against the complete envlist?
[testenv:hello]
envlist = py{27,37}
commands =
echo hello
Run Code Online (Sandbox Code Playgroud)
似乎这在某种程度上是预期的行为,但除了制作一堆 tox 文件之外,我不知道如何使用 tox 来解决问题:我想要有不同的 tox 命令入口点。例如,仅针对 运行单元测试py27,仅针对 运行单元测试py{27,37},仅针对 运行集成测试py27-{libA,libB},等等。
也许这只是一种反模式,您可以在单个环境中以这种方式使用 tox -e ,但它会破坏 envlist ?
我只需要再制作一个 tox.ini …
有时我想打印一些语句,以确保单元测试运行良好(即使它通过),但找不到启用它的选项。
如果测试失败,那么它确实将自定义打印显示为输出,但如果通过,它确实会忽略打印或日志(我的意思是,它在终端输出上看不到它们)。
我尝试使用详细信息,例如-vvvv,但它仍然忽略我的打印。有nose一个选项,如--nologcapture. 中有类似的东西吗tox?
我有一个使用诗歌和毒素的Python项目。它有源代码、测试和脚本(juptext 笔记本)。我无法在脚本中导入开发依赖项,但可以在测试中导入。
当我遇到这个问题时,我创建了以下最小示例。一开始不行,后来我就摆弄了一下,现在可以了。因此,我删除了存在实际问题的项目,这样除了项目名称、位置、虚拟环境和 .git 目录之外,它是无法区分的,但这仍然不起作用。
更新删除所有构建工件和最小示例的 virtualenv 使其再次停止工作
更新将行添加到scripts: poetry installtox 命令仅修复了最小的示例
源代码、测试和脚本的布局如下
foo
+--foo
| +--__init__.py
|
+--tests
| +--__init__.py
| +--test_foo.py
|
+--scripts
| +--foo_script.py
|
+--pyproject.toml
+--tox.ini
Run Code Online (Sandbox Code Playgroud)
这些文件要么是空的,要么如下所示:
foo_script.py
import requests
Run Code Online (Sandbox Code Playgroud)
测试_foo.py
import requests
import pytest
def test():
assert True
Run Code Online (Sandbox Code Playgroud)
pyproject.toml
[tool.poetry]
name = "foo"
version = "0.1.0"
description = ""
authors = ["foo maker"]
[tool.poetry.dependencies]
python = "^3.7"
requests = "*"
[tool.poetry.dev-dependencies]
pytest = "^4.6"
[build-system]
requires = ["poetry>=0.12"]
build-backend …Run Code Online (Sandbox Code Playgroud) 我有一个 python 包,用于poetry依赖管理和打包。
在我的本地环境中,我正在使用tox多个 python 版本来测试包。
每次有推送或拉取请求时,如何使用 GitHub 操作来测试我的包?
我尝试过的事情:
pip和安装requirements.txt,但我正在使用诗歌)pip诗歌,不推荐使用诗歌,因为它可能会与我的应用程序依赖项发生冲突,请参阅问题)pytest(github操作的)每个矩阵中运行,这个操作似乎违背了tox的目的)我想在 gh-actions 中测试我的 python 代码。
在我的情况下,我实际应该使用什么?
最佳做法是什么?和最优化的工具
我正在使用 tox 使用 tox -p(并行运行)在不同的环境上运行测试,但所有测试的覆盖率报告生成都存在问题。
毒物.ini:
[tox]
envlist = env1,ev2,report
skipsdist=True
[base]
deps = pytest
[testenv:env1]
deps = custom-package-1
{[base]deps}
commands = pytest --cov-append tests/flows/test_1.py
[testenv:env2]
deps = custom-package-2
{[base]deps}
commands = pytest --cov-append tests/flows/test_2.py
[testenv:report]
deps = coverage[toml]
commands = coverage report
depends = env1,env2
parallel_show_output = true
Run Code Online (Sandbox Code Playgroud)
pyproject.toml 覆盖部分:
[tool.coverage.report]
fail_under = 100
show_missing = true
exclude_lines = [
'pragma: no cover',
'\.\.\.',
'if TYPE_CHECKING:',
"if __name__ == '__main__':",
]
Run Code Online (Sandbox Code Playgroud)
错误:
No source for code: '/Users/my_user/projects/my_proect/flows/__init__.py'.
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我提供的配置有什么问题吗?
这是项目和输出的链接,可用于重现我在下面描述的问题。
我使用的覆盖面与TOX对蟒蛇的多个版本。我的tox.ini文件看起来像这样:
[tox]
envlist =
py27
py34
[testenv]
deps =
coverage
commands =
coverage run --source=modules/ -m pytest
coverage report -m
Run Code Online (Sandbox Code Playgroud)
我的问题是,覆盖范围只能使用一个版本的python(在我的情况下为py27)运行,而不能同时使用py27和py34。每当我有依赖于python版本的代码执行时,这就是一个问题,例如:
def add(a, b):
import sys
if sys.version.startswith('2.7'):
print('2.7')
if sys.version.startswith('3'):
print('3')
return a + b
Run Code Online (Sandbox Code Playgroud)
针对上述代码运行覆盖率将错误地报告py27和py34的第6行(“ print('3')”)为“缺少”。对于py34,应该只缺少此字符。
我知道为什么会这样:覆盖已安装在我的基本操作系统(使用python2.7)上。因此,在运行Tox时,它会注意到Coverage已安装,并且从基本OS继承了Coverage,而不是将其安装在它创建的virtualenv中。
对于py27,这很好而且很花哨,但在py34的覆盖率报告中导致错误的结果。我有一个临时的变通办法:我需要一个较早版本的coverage(相对于基本OS上安装的版本),以便Tox将被迫在virtualenv中安装一份单独的coverage副本。例如
[testenv]
deps =
coverage==4.0.2
pytest==2.9.0
py==1.4.30
Run Code Online (Sandbox Code Playgroud)
我不喜欢这种解决方法,但这是我目前发现的最好方法。关于强制tox在virtualenv中安装当前版本的Coverage的任何建议,即使我已经在基本OS上安装它了吗?
试图为陷入失修状态的 django 包注入活力。他们使用 tox 进行测试,所以我在我的 MacBook 上设置了 pyenv。我已经安装了 3 个版本的 python,如下所示,一切看起来都应该可以工作,但如果是这样,我就不会问为什么不行。
我用 ~ 替换了我的主目录,使其更易于阅读。
pyenv 已安装,brew install pyenv并安装了各种版本的 pythonpyenv install #.#.#
垫片存在:
$ echo $PATH
~/.pyenv/shims:~/.platformsh/bin:/usr/local/sbin:...
$ which python3.6
~/.pyenv/shims/python3.6
$ which python3.4
~/.pyenv/shims/python3.4
$ which python3.5
~/.pyenv/shims/python3.5
Run Code Online (Sandbox Code Playgroud)
但是执行它们并没有按预期工作:
$ pyenv local 3.4.9 3.5.6 3.6.8
$ python3.4
Python 3.4.9 (default, Feb 12 2019, 10:33:47)
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
$ python3.5
pyenv: python3.5: …Run Code Online (Sandbox Code Playgroud) 我想扮演一个角色。这些角色应通过具有分子的CI / CD流程进行验证,并利用docker作为驱动程序。此验证步骤应包括多个Linux版本(例如centos / ubuntu / debian)乘以受支持的ansible版本。
然后应执行测试,以便使用
centos:7 + ansible:2.5
centos:7 + ansible:2.6
centos:7 + ansible:2.7
...
ubuntu:1604 + ansible:2.5
ubuntu:1604 + ansible:2.6
ubuntu:1604 + ansible:2.7
...
Run Code Online (Sandbox Code Playgroud)
Ansible团队的官方图片已弃用大约3年了:
此外,由于结果数量巨大,为查找支持ansible的新图像而使用的不推荐使用的图像所引用的链接是完全没有用的
https://hub.docker.com/search/?q=ansible&page=1&isAutomated=0&isOfficial=0&pullCount=1&starCount=0
是否有社区(或ansible)维护良好的ansible码头工人形象填补了空白?
最好具有可以拉出的多个版本以及可以定期构建和验证所创建映像的CI流程。
我为什么要寻找图像?我不想重新发明轮子(如果可能的话)。我想使用图像通过分子来测试版本不兼容的角色。
我进行了搜索,但找不到真正有用的东西。您正在使用什么图像在容器/编排器中运行ansible?您是否自己构建和维护图像?
例如https://hub.docker.com/r/ansibleplaybookbundle/apb-base/tags
看起来很有希望,但是其中的图像也已经存在了7个月以上(至少)。
为OS和ansible版本的每种组合创建docker映像是否是通过分子和docker作为驱动程序进行测试的最佳方法?还是有一种更聪明的方法来测试具有多个操作系统时间和不同版本的ansible角色的向后兼容性?
我已经用分子和泊坞窗作为驱动程序测试了我的角色。这些测试当前仅测试角色在各种Linux发行版上的功能,而不能通过使用旧版本的ansible版本运行角色来测试向后兼容。
这是基于geerlingguy的ntp角色的centos7 / ubuntu1604 / ubuntu1804的travis测试示例角色:https : //github.com/Gepardec/ansible-role-ntp
我刚刚使用 PyScaffold 搭建了一个 python 项目。引起我注意的一件事是脚手架同时生成了 setup.cfg 和 tox.ini 文件。如果我的理解是正确的,如果我要使用tox命令使用 tox ,它只会查看 tox.ini 文件并完全忽略 setup.cfg 和 setup.py。
在这种情况下,我的问题是:是否有理由将它们都保留在项目中,或者仅使用 tox.ini 或 setup.cfg 就足够了?如果我必须将它们都保留在我的项目中,是否有一种简单的方法让它们都使用相同的配置(例如,运行 flake8 进行 linting 的配置),而我不必在 setup.cfg 和 tox 中键入这些配置。尼?
tox ×10
python ×7
pytest ×3
ansible ×1
coverage.py ×1
docker ×1
molecule ×1
pyenv ×1
pyscaffold ×1
pytest-cov ×1
python-3.x ×1
setuptools ×1
stdout ×1
testing ×1