Python 如何使用tox和py.test将单元测试限制在受支持的平台上?

Python 如何使用tox和py.test将单元测试限制在受支持的平台上?,python,setuptools,pytest,tox,Python,Setuptools,Pytest,Tox,我有一个小的python包,我想让它在各种python版本上运行、测试和安装,从2.5开始,到3.2结束 我需要2.5支持,因为我们还有运行它的机器,而且还不能升级 目前单元测试包含在模块中,这使得在更改模块时更新单元测试和运行单元测试变得更容易,因为main将运行测试 有些模块并非在所有平台上都可用 setup.py setup.cfg tox.ini mypackage/foo.py mypackage/bar.py Tox配置为在所有平台上运行py.test,但是setup.cfg中的[

我有一个小的python包,我想让它在各种python版本上运行、测试和安装,从2.5开始,到3.2结束

我需要2.5支持,因为我们还有运行它的机器,而且还不能升级

目前单元测试包含在模块中,这使得在更改模块时更新单元测试和运行单元测试变得更容易,因为main将运行测试

有些模块并非在所有平台上都可用

setup.py
setup.cfg
tox.ini
mypackage/foo.py
mypackage/bar.py
Tox配置为在所有平台上运行
py.test
,但是
setup.cfg
中的
[pytest]
部分配置为在所有
*.py
文件中查找测试

这带来了一个问题:其中一些文件不应该在
py25
上运行,因此不可能对它们进行调优

我正在寻找一种配置,它可以让我为某些平台指定要加载(或更好地排除)哪些模块

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

理想的行为是能够在所有受支持的python版本上安装此软件包。(显然应该跳过几个模块)。

您可以使用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")
# content of pkg/module_py2.py
def test_only_on_python2():
    try:
        assert 0
    except Exception, e:
        pass
$ 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文件放在setup.py文件旁边,并具有如下模块文件:

# content of conftest.py
import sys

collect_ignore = ["setup.py"]
if sys.version_info[0] > 2:
    collect_ignore.append("pkg/module_py2.py")
# content of pkg/module_py2.py
def test_only_on_python2():
    try:
        assert 0
    except Exception, e:
        pass
$ 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 =============================
然后您可以看到Python2下的
py.test--collectonly
,如下所示:

# content of conftest.py
import sys

collect_ignore = ["setup.py"]
if sys.version_info[0] > 2:
    collect_ignore.append("pkg/module_py2.py")
# content of pkg/module_py2.py
def test_only_on_python2():
    try:
        assert 0
    except Exception, e:
        pass
$ 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 =============================
$py.test--仅限收集
========================================测试会话开始============================
平台linux2--Python2.7.3--pytest-2.2.5.dev1
收集。。。收集1项
================================================================在0.01秒后=============================
根据conftest.py定义,可以看到模块
在python3下,既不会收集
模块_py2.py
也不会收集
setup.py
文件。

还有另一个选项,我个人更喜欢:

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版本下进行测试