#python #django #unit-testing
#python #django #модульное тестирование
Вопрос:
Я пытаюсь настроить среду тестирования django для тестирования скрипта, который мы используем для загрузки данных в наше веб-приложение для визуализации данных. Это «внешнее» по отношению к реальному приложению django, поэтому использование manage.py средство тестирования.
Я следовал инструкциям, найденным в 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
Ответ №1:
Строго говоря, тестовые базы данных предназначены для создания, использования для выполнения модульных тестов, а затем уничтожения. На самом деле это не место для «тестирования» скрипта загрузки данных. Почему бы просто не использовать вашу стандартную базу данных разработчика? Там не должно быть ничего, что вы не могли бы вернуть, создать резервную копию и т.д., И это в значительной степени предназначено для такого рода деструктивного поведения.
Комментарии:
1. Это именно то, чего я хотел бы: база данных, которую можно создать, протестировать, а затем удалить. Скрипты довольно сложные и включают в себя некоторую сложную и потенциально дорогостоящую предварительную обработку. Нам действительно нужно хорошее средство для модульного тестирования компонентов модуля.
Ответ №2:
Насколько я вижу, тестируемый вами модуль все еще использует систему ORM django для чтения базы данных, поэтому в использовании есть что-то неправильное manage.py для запуска вашего теста. Вы можете использовать
./manage.py тестовый анализ_import
запускать только тестовые коды, которые находятся в модуле analysis_import. Таким образом, вы по-прежнему можете запускать только тесты для этого модуля, но при этом избежать проблем с написанием собственного тестового модуля.
Затем дайте нам знать, если у вас все еще та же проблема.
Комментарии:
1. Я попытался запустить
python visualization_project/manage.py test import_scripts.tests.py
, но я получил другую ошибку:django.core.exceptions.ImproperlyConfigured: App with label import_scripts could not be found
2. Обычно я запускаю manage.py в каталоге, в котором она находится. Если это не решит вашу проблему, покажите нам структуру каталогов вашего проекта.
3. Это выглядит как manage.py test ожидает, что тесты будут находиться внутри приложения в django, а у danbaatar, как и у меня, есть скрипты и тесты для них в другом каталоге (где он использует части django, такие как ORM). Было бы неплохо, если бы можно было просто использовать модуль в произвольном месте. IE — используйте это appname (его модели) с этим testcase.