繁体   English   中英

py.test运行Python2和Python3

[英]py.test running Python2 and Python3

我编写了一个可同时在Python2和Python3上运行的包( http://github.com/anntzer/parsedcmd )。 但是,我不得不为Python2和Python3编写单独的(py.test)单元测试(主要是因为我想测试Python3的其他功能,特别是仅关键字参数),所以我有一个test_py2.pytest_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)

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

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,
      )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM