单元测试-在Python单元测试框架中修改全局变量



我正在Python中进行一系列单元测试,其中一些测试取决于配置变量的值。这些变量存储在全局Python配置文件中,并在其他模块中使用。我想为配置变量的不同值编写单元测试,但还没有找到实现这一点的方法。

我不可能重写我正在测试的方法的签名。

这就是我想要实现的目标:

from my_module import my_function_with_global_var
class TestSomething(self.unittest):
    def test_first_case(self):
         from config import MY_CONFIG_VARIABLE
         MY_CONFIG_VARIABLE = True
         self.assertEqual(my_function_with_global_var(), "First result")
    def test_second_case(self):
         from config import MY_CONFIG_VARIABLE
         MY_CONFIG_VARIABLE = False
         self.assertEqual(my_function_with_global_var(), "Second result")

谢谢。

编辑:使示例代码更加明确。

您可能想要模拟那些全局变量。这样做的好处是,一旦完成,全局变量就会被重置。Python附带了一个嘲讽模块,可以让您做到这一点。

unittest.mock.patch用作装饰器:

class TestSomething(self.unittest):
    @patch('config.MY_CONFIG_VARIABLE', True)
    def test_first_case(self):
         self.assertEqual(my_function_with_global_var(), "First result")

您也可以将其用作上下文管理器:

    def test_first_case(self):
        with patch('config.MY_CONFIG_VARIABLE', True):
            self.assertEqual(my_function_with_global_var(), "First result")

如果可以的话,请使用@Flimm的答案中的unittest.mock.patch


原始答案

不要这样做:

from my_module import my_function_with_global_var

但是这个:

import my_module

然后,您可以将MY_CONFIG_VARIABLE注入到导入的my_module中,而无需像那样更改测试中的系统

class TestSomething(unittest.TestCase): # Fixed that for you!
    def test_first_case(self):
         my_module.MY_CONFIG_VARIABLE = True
         self.assertEqual(my_module.my_function_with_global_var(), "First result")
    def test_second_case(self):
         my_module.MY_CONFIG_VARIABLE = False
         self.assertEqual(my_module.my_function_with_global_var(), "Second result")

我在回答"如何模拟pyunit的stdin输入?"时做了类似的操作。

您的代码将MY_CONFIG_VARIABLE导入到本地作用域,然后立即用不同的对象覆盖名称。这不会改变config模块中的值。尝试

import config
config.MY_CONFIG_VARIABLE = False

相反。

相关内容

  • 没有找到相关文章

最新更新