如何使用tox和pytest将单元测试限制在支持的平台上?

时间:2012-05-30 12:23:47

标签: python setuptools pytest tox

我有一个小的python包tendo,我想让它在各种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版本上安装此软件包。 (显然应该跳过几个模块)。

2 个答案:

答案 0 :(得分: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

然后你在Python2下看到py.test --collectonly就像这样::

$ 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.pysetup.py文件。

答案 1 :(得分:0)

另一种选择,我个人更喜欢:

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)

py2py3添加到测试文件中只会收集它们以便在各自的Python版本下进行测试。