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

时间:2011-05-11 20:43:22

标签: python django unit-testing

我正在尝试设置django测试环境来测试我们用来将数据加载到我们的数据可视化Web应用程序中的脚本。它是实际django应用程序的“外部”,因此使用manage.py测试工具似乎不合适或干净。

我已经跟着the instructions found in the django docs编写了我自己的测试模块,但是当我到达一个实际上试图访问数据库的语句时,我得到一个错误,表示该表不存在。

我还需要做些什么来确保使用所有需要的表创建测试数据库吗?

供参考,以下是我测试用例的代码:

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 :(得分:1)

严格地说,测试数据库旨在创建,用于运行单元测试然后销毁。它们实际上不是“测试”数据加载脚本的地方。为什么不使用标准的dev数据库呢?那里不应该有任何你无法取回的东西,备份等等,而且它几乎是为这种破坏性行为而设计的。

答案 1 :(得分:0)

据我所知,您正在测试的模块仍然使用django的ORM系统来读取数据库,因此使用manage.py来运行测试有任何问题。你可以使用

  

./ manage.py test analysis_import

仅运行驻留在analysis_import模块中的测试代码。这样,您仍然可以只运行此模块的测试,但避免编写自己的测试模块的麻烦。

如果您仍然遇到同样的问题,请告诉我们。