2

我确实有一个小的 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]from 部分仍配置为在所有文件setup.cfg中查找测试。*.py

这带来了一个问题:其中一些文件不应该在上面运行,py25并且不可能为此调整它们。

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

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

4

2 回答 2

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.pynor文件。setup.py

于 2012-06-07T10:35:59.967 回答
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 版本下进行测试。

于 2013-08-09T04:47:27.613 回答