py.test运行Python2和Python3

时间:2012-04-27 08:19:02

标签: python python-3.x pytest

我编写了一个与Python2和Python3一起运行的包(http://github.com/anntzer/parsedcmd)。但是,我必须为Python2和Python3编写单独的(py.test)单元测试(主要是因为我想测试Python3的额外功能,特别是关键字参数),所以我有一个test_py2.py和一个{ {1}} test_py3.py子包中的{1}}。现在,如果我跑,说testpy.test2 mypkg通过,但test_py2失败并带有test_py3。同样地,对于SyntaxErrorpy.test3 mypkg次传递但test_py3失败(我可以使这个失败,这只是test_py2转移到StringIO的问题)

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

所以现在我必须同时执行test_*__init__.py。有没有办法设置整个事情,以便py.test2 mypkg/test/test_py2.pypy.test3 mypkg/test/test_py3.py“只是工作”?

感谢。

2 个答案:

答案 0 :(得分: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)

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

HTH,holger

答案 1 :(得分:0)

您可以将测试放在不同的包中,并仅在相应的包中运行测试。或者您可以在脚本中加载适当的测试模块:

import sys, unittest

cur_version = sys.version_info

if cur_version[0] < 3:
   import myApp.test.test_py2
   unittest.TestLoader().loadTestsFromModule(myApp.test.test_py2).run()
else:
   import myApp.test.test_py3
   unittest.TestLoader().loadTestsFromModule(myApp.test.test_py3).run()

或者,使用setup.py文件,以便运行:

python setup.py test

并将版本控制逻辑放在那里:

versionedTestSuite = "parsedcmd.test.test_py2" # do something as above here
setup(name='parsedcmd',
      ...
      test_suite=versionedTestSuite,
      )