我有一个简单的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模块。
答案 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
导入该模块。