使用 AWS RDS 的 Django `TransactionTestCase` 测试用例非常慢

Posted

技术标签:

【中文标题】使用 AWS RDS 的 Django `TransactionTestCase` 测试用例非常慢【英文标题】:Django `TransactionTestCase` test cases with AWS RDS are very slow 【发布时间】:2017-11-16 06:47:59 【问题描述】:

我正在尝试设置 Django 测试以使用 AWS RDS 作为 Postgres 数据库后端(测试在 Heroku CI 上执行,不允许您创建和销毁测试数据库)。测试正在运行,但使用 TransactionTestCase 的测试用例非常慢(有时长达一分钟,而不使用 RDS 时只有几分之一秒)。我在与我的 Heroku 部署(欧盟/爱尔兰)相同的区域使用 RDS,并且基于 TestCase 类的测试用例照常运行。 有什么想法可能导致这种情况吗?

【问题讨论】:

【参考方案1】:

TransactionTestCaseTestCase 相比非常慢。我已经开始从TestCase 继承,然后将每个 celery 和 db 调用块放入 transaction.atomic(): 块中,并在该块之外进行查询和断言。您获得TestCase 的速度。

例子:

with transaction.atomic():
    Foo.objects.create(...)
    Bar.objects.get_or_create(...)
self.assertEqual(Foo.objects.count(), 1)
self.assertTrue(Bar.objects.first().trueproperty)

【讨论】:

以上是关于使用 AWS RDS 的 Django `TransactionTestCase` 测试用例非常慢的主要内容,如果未能解决你的问题,请参考以下文章

Django/PostgreSQL 全文搜索 - 在 AWS RDS PostgreSQL 上使用 SearchVector 与 SearchVectorField 时的不同搜索结果

如何通过 eb cli (django postgres) 迁移 AWS RDS 数据库?

markdown AWS EC2 Apache + RDS Postgresqlで(geo)djangoで动かすまで

Elastic Beanstalk 未创建 RDS 参数

aws rds proxy参数

我们可以使用 AWS 胶水分析 RDS 数据库并使用 ETL 将分析的数据存储到 rds mysql 表中吗