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

标签 python django unit-testing testing

我正在为我的项目编写测试用例,我必须使用夹具来获取数据。对于整个项目来说,fixture 相当大(大约 20 MB)。由于该项目涉及多个应用程序,因此我希望在运行测试时只加载一次夹具。在每个测试用例上指定固定装置以及使用 keepdb 标志效果不佳,并且所有测试都需要花费大量时间。您能否为此提出一个好的解决方法,以便我加快速度。我也关注了这个post但它不适用于 django 1.9。

添加了示例测试 App1/测试.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/测试.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 个以上的测试。

最佳答案

加快夹具加载速度。

首先,您需要 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 控制台并使用 COPY TO 将该数据转储为 CSV。 .您需要为每个表执行此操作。

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

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

您会发现这比使用 loaddata(通过 fixtures = [] 完成的)快得多,并且一旦加载了夹具,它就会被类中的所有测试使用。

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

不是覆盖 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()

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

关于python - 如何确保 django 1.9 中的所有测试用例只加载一次夹具?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38173200/

相关文章:

javascript - 消耗promise的Sinonjs测试方法

javascript - 如何将 Python 脚本整合到我的网站中?我需要一个框架吗?

python - 使用 Python 创建一个简单的网页,其中模板内容是根据查询从数据库(或 pandas 数据框)填充的

django - django : raise an error similar to EmailField

python - 将 ImageField 的内容复制到 Django 中的新文件路径

php - 使用 vfsStream 将文件插入特定目录/节点

python - CPython 交互式 readline — 更好的向后删除单词

python - 如何在较小的范围内绘图

python - Kmeans 不知道簇的数量?

ruby-on-rails - 模拟时遇到问题 `Resolv::DNS.open`