如何在pytest中进行全局补丁?

10 浏览
0 Comments

如何在pytest中进行全局补丁?

我在我的代码中经常使用pytest。示例代码结构如下。整个代码库是python-2.7

core/__init__.py
core/utils.py
#feature
core/feature/__init__.py
core/feature/service.py
#tests
core/feature/tests/__init__.py
core/feature/tests/test1.py
core/feature/tests/test2.py
core/feature/tests/test3.py
core/feature/tests/test4.py
core/feature/tests/test10.py

service.py的内容大致如下:

from modules import stuff
from core.utils import Utility
class FeatureManager:
    # 其他很多方法
    def execute(self, *args, **kwargs):
        self._execute_step1(*args, **kwargs)
        # 更多的代码
        self._execute_step2(*args, **kwargs)
        utility = Utility()
        utility.doThings(args[0], kwargs['variable'])

feature/tests/*中的所有测试最终都使用core.feature.service.FeatureManager.execute函数。然而,我在运行测试时不需要运行utility.doThings()。我需要它在生产应用程序运行时发生,但不希望在运行测试时发生。

我可以在core/feature/tests/test1.py中这样做:

from mock import patch
class Test1:
   def test_1():
       with patch('core.feature.service.Utility') as MockedUtils:
           exectute_test_case_1()

这样可以工作。但是我刚刚添加了Utility到代码库中,我有300多个测试用例。我不想进入每个测试用例并编写这个with语句。

我可以编写一个conftest.py,根据其设置一个操作系统级环境变量,根据该变量,core.feature.service.FeatureManager.execute可以决定不执行utility.doThings,但我不知道这是否是解决此问题的干净解决方案。

如果有人能帮我解决全局修补整个会话的问题,我将不胜感激。任何关于这个问题的文章也会很好。

TLDR:如何在运行pytest时创建会话范围的修补程序?

0