【问题标题】:Custom coverage test runner doesn't create DB自定义覆盖测试运行器不创建数据库
【发布时间】:2013-07-17 14:23:47
【问题描述】:

我正在使用 Django 创建一个 Rest 应用程序。
我目前正在对我的应用程序进行单元测试,而不是做coverage source=="." manage.py test myapp --settings="mycustomsettings",我决定创建一个脚本来启动我的测试并使用自定义conf文件和覆盖结果运行它们。 这是我的树:

|-- apps
|   |-- __init__.py
|   |-- me_api
|   |-- me_auth
|   |-- me_core
|   |-- me_import
|   `-- me_payment
|-- manage.py
|-- settings.py
|-- settings.pyc
|-- tests
|   |-- coveragerunner.py
|   |-- geodjango.db
|   |-- __init__.py
|   |-- local_settings.py
|   `-- settings.py
|-- urls.py
`-- urls.pyc

我想测试 apps/ 文件夹中的应用。 这是我的代码(在 tests/coveragerunner.py 中)

import os
import sys
from coverage import coverage

sys.path.append(os.path.join(os.path.dirname(__file__), "../"))
os.environ['DJANGO_SETTINGS_MODULE'] = 'tests.settings'

def main():
    """
    Run tests and generates a coverage report.
    """
    cov = coverage()
    cov.erase()
    cov.start()

    from django.conf import settings
    from django.test.utils import get_runner

    TestRunner = get_runner(settings)
    test_runner = TestRunner()
    failures = test_runner.run_tests(['me_api'])

    cov.stop()

if __name__ == '__main__':
    main()

我使用 geodjango.db 作为我的默认测试数据库,它是一个空间数据库。 我的脚本采用 django 的设置,但是当我运行它时,数据库似乎是空的。我不会自行同步数据库。

DatabaseError: no such table: me_auth_emailuser

有没有办法告诉 django 在运行测试之前同步数据库,或者我做错了什么?谢谢。

PS:当我使用 manager.py 时,数据库没有问题。 (即使有空间数据库和不同的设置源)

【问题讨论】:

  • 你在运行测试之前做了同步数据库吗?
  • 因为它使用另一个数据库,所以当我运行 syncdb 时,它会同步 postgresql 数据库而不是 spatialite。如果我可以同步这个数据库,我会的。或者也许我不知道如何同步另一个数据库。

标签: database django unit-testing


【解决方案1】:

一个快速而肮脏的解决方案如下:

  1. 将数据库引擎设置为 sqlite,也用于非测试。
  2. 制作一个同步数据库来为测试数据库创建一个模板。
  3. 现在测试应该可以工作了。
  4. 不要忘记将数据库引擎设置回 postgesql。

【讨论】:

  • 我认为在运行测试时,会创建数据库,不是吗?它询问我是否要删除数据库或取消操作。
  • 要正确创建测试数据库,测试运行者需要一个“真实”数据库作为模板。这必须与测试数据库采用相同的格式(例如 lighthttpd)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-09
  • 2018-11-02
  • 2018-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多