我编写了一个同时与Python2和Python3一起运行的包(http://github.com/anntzer/parsedcmd)。但是,我不得不为Python2和Python3编写单独的(py.test)单元测试(主要是因为我想测试Python3的其他功能,特别是仅关键字参数),所以在test_py2.py
子包中有一个test_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.py
和py.test3 mypkg/test/test_py3.py
。有没有办法设置整个内容,以便py.test2 mypkg
和py.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/