首页 > 解决方案 > 从不同的python模块访问全局变量意外失败

问题描述

我正在尝试向我的测试添加简单的模拟,使用带有静态字段的类来保存设置(即单例)。当我单独运行测试时这很好用,但当它作为完整测试套装的一部分运行时会失败。

由于某种原因,全局类是 tests.py 模块和测试代码之间的不同对象(尽管是相同的过程)。

IE。这是一个简化的例子:

   # in mock_settings.py
   class MockSettings(object):
       fake_random = False

   # in views.py
   def func(request)
       print(os.getpid(), id(MockSettings))
       if MockSettings.fake_random:
           return HttpResponse('123')
       else:
           return HttpResponse(str(random.randint(1000)))


   # in tests.py
   def test_func(self):
       print(os.getpid(), id(MockSettings))
       MockSettings.fake_random = True
       response = self.client.get('/func')
       self.assertEquals(response.content, '123')  # fails when ran as test suite, works when runs alone

疯狂的事情#1:当我单独运行测试时(例如./manage.py test tests.TestClass.test_func),id(MockSettings)tests.py 和views.py 中的相同,但是当在测试套件中运行时(例如./manage.py test),pid 匹配但类 id 是不同的 - 因此fake_random是不同的......

疯狂的事情#2:当我试图在一个新项目中重现它时,我做不到。当我注释掉我项目中的所有其他测试时,它仍然发生了。

知道为什么吗?

标签: pythondjangounit-testing

解决方案


发布问题后一分钟找到根本原因......

在我使用的测试文件中:

from __future__ import absolute_import  #I'm using python 2.7
from .mock_settings import MockSettings

在我使用的应用程序代码中

from full.path.to.module import MockSettings

显然结果不是同一个对象!我仍然不明白为什么,但我发现如果我在两个模块中都更改为完整路径导入,那么它会按预期工作


推荐阅读