我编写了一个同时与Python2和Python3一起运行的包(http://github.com/anntzer/parsedcmd)。但是,我不得不为Python2和Python3编写单独的(py.test)单元测试(主要是因为我想测试Python3的其他功能,特别是仅关键字参数),所以在test_py2.py子包中有一个test_py3.pytest 。现在,如果我运行,请说py.test2 mypkgtest_py2通过,但是test_py3失败,显示SyntaxError。同样,对于py.test3 mypkgtest_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可以“正常工作”?

谢谢。

最佳答案

然后,如果可以使您的模块可在所有解释器上导入,并适本地跳过测试,则是常见的解决方案。否则,您可以将以下内容作为“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)

这将获得一个特定于项目的插件,并将正确地忽略测试模块,该模块的文件名包含在错误的解释器版本上的“py2”或“py3”子字符串。当然,您可以对其进行优化,以使其直接在conftest.py文件中具有一个显式列表,而不用检查文件名etc.pp。

霍尔格(Holger)

关于python - py.test运行Python2和Python3,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10347178/

10-12 18:32