独立py.test(忽略__init__.py文件)

时间:2015-01-02 19:00:47

标签: python python-2.7 pytest

我有一个简单的python模块(我们称之为M1),它是一个独立的(唯一导入到collections),在包含丑陋的包中。丑陋的一部分在包的__init__.py文件中。但是M1非常干净,并且包含一些与py.test一起使用的测试函数。

现在,我想测试M1并忽略所有的丑陋。但py.test希望运行__init__.py - 有什么方法可以防止这种情况吗?我此时无法修复__init__.py文件,我想要保持我的测试功能与M1模块内容本身一起包含。

我已经阅读了这个问题:`py.test` and `__init__.py` files解释了这个问题但没有解决方案。


我的__init__.py文件看起来像这样;它只是将项目推广到包装范围:

from .M1 import CleanThing1, CleanThing2
from .Evil1 import UglyThing1, UglyThing2

问题是Evil1模块需要一些PYTHONPATH hackery来正确执行,当我运行时

py.test mymodule/M1.py

由于Evil1模块而失败。但我现在只想测试M1模块。

2 个答案:

答案 0 :(得分:2)

您可以按照here所述使__init__.py文件知道py.test。

所以基本上创建一个包含以下内容的mymodule/conftest.py文件

def pytest_configure(config):
    import sys
    sys._called_from_test = True

def pytest_unconfigure(config):
    del sys._called_from_test

并在__init__.py文件中,只需检查您是否在py.test会话中,如

import sys
if hasattr(sys, '_called_from_test'):
    # called from within a test run
    pass
else:
    # failing imports
    from .M1 import CleanThing1, CleanThing2
    from .Evil1 import UglyThing1, UglyThing2

这样我可以在没有导入错误的情况下运行py.test mymodule/M1.py

包结构现在看起来像(我希望它类似于你的结构)

package
   |   
   |- __init__.py
   |- mymodule/
         |- M1.py
         |- conftest.py  

答案 1 :(得分:0)

它不是想要运行__init.py__的py.test,而是Python解释器。执行__init__.py的规则是Python语言定义的一部分,任何解决方法都必然是黑客攻击。

在这种情况下,我建议您对自己的存根Evil1模块进行definte,然后让M1导入该模块。