在运行Django单元测试时强制删除任何先前的测试数据库(autoclobber),例如在PyCharm中

Chr*_*ris 5 python django unit-testing

我正在针对多线程应用程序运行Django单元测试.在单元测试完成时,线程通常没有终止,因此无法删除测试数据库.当我下次运行测试时,我收到消息:

Type 'yes' if you would like to try deleting the test database 'test_appname', or 'no' to cancel`
Run Code Online (Sandbox Code Playgroud)

该选项是我想要的功能,但我该如何使用它?我找不到任何例子或线索.我在PyCharm IDE中工作,这是非常可配置的.我只想每次都默默地删除测试数据库.create_test_db autoclobber

我正在测试Transaction TestCase类,setup_test_environment()然后运行Client().post(reverse(etc ..))..

Dr *_*tan 11

在Pycharm django测试中,您可以启用选项输入并输入 --noinput

看下面的截图

在此输入图像描述

  • 这对我也有效,但是您必须在尝试单独运行的任何单元测试上设置 `--noinput`。好奇如何在项目中的所有测试中设置它。 (2认同)

Maz*_* Mk 6

如果您使用 PyCharm 并希望使用绿色箭头运行单个测试,但不断收到此错误,则可以修改默认的 django 测试配置模板,这样您就不必继续--noinput在每个测试上设置选项。

在此输入图像描述


Chr*_*ris 0

我的答案是创建一个像这样的脚本:

export PGPASSWORD=the_password
if [[ `psql  -h 127.0.0.1 -d postgres -U username -p 5432 -tAc "SELECT 1 FROM pg_database WHERE datname='test_djangoprojectname'"` == "1" ]]
then
    psql -h 127.0.0.1 -d postgres -U username -p 5432 -a -w -c "SELECT pg_terminate_backend(pg_stat_activity.pid) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'test_djangoprojectname' AND pid <> pg_backend_pid();"
    psql -h 127.0.0.1 -d postgres -U username -p 5432 -a -w -c "DROP DATABASE test_djangoprojectname;"
fi
Run Code Online (Sandbox Code Playgroud)
  • -d设置是数据库名称 - 它可以是您的用户有权访问的任何数据库,除了您要删除的数据库。
  • 默认用户名是postgres
  • -p设置是数据库所在的端口 -5432是默认设置。

另存为(例如)del_test_db.sh(Windows 用户见下文),然后

chmod +x del_test_db.sh
Run Code Online (Sandbox Code Playgroud)

然后在 PyCharm 中:

  1. 运行、编辑配置...
  2. 展开默认值,单击 Django 测试
  3. 在启动前窗口中单击 +,在外部工具中单击 +
  4. 在“程序”下,选择您的文件del_test_db.sh,为命令命名(例如“del test db”),然后单击“确定”。
  5. 在列表中选择您的工具,然后单击“确定”
  6. 您可能需要在左侧展开 Django 测试并删除现有的测试配置

然后脚本在每次运行之前强制删除测试数据库。

这适用于 Mac OS X 和 Ubuntu 等。对于 Windows,过程是相同的,除了使用而不是export使用SET,将命令保存为.bat文件而不是.sh,并且您不需要chmod +x,并对 IF 语句使用以下语法批处理文件:

if 'command' == '1' (
    ...
)
Run Code Online (Sandbox Code Playgroud)

抱歉,我无法检查这一点,因为我没有 Windows 计算机。

感谢这个答案的代码检查数据库是否存在。