我编写了一个与Python2和Python3一起运行的包(http://github.com/anntzer/parsedcmd)。但是,我必须为Python2和Python3编写单独的(py.test)单元测试(主要是因为我想测试Python3的额外功能,特别是关键字参数),所以我有一个test_py2.py
和一个{ {1}} test_py3.py
子包中的{1}}。现在,如果我跑,说test
,py.test2 mypkg
通过,但test_py2
失败并带有test_py3
。同样地,对于SyntaxError
,py.test3 mypkg
次传递但test_py3
失败(我可以使这个失败,这只是test_py2
转移到StringIO
的问题)
我可以设计io
子包,以便test
只导入正确版本的测试,但显然py.test并不关心 - 它只看到两个匹配{{1}的文件并且在两个测试中抓取所有测试,忽略import mypkg.test
告诉他导入的内容。
所以现在我必须同时执行test_*
和__init__.py
。有没有办法设置整个事情,以便py.test2 mypkg/test/test_py2.py
和py.test3 mypkg/test/test_py3.py
“只是工作”?
感谢。
答案 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,
)