我设置了要在我的
.gitlab-ci.yml
中与 pytest 结合使用的 tox。
我希望 pytest 在 .gitlab-ci.yml 文件中设置的特定环境下运行
在文档中,我找到了
tox.ini
配置 setenv
和 passenv
,但我无法理解每种配置的用例是什么。
有什么区别?有哪些用例?即我什么时候想使用 setenv 而不是 passenv ,反之亦然?
setenv
用于设置虚拟环境中的环境变量。
(将值设置为虚拟)
passenv
用于将特定的环境变量从外部环境传递到虚拟环境。
(从环境传递到虚拟)
setenv
希望您明确设置一个值:
setenv =
foo=bar
passenv
不需要设置值——它应该从调用 tox
的上下文中传递。作为相关背景...如果没有
passenv
,您在调用tox
之前可能设置的任何环境变量都不会出现在tox
创建的测试环境中!
例如,我可能有一些我知道可以在本地运行的测试,但在 CI 环境中运行时将无法工作。所以,在 pytest 中,我可能会有这样的东西:
@pytest.mark.skipif(os.environ.get('CI', False), reason="this test won't work in CI")
def test_function():
...
在这种情况下,我不想使用
setenv
,因为我仍然希望在本地调用 tox
时运行这些测试,而不是在 CI 中。因此,我为此变量配置 passenv
,以确保变量 CI
(始终存在于 CI 系统中)在 tox 环境中可访问:
passenv =
CI
在其他情况下,我可能希望每当调用
tox
时始终将变量设置为特定值,例如,PYTHONUNBUFFERED
变量以确保测试的输出不被缓冲:
setenv =
PYTHONUNBUFFERED=1