8

我编写了一个包(http://github.com/anntzer/parsedcmd),它可以同时运行 Python2 和 Python3。但是,我不得不为 Python2 和 Python3 编写单独的 (py.test) 单元测试(主要是因为我想测试 Python3 的额外功能,特别是仅关键字参数),所以我在子包中有 atest_py2.py和 a 。现在,如果我运行,比如说,通过,但失败了。同样,对于,通过但失败(尽管我可以使这个工作,这只是移至的问题)。test_py3.pytestpy.test2 mypkgtest_py2test_py3SyntaxErrorpy.test3 mypkgtest_py3test_py2StringIOio

我可以设计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正常工作”?

谢谢。

4

2 回答 2

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 文件中显示一个列表,而不是检查文件名 etc.pp。

HTH,霍尔格

于 2012-05-23T20:12:42.190 回答
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,
      )
于 2012-04-29T18:04:14.653 回答