Как использовать tox и py.test, чтобы ограничить модульные тесты поддерживаемыми платформами?

У меня есть небольшой пакет python teno, который я хочу запустить, протестировать и установить в широком диапазоне. версий python, начиная с 2.5 и заканчивая 3.2

Мне нужна поддержка 2.5, потому что у нас все еще есть машины, на которых она работает, и которые еще нельзя обновить.

В настоящее время модульные тесты включены в модули, что упрощает их обновление при изменении модуля, а также их запуск, поскольку main запускает тесты.

Некоторые модули доступны не на всех платформах.

setup.py
setup.cfg
tox.ini
mypackage/foo.py
mypackage/bar.py

Tox настроен для запуска py.test на всех платформах, но раздел [pytest] из setup.cfg настроен на поиск тестов во всех *.py файлах.

Это создает проблему: некоторые из этих файлов не должны работать на py25, и их невозможно настроить для этого.

Я ищу конфигурацию, которая позволила бы мне указать, какие модули загружать (или лучше исключить) для некоторых платформ.

Желаемое поведение - иметь возможность установить этот пакет во всех поддерживаемых версиях python. (Очевидно, следует пропустить несколько модулей).


person sorin    schedule 30.05.2012    source источник


Ответы (2)


Вы можете использовать файлы conftest.py для настройки коллекции тестов. Например, вы можете пропустить setup.py во всех версиях и конкретный модуль на python3 следующим образом:

# content of conftest.py
import sys

collect_ignore = ["setup.py"]
if sys.version_info[0] > 2:
    collect_ignore.append("pkg/module_py2.py")

Если вы поместите этот файл conftest.py рядом с файлом setup.py и получите такой файл модуля:

# content of pkg/module_py2.py
def test_only_on_python2():
    try:
        assert 0
    except Exception, e:
        pass

Затем вы видите с py.test --collectonly в Python2 что-то вроде этого:

$ py.test --collectonly
=========================== test session starts ============================
platform linux2 -- Python 2.7.3 -- pytest-2.2.5.dev1
collecting ... collected 1 items
<Module 'pkg/module_py2.py'>
  <Function 'test_only_on_python2'>

=============================  in 0.01 seconds =============================

Согласно определению conftest.py модуль виден, тогда как под python3 ни module_py2.py, ни setup.py файл не будет собран.

person hpk42    schedule 07.06.2012

Еще один вариант, который предпочитаю лично я:

import os.path
import sys

py3 = sys.version_info[0] >= 3

def pytest_ignore_collect(path, config):
    basename = os.path.basename(str(path))
    return (not py3 and 'py3' in basename) or (py3 and 'py2' in basename)

При добавлении py2 или py3 к тестовым файлам они будут собираться только для тестирования в соответствующих версиях Python.

person Alec Thomas    schedule 09.08.2013