将存储过程加载到Django单元测试数据库中的最佳方法是什么?

时间:2017-02-16 18:30:16

标签: django postgresql unit-testing selenium stored-procedures

我有一些Postgres存储过程,我的selenium测试将依赖它。在开发中,我在脚本中加载了一行:

cat stored_procedures.sql | python manage.py dbshell

在单元测试时,这不起作用,因为从头开始创建新数据库。如何在运行单元测试之前将保存在文件中的存储过程加载到测试数据库中?

2 个答案:

答案 0 :(得分:4)

我认为你没有办法做到这一点。在我看来,最好的解决方案 - 使用自定义SQL添加迁移。将来,您不仅需要在开发过程中进行迁移,还需要在生产阶段进行迁移。因此,如果您在几个地方将更改存储到DB,那么部署过程就不明确了。

其他方式 - 只是将SQL的执行添加到testCase的setUp方法。

其他迁移

您应该创建一个新的空迁移./manage.py makemigrations --empty myApp

将您的SQL代码添加到operations列表

operations = [ migrations.RunSQL('RAW SQL CODE') ]

答案 1 :(得分:1)

对此的另一种解决方案是创建一个管理命令,该命令执行所需的SQL查询,然后仅在测试开始时执行此命令。 下面是我的情况: 管理命令:

import os
from django.core.management import BaseCommand
from django.db import connection

from applications.cardo.utils import perform_query
from backend.settings import BASE_DIR


class Command(BaseCommand):
    help = 'Loads all database scripts'

    def handle(self, **options):
        db_scripts_path = os.path.join(BASE_DIR, 'scripts', 'database_scripts')
        utils_path = os.path.join(db_scripts_path, 'utils.sql')
        with open(utils_path, mode='r') as f:
            sql_query = f.read()
            with connection.cursor() as cursor:
                cursor.execute(sql_query)

现在您可以转到终端并输入

python manage.py load_database_scripts

脚本将被加载。

具有这样的帮助功能

def load():
    with django_db_blocker.unblock():
        call_command('load_database_scripts')

您只需在测试套件运行之前调用此加载功能。