我有一个小的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版本上安装此软件包。 (显然应该跳过几个模块)。
答案 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.py
和setup.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)
将py2
或py3
添加到测试文件中只会收集它们以便在各自的Python版本下进行测试。