我有一个项目,我使用 tox 进行测试,它运行 flake8 测试。我想对我的测试目录应用与其他目录不同的 flake8 配置;我想在测试中忽略 E402,因为我sys.path在导入要测试的模块之前搞乱了。
flake8 配置语法仅允许您将一种配置应用于包含/排除匹配的文件,因此我添加了./tests/.flake8仅适用于这些文件的配置。
./tox.ini
[tox]
envlist = lint, py27, py36
[testenv]
commands =
coverage run --source=myModule -a setup.py test
[testenv:lint]
basepython = python3
ignore_errors = True
deps =
-r{toxinidir}/requirements_test.txt
commands =
flake8
pylint myModule
pydocstyle myModule tests
[flake8]
count = true
statistics = True
Run Code Online (Sandbox Code Playgroud)
./测试/.flake8
[flake8]
ignore = E402
Run Code Online (Sandbox Code Playgroud)
使用我的文件中的 flake8 选项tox.ini,点文件始终被忽略。如果文件中没有选项,tox.ini则 flake8 从命令行运行时会使用 dotfile,但在 tox 运行时会被忽略。
看起来没有办法将不同的 flake8 配置应用于同一项目下的不同文件集。我是否在配置语法中遗漏了一些可以让我在这里做我想做的事情的东西?
我有一些连接到测试 Postgres DB 的 pytest 测试。这些在当地运作良好。然而,在 GitHub actions 上,没有 Postgres DB,所以我必须禁用具有这些测试的整个模块。
根据文档,CI Always set to true.所以我所要做的就是检查 CI 环境变量,并禁用测试模块(如果存在并设置):
if os.getenv('CI'):
pytest.skip("No PostgreSQL on GH Actions CI/CD", allow_module_level=True)
Run Code Online (Sandbox Code Playgroud)
不起作用。
我尝试过手动设置它,通过 手动设置其他环境变量env:,但它们都不对 Python 可见。通过否定上述测试来本地禁用该模块not os.getenv('CI')可以按预期工作。
可能是什么问题呢?
在shell中执行一段代码后:
flake8 tests/
Run Code Online (Sandbox Code Playgroud)
结果正确:
tests/unit\test.py:17:91: E501 line too long (93 > 90 characters)
Run Code Online (Sandbox Code Playgroud)
但是 tox 通过在命令提示符中键入以下内容来启动相同的命令:
tox
Run Code Online (Sandbox Code Playgroud)
结果:
py38 installed: flake8==3.9.2,mccabe==0.6.1,pycodestyle==2.7.0,pyflakes==2.3.1
py38 run-test-pre: PYTHONHASHSEED='64'
py38 run-test: commands[0] | flake8 tests/
tests/unit\test.py:17:91: E501 line too long (93 > 90 characters)
ERROR: InvocationError for command 'C:\Users\48796\PycharmProjects\learningTests\.tox\py38\Scripts\flake8.EXE' tests/ (exited with code 1)
_______________________________________________________ summary _______________________________________________________
ERROR: py38: commands failed
Run Code Online (Sandbox Code Playgroud)
所以命令执行正常,然后就出错了。正如您在第三行中看到的 - 命令是相同的。
有任何想法吗?
我目前在我的mac上安装了Python 2.6.2.我正在编写一个必须在Python 2.5.2上运行的脚本.所以我想写一个python脚本,测试是针对2.5.2而不是2.6.2.
我看着virtualenv,但它似乎没有解决我的问题.我跑python virtualenv.py TEST了一个TEST目录,但它有python 2.6.有没有办法让virtualenv使用不同版本的python而不是我的机器上安装的默认版本?是另一种使用#!python脚本作为第一行的方法吗?我该怎么办?
我正在为docker-py的模块编写测试,但我似乎无法让测试正常工作。
我正在测试的功能如下所示:
def parse_env_file(env_file):
"""
Reads a line-separated environment file.
The format of each line should be "key=value".
"""
environment = []
if os.path.isfile(env_file):
with open(env_file, 'r') as f:
# We can't use f.readlines() here as it's not implemented in Mock
for line in f.read().split('\n'):
parse_line = line.strip().split('=')
if len(parse_line) == 2 and line[0] != '#':
k = parse_line[0]
v = parse_line[1]
environment.append('{0}={1}'.format(k, v))
return environment
Run Code Online (Sandbox Code Playgroud)
然后测试看起来像这样:
def test_parse_env_file_proper(self):
with mock.patch('os.path.isfile', return_value=True):
mock_env_file = 'USER=jdoe\nPASS=secret'
with mock.patch('{}.open'.format(__name__), mock.mock_open(read_data=mock_env_file)): …Run Code Online (Sandbox Code Playgroud) 我正在使用 tox 运行量角器测试,该测试将测试使用 django+angularjs 的应用程序,有一个胶水库 (django-protractor) 使这更容易,除了它在 django 管理命令中调用量角器,以及依靠 $PATH 来显示量角器的位置。
因此,如果我在运行 tox 之前正确设置了 $PATH,它就可以正常工作,但我宁愿不要求所有开发人员手动执行此操作。
setup.py通常取决于几个外部文件,尤其是README.mdfor long_description,也许是VERSIONfor version。例如
root = os.path.dirname(os.path.abspath(__file__))
setuptools.setup(
name = 'package',
version = open(os.path.join(root, 'VERSION')).read().strip(),
description = 'A Simple Package',
long_description = open(os.path.join(root, 'README.md')).read().strip(),
# ...
)
Run Code Online (Sandbox Code Playgroud)
但是,当尝试tox在这样的程序包上运行测试时,出现以下错误:
ERROR: invocation failed (exit code 1), logfile:
.tox/py36/log/py36-6.log
ERROR: actionid: py36
msg: installpkg
cmdargs:
['.tox/py36/bin/pip', 'install', '-U', '--no-deps', '.tox/dist/package-0.1.0.zip']
Processing ./.tox/dist/package-0.1.0.zip
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "setup.py", line 10, in …Run Code Online (Sandbox Code Playgroud) 在运行测试命令之前,如何配置 Tox 以获取文件?
我尝试了显而易见的:
commands = source /path/to/my/setup.bash; ./mytestcommand
Run Code Online (Sandbox Code Playgroud)
但 Tox 只是报告 ERROR: InvocationError: could not find executable 'source'
我知道 Tox 有一个setenv参数,但我想使用我的setup.bash,而不必将其内容复制并粘贴到我的tox.ini.
我正在尝试调试使用 tox 进行单元测试的 python 代码库。由于弄清楚,失败的测试之一被证明很困难,我想使用 pudb 来逐步执行代码。
一开始想到,会想到刚才pip install pudb在单元测试代码中加入import pudb和pudb.settrace()。但这会导致 ModuleNotFoundError:
> import pudb
>E ModuleNotFoundError: No module named 'pudb'
>tests/mytest.py:130: ModuleNotFoundError
> ERROR: InvocationError for command '/Users/me/myproject/.tox/py3/bin/pytest tests' (exited with code 1)
Run Code Online (Sandbox Code Playgroud)
注意到 .tox 项目文件夹会让人意识到在 tox 中有一个 site-packages 文件夹,这是有道理的,因为 tox 的重点是管理不同 virtualenv 场景下的测试。这也意味着有一个 tox.ini 配置文件,其 deps 部分可能如下所示:
[tox]
envlist = lint, py3
[testenv]
deps =
pytest
commands = pytest tests
Run Code Online (Sandbox Code Playgroud)
添加pudb到 deps 列表应该可以解决 ModuleNotFoundError,但会导致另一个错误:
self = <_pytest.capture.DontReadFromInput object at 0x103bd2b00> …Run Code Online (Sandbox Code Playgroud) 根据文档,tox 创建“通过调用当前项目的源代码分发python setup.py sdist”。
如何配置 tox 使其产生一个轮子,然后将其用于测试?:
python setup.py bdist_wheel --universal
Run Code Online (Sandbox Code Playgroud) tox ×10
python ×7
flake8 ×2
pytest ×2
testing ×2
django ×1
protractor ×1
pudb ×1
python-3.x ×1
python-wheel ×1
setuptools ×1
unit-testing ×1