使用测试数据库测试Django数据库操作脚本

1 投票
2 回答
1296 浏览
提问于 2025-04-16 17:28

我正在尝试设置Django的测试环境,以测试我们用来将数据加载到数据可视化网页应用中的一个脚本。这个脚本是“外部”的,不在实际的Django应用里面,所以用manage.py的测试功能似乎不太合适,也不太干净。

我按照Django文档中的说明写了自己的测试模块,但当我执行一个实际访问数据库的语句时,出现了一个错误,提示某个表不存在。

我还需要做些什么,才能确保测试数据库创建时包含所有需要的表呢?

作为参考,这里是我的测试案例的代码:

import os
import sys

sys.path.append(os.curdir)
os.environ['DJANGO_SETTINGS_MODULE'] = 'visualization_app.settings'
from django.utils import unittest
from django.test.utils import setup_test_environment
from topic_modeling import settings

# The module to be tested
import analysis_import

setup_test_environment()

class CreateAnalysisTestCase(unittest.TestCase):

    def test_analysis_creation(self):
        self.assertTrue(analysis_import.create_analysis('a_name', 'a description'))

if __name__ == '__main__':
    unittest.main()

我遇到的错误看起来是这样的:

ERROR: test_analysis_creation (__main__.CreateAnalysisTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "import_scripts/tests.py", line 20, in test_analysis_creation
    self.assertTrue(analysis_import.create_analysis('a_name', 'a description'))
  File "/home/dan/programmingProjects/topical_guide/import_scripts/analysis_import.py", line 117, in create_analysis
    Analysis.objects.get(name=name, dataset=dataset)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/db/models/manager.py", line 132, in get
    return self.get_query_set().get(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/db/models/query.py", line 344, in get
    num = len(clone)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/db/models/query.py", line 82, in __len__
    self._result_cache = list(self.iterator())
  File "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/db/models/query.py", line 273, in iterator
    for row in compiler.results_iter():
  File "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/db/models/sql/compiler.py", line 680, in results_iter
    for rows in self.execute_sql(MULTI):
  File "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/db/models/sql/compiler.py", line 735, in execute_sql
    cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/db/backends/util.py", line 34, in execute
    return self.cursor.execute(sql, params)
  File "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/db/backends/sqlite3/base.py", line 234, in execute
    return Database.Cursor.execute(self, query, params)
DatabaseError: no such table: visualize_analysis

2 个回答

0

根据我所看到的,你正在测试的模块仍然使用Django的ORM系统来读取数据库,所以用manage.py来运行你的测试是没有问题的。你可以使用

./manage.py test analysis_import

这样只会运行位于analysis_import模块中的测试代码。通过这种方式,你可以只运行这个模块的测试,而不需要麻烦地自己写一个测试模块。

然后如果你还有同样的问题,请告诉我们。

1

严格来说,测试数据库是用来创建的,目的是运行单元测试,然后再删除。它们其实并不是用来“测试”数据加载脚本的地方。那为什么不直接用你平常的开发数据库呢?在那个数据库里应该没有什么是你不能恢复的,或者没有备份的东西,而且它基本上就是为了这种会破坏数据的操作而设计的。

撰写回答