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