【问题标题】:Force delete of any previous test database (autoclobber) when running Django unit tests, eg, in PyCharm在运行 Django 单元测试时强制删除任何以前的测试数据库(autoclobber),例如在 PyCharm 中
【发布时间】:2015-12-12 19:44:44
【问题描述】:

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

Type 'yes' if you would like to try deleting the test database 'test_appname', or 'no' to cancel`

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

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

【问题讨论】:

    标签: python django unit-testing


    【解决方案1】:

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

    请看下面的截图

    【讨论】:

    • 我很难记住细节,但我尝试了这个选项(请参阅我的答案below),但仍然得到了提示。
    • 这对我也有用,但是您必须在尝试单独运行的任何单元测试上设置--noinput。好奇如何在项目中的所有测试上设置它。
    【解决方案2】:

    如果您以其他方式使用刷新(例如,在预先存在的开发数据库like here 上),--noinput 选项会抑制用户提示,例如:

    from django.core.management import call_command
    call_command('flush', '--noinput')
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        我的回答是创建这样的脚本:

        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
        
        • -d 设置是数据库名称 - 它可以是您的用户有权访问的任何数据库,您要删除的数据库除外。
        • 默认用户名是postgres
        • -p 设置是您的数据库所在的端口 - 5432 是默认值。

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

        chmod +x del_test_db.sh
        

        然后在 PyCharm 中:

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

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

        这适用于 Mac OS X 和 Ubuntu 等。对于 Windows,过程是相同的,除了使用 SET 代替 export,将命令另存为 .bat 文件而不是 .sh,然后你不需要'不需要chmod +x,在批处理文件中的IF语句使用如下语法:

        if 'command' == '1' (
            ...
        )
        

        抱歉,因为我没有 Windows 机器,所以无法检查。

        感谢this answer提供代码检查数据库是否存在。

        【讨论】:

          猜你喜欢
          • 2019-01-15
          • 2017-01-19
          • 2013-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-23
          • 1970-01-01
          • 2010-12-11
          相关资源
          最近更新 更多