如何确保夹具只在django 1.9中为所有测试用例加载一次?

时间:2016-07-03 18:41:57

标签: python django unit-testing testing

我正在研究我的项目的测试用例,我将使用fixture来获取数据。整个项目的夹具非常大(大约20 MB)。由于该项目涉及多个应用程序,所以我希望在运行测试时夹具只加载一次。在每个测试用例上指定fixture并使用keepdb标志不是很好,并且所有测试都需要很多时间。你能否为此建议一个好的解决方法,以便加快速度。我也跟着这个post,但是它没有使用django 1.9。

添加了样本测试 App1 / tests.py

from django.test import TestCase
class App1View1TestCase(TestCase):
    fixtures = [
        'fixtures/app_fixture.json',
    ]
class App1View2TestCase(TestCase):
    fixtures = [
        'fixtures/app_fixture.json',
    ]
class App1View3TestCase(TestCase):
    fixtures = [
        'fixtures/app_fixture.json',
    ]

App2 / tests.py

from django.test import TestCase
class App2View1TestCase(TestCase):
    fixtures = [
        'fixtures/app_fixture.json',
    ]
class App2View2TestCase(TestCase):
    fixtures = [
        'fixtures/app_fixture.json',
    ]
class App2View3TestCase(TestCase):
    fixtures = [
        'fixtures/app_fixture.json',
    ]

每个测试用例都有超过5个测试。

1 个答案:

答案 0 :(得分:1)

加速夹具加载。

首先,您需要将夹具作为CSV。如果您已经安装了CSV序列化程序,那么您很幸运。或者使用psql或pgadmin连接并创建CSV转储并跳过下一位。

要从现有灯具中创建CSV,只需进行一项测试,-k标记为manage.py test,与--keepdb相同,如下所示:

 ./manage.py test -k myapp.test.App2View1TestCase.test_something

现在,您已使用所有表格创建了测试数据库。

在settings.py DATABASES部分添加一个条目,指向测试数据库(通常是您的数据库名称前缀为test)。现在manage.py loaddata来自你的装备。然后,您需要打开psql控制台并将该数据转储为CSV COPY TO。你需要为每张桌子做这件事。

我知道这听起来像是很多工作,但你只需要做一次。但好的,我们如何加载它?覆盖setUpTestData方法并添加如下代码:

@classmethod
def setUpTestData(cls):
    cursor = connection.cursor()
    cursor.execute("COPY table(fields) FROM dump_file.csv")

你会发现这比使用loaddata要快得多(由fixtures = []完成),并且一旦加载了fixture,它将被类中的所有测试使用。

对所有测试用例使用相同的夹具

不是覆盖setUpTestData,而是覆盖setUpClass

@classmethod
def setUpClass(cls):

    if not MyModel.objects.count():
        cursor = connection.cursor()
        cursor.execute("COPY table(fields) FROM dump_file.csv")

    super(TestCase, cls).setUpClass()

免责声明:我自己没有使用过这种方法。