【发布时间】:2010-03-03 19:11:50
【问题描述】:
是否有某种方式(使用标准 Django.test.TestCase 框架)来执行某些变量的全局初始化,以便它只发生一次。
设置 setUp() 可以在每次测试之前初始化变量,当设置涉及昂贵的操作时,这会降低性能。我想运行一次设置类型功能,然后让这里初始化的变量对我的所有测试都是可见的。
我不想重写测试运行器框架。
我正在考虑类似于 Ruby/RSpec 世界中的 before(:all) 的东西。
-S
【问题讨论】:
是否有某种方式(使用标准 Django.test.TestCase 框架)来执行某些变量的全局初始化,以便它只发生一次。
设置 setUp() 可以在每次测试之前初始化变量,当设置涉及昂贵的操作时,这会降低性能。我想运行一次设置类型功能,然后让这里初始化的变量对我的所有测试都是可见的。
我不想重写测试运行器框架。
我正在考虑类似于 Ruby/RSpec 世界中的 before(:all) 的东西。
-S
【问题讨论】:
您不需要“重新编写整个测试运行程序框架”,但您需要创建一个自定义 test_runner(您只需 copy the existing one 并对其进行修改以包含您的全局设置代码)。大约有 100 行代码。然后将TEST_RUNNER 设置为指向您的自定义跑步者,然后离开。
【讨论】:
这在较新版本的 python/django 中由 setUpClass() 部分解决,这至少允许我运行类级别设置。
【讨论】:
带有静态变量的类呢? 类似的东西:
class InitialSetup(object):
GEOLOCATOR = GeoLocator()
DEFAULT_LOCATION = GEOLOCATOR.get_geocode_object(settings.DEFAULT_ADDRESS, with_country=True)
def setUp(self):
self.geolocator = InitialSetup.GEOLOCATOR
self.default_location = InitialSetup.DEFAULT_LOCATION
p = Page.objects.create(site_id=settings.SITE_ID, template='home_page.html')
p.publish()
self.client = Client()
class AccessTest(InitialSetup, Testcase): # Diamond inheritance issue! inheritance order matters
def setUp(self):
super(AccessTest, self).setUp()
def test_access(self):
# Issue a GET request.
response = self.client.get('/')
# Check that the response is 200 OK.
self.assertEqual(response.status_code, 200)
【讨论】: