2012-04-27 147 views
8

我已经写了一包(http://github.com/anntzer/parsedcmd)与两个Python2和Python3运行。但是,我不得不写Python2和Python3(主要是因为我想测试Python3额外的功能,特别是仅关键字参数)分开(py.test)单元测试,所以我有一个test子包一test_py2.pytest_py3.py 。现在,如果我跑步,说py.test2 mypkgtest_py2通过,但test_py3失败,SyntaxError。同样,对于py.test3 mypkgtest_py3通行证但test_py2失败(我能做出这样一个工作,虽然,这只是已经搬到ioStringIO的问题)。py.test运行Python2和Python3

我可以设计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“只是工作”?

谢谢。

回答

5

如果您可以将所有模块导入到所有解释器中,并根据需要跳过测试,这是一种常见解决方案。否则,你可以把下面的“conftest.py”到test目录:

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

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, 
    ) 
相关问题