Как заставить tox уважать версию системы при запуске тестов?

У меня есть код, в котором логика управления изменяется на основе python2 vs python3. Я также использую tox, чтобы проверить это, когда понял:

  • tox не использует правильный sys.version_info.major для тестов, он использует любую версию python, которую вы использовали при запуске команды tox

Ниже может быть показан MVCE с тремя файлами в одном каталоге:

setup.py

from setuptools import setup
if __name__ == '__main__':
    setup(name='throwaway')

dev_requirements.txt

nose

tox.ini

[tox]
envlist=py{27,3.6}
[testenv]
deps=-rdev_requirements.txt
commands=
   nosetests 

test_versions.py

import sys
import unittest


class tester(unittest.TestCase):

    def test_version(self):
        self.assertEqual(2, sys.version_info.major)

Этот тестовый пример должен давать сбой при запуске с настройкой python3.6, однако, когда он запускается с помощью команды tox:

$python --version
Python 2.7.13
$tox
GLOB sdist-make: /Users/username/tmp/toxtesting/setup.py
py27 create: /Users/username/tmp/toxtesting/.tox/py27
py27 installdeps: -rdev_requirements.txt
py27 inst: /Users/username/tmp/toxtesting/.tox/dist/throwaway-0.0.0.zip
py27 installed: appdirs==1.4.3,nose==1.3.7,packaging==16.8,pyparsing==2.2.0,six==1.10.0,throwaway==0.0.0
py27 runtests: PYTHONHASHSEED='3463719492'
py27 runtests: commands[0] | nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.002s

OK
py3.6 create: /Users/username/tmp/toxtesting/.tox/py3.6
py3.6 installdeps: -rdev_requirements.txt
py3.6 inst: /Users/username/tmp/toxtesting/.tox/dist/throwaway-0.0.0.zip
py3.6 installed: appdirs==1.4.3,nose==1.3.7,packaging==16.8,pyparsing==2.2.0,six==1.10.0,throwaway==0.0.0
py3.6 runtests: PYTHONHASHSEED='3463719492'
py3.6 runtests: commands[0] | nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.001s

OK
___________________________________________________________________________________ summary ____________________________________________________________________________________
  py27: commands succeeded
  py3.6: commands succeeded
  congratulations :)

person enderland    schedule 10.05.2017    source источник


Ответы (2)


При запуске с Python2.7 tox будет использовать эту среду для всех своих конфигураций (как показано в примере).

Однако, если tox запускается с использованием среды python3:

$python --version
Python 3.6.0

$tox 
GLOB sdist-make: /Users/username/tmp/toxtesting/setup.py
py27 create: /Users/username/tmp/toxtesting/.tox/py27
py27 installdeps: -rdev_requirements.txt
py27 inst: /Users/username/tmp/toxtesting/.tox/dist/throwaway-0.0.0.zip
py27 installed: appdirs==1.4.3,nose==1.3.7,packaging==16.8,pyparsing==2.2.0,six==1.10.0,throwaway==0.0.0
py27 runtests: PYTHONHASHSEED='595957228'
py27 runtests: commands[0] | nosetests
.
----------------------------------------------------------------------
Ran 1 test in 0.003s

OK
py3.6 create: /Users/username/tmp/toxtesting/.tox/py3.6
py3.6 installdeps: -rdev_requirements.txt
py3.6 inst: /Users/username/tmp/toxtesting/.tox/dist/throwaway-0.0.0.zip
py3.6 installed: appdirs==1.4.3,nose==1.3.7,packaging==16.8,pyparsing==2.2.0,six==1.10.0,throwaway==0.0.0
py3.6 runtests: PYTHONHASHSEED='595957228'
py3.6 runtests: commands[0] | nosetests
F
======================================================================
FAIL: test_version (test_versions.tester)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/username/tmp/toxtesting/test_versions.py", line 8, in test_version
    self.assertEqual(2, sys.version_info.major)
AssertionError: 2 != 3

----------------------------------------------------------------------
Ran 1 test in 0.003s

FAILED (failures=1)
ERROR: InvocationError: '/Users/username/tmp/toxtesting/.tox/py3.6/bin/nosetests'
___________________________________________________________________________________ summary ____________________________________________________________________________________
  py27: commands succeeded
ERROR:   py3.6: commands failed

будет видно ожидаемое поведение, где sys.version_info является правильным между версиями python2.7 и python3.6.

person enderland    schedule 10.05.2017

Попробуйте ввести «36» вместо «3,6» в имени env. Если это не помогает объявить basepython для ваших сред:

[testenv]
basepython =
    py27: python2.7
    py36: python3.6

Добавьте команду для отображения версии Python:

commands =
    {envpython} --version

Обычно я добавляю команду в [testenv] и вызываю ее из любого другого раздела теста следующим образом:

[testenv]
…
commands =
    {envpython} --version

[mytest]
commands =
    {[testenv]commands}
    … other test commnds …
person phd    schedule 23.05.2017