py.test运行Python2和Python3

ant*_*ony 8 python pytest python-3.x

我编写了一个与Python2和Python3一起运行的包(http://github.com/anntzer/parsedcmd).但是,我不得不写Python2和Python3分开(py.test)单元测试(主要是因为我想测试Python3额外的功能,特别是仅关键字参数),所以我有一个test_py2.pytest_py3.py一个test子包.现在,如果我跑,比方说py.test2 mypkg,test_py2传球,但test_py3失败了SyntaxError.同样地,对于py.test3 mypkg,test_py3传递但test_py2失败(我可以使这个工作,但这只是一个StringIO移动的问题io).

我可以设计test子包,以便import mypkg.test只导入正确版本的测试,但显然py.test并不关心 - 它只是看到两个文件匹配test_*并抓取它们中的所有测试,忽略了__init__.py告诉他导入的内容.

所以现在我需要做的两py.test2 mypkg/test/test_py2.pypy.test3 mypkg/test/test_py3.py.有没有一种方法来建立整个事情让py.test2 mypkgpy.test3 mypkg会"只是工作"?

谢谢.

hpk*_*k42 5

如果您可以在所有解释器上导入模块,并且适当地跳过测试是一种常见的解决方案.否则,您可以将以下内容作为"conftest.py"放入测试目录中:

import sys
py3 = sys.version_info[0] >= 3

class DummyCollector(pytest.collect.File):
   def collect(self):
      return []

def pytest_pycollect_makemodule(path, parent):
  bn = path.basename 
  if "py3" in bn and not py3 or ("py2" in bn and py3):
     return DummyCollector(path, parent=parent)
Run Code Online (Sandbox Code Playgroud)

这将获取一个项目特定的插件,并将正确忽略一个测试模块,其中包含错误解释器版本上包含"py2"或"py3"子字符串的文件名.当然你可以改进它,而不是直接在conftest.py文件中有一个显式列表,而不是检查文件名等.pp.

HTH,holger