Django测试框架中的全局设置?

12 投票
3 回答
2989 浏览
提问于 2025-04-15 19:58

有没有什么办法(使用标准的Django.test.TestCase框架)可以全局初始化某些变量,让这个初始化只发生一次呢?

如果把这些变量放在setUp()里,就会在每个测试之前都初始化一次,这样会影响性能,特别是当初始化的过程比较耗时的时候。我希望能有一个类似于初始化的功能,只运行一次,然后这些变量在我的所有测试中都能被使用。

我不想重写测试运行框架。

我想要的功能有点像Ruby/RSpec中的before(:all)。

-S

3 个回答

0

那如果有一个包含静态变量的类呢?就像这样:

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)
3

在更新版本的Python和Django中,部分解决了这个问题,使用setUpClass()方法可以让我在类级别上进行一些准备工作。

4

你不需要“重写整个测试运行框架”,但你需要创建一个自定义的测试运行器(你可以直接复制现有的代码,然后修改它,加入你的全局设置代码)。这大约需要100行代码。接着,把TEST_RUNNER的设置指向你的自定义运行器,这样就可以开始了。

撰写回答