How to set the environment variable in tox?
Asked Answered
F

3

32

I have 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

File structure and content are as below

$ tree .
.
├── setup.py
├── test_env.py
└── tox.ini

0 directories, 3 files

setup.py

$ cat setup.py
from setuptools import setup

setup(name="Tox Testing")

tox.ini

$ cat tox.ini
[tox]
envlist = py35
setenv =
    XYZ = 123

[testenv]
deps=pytest
commands=py.test

test_env.py

$ cat test_env.py
import os

def test_env():
    assert os.getenv('XYZ') == 123

When I run the tox command, my test is failing.

$ 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
GLOB sdist-make: /private/tmp/testing/setup.py
  /private/tmp/testing$ /usr/bin/python /private/tmp/testing/setup.py sdist --formats=zip --dist-dir /private/tmp/testing/.tox/dist >/private/tmp/testing/.tox/log/tox-0.log
py35 reusing: /private/tmp/testing/.tox/py35
py35 inst-nodeps: /private/tmp/testing/.tox/dist/Tox Testing-0.0.0.zip
  /private/tmp/testing$ /private/tmp/testing/.tox/py35/bin/pip install -U --no-deps /private/tmp/testing/.tox/dist/Tox Testing-0.0.0.zip >/private/tmp/testing/.tox/py35/log/py35-16.log
  /private/tmp/testing$ /private/tmp/testing/.tox/py35/bin/pip freeze >/private/tmp/testing/.tox/py35/log/py35-17.log
py35 installed: py==1.4.34,pytest==3.2.3,Tox-Testing==0.0.0
py35 runtests: PYTHONHASHSEED='3929104870'
py35 runtests: commands[0] | py.test
  /private/tmp/testing$ /private/tmp/testing/.tox/py35/bin/py.test
================================================================================ test session starts ================================================================================
platform darwin -- Python 3.5.2, pytest-3.2.3, py-1.4.34, pluggy-0.4.0
rootdir: /private/tmp/testing, inifile:
collected 1 item

test_env.py F

===================================================================================== FAILURES ======================================================================================
_____________________________________________________________________________________ test_env ______________________________________________________________________________________

    def test_env():
>       assert os.getenv('XYZ') == 123
E       AssertionError: assert None == 123
E        +  where None = <function getenv at 0x1053daae8>('XYZ')
E        +    where <function getenv at 0x1053daae8> = os.getenv

test_env.py:4: AssertionError
============================================================================= 1 failed in 0.11 seconds ==============================================================================
ERROR: InvocationError: '/private/tmp/testing/.tox/py35/bin/py.test'
______________________________________________________________________________________ summary ______________________________________________________________________________________
ERROR:   py35: commands failed

From the doc of setenv it seems it should set the environment variable.

Forehand answered 16/11, 2017 at 15:0 Comment(0)
R
50

setenv must be in [testenv]:

[tox]
envlist = py35

[testenv]
deps=pytest
commands=py.test
setenv =
    XYZ = 123
Romanism answered 16/11, 2017 at 21:49 Comment(3)
I wish to set the same environment variable in all my test envs. Is this not possible to define directly under the [tox] section?Zwinglian
@Zwinglian Under [tox] no. Possible under [testenv] and any other test environment [testenv:*]Romanism
I found a solution to put the declaration under [base] and added an alternative answer.Zwinglian
Z
8

You can make test envs inherit values from [base], according to the docs.

[tox]
envlist =
    test1
    test2

[base]
setenv =
    XYZ = 123

[testenv:test1]
deps=pytest
commands=py.test
setenv =
    {[base]setenv}

[testenv:test2]
deps=pytest
commands=py.test
setenv =
    {[base]setenv}
Zwinglian answered 3/6, 2020 at 9:28 Comment(0)
E
5

You can pass all the einvornment variables to the tests using:

[testenv]
passenv = XYZ
Eury answered 23/3, 2022 at 15:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.