我有一个使用多个数据库的django项目。我使用django-nose作为测试跑步者。使用夹具将测试数据加载到默认数据库。我有第二个数据库不是由django模型管理的,我想在测试之前使用原始sql创建一个结构并加载一些数据。
有什么办法以某种方式干净的方式吗?
谢谢。
答案 0 :(得分:2)
Ht Stathis,
这是我的场景以及我是如何解决它的 - YMMV ..
1)我构建了一个testrunner并覆盖了setup_databases方法。我需要这样做,因为我想在外部创建这个数据库。我们有自定义表和功能。我实际上使用相同的代码和一个小偏差
class IManageTestRunner(DjangoTestSuiteRunner):
"""This is a 3 line addition to the original method"""
def setup_databases(self, **kwargs):
from django.db import connections, DEFAULT_DB_ALIAS
### Skipped for brevity ###
for signature, (db_name, aliases) in dependency_ordered(test_databases.items(), dependencies):
# Actually create the database for the first connection
connection = connections[aliases[0]]
old_names.append((connection, db_name, True))
test_db_name = connection.creation.create_test_db(self.verbosity, autoclobber=not self.interactive)
# Our little hack...
if db_name == "bugs":
create_IManage_instance(django_created_sql = True, mysql_db = "test_bugs",
arg = value, arg2 = value )
# End of our little hack..
for alias in aliases[1:]:
connection = connections[alias]
### Skipped for brevity ###
2)将其添加到settings.py中
TEST_RUNNER = 'IManageTestRunner'
3)一旦创建了这个,我就知道我的测试数据库已经创建了。然后我会创建外部填充的测试并根据它测试结果。
def test_add_property_value(self):
"""Test set / get a value"""
# This will do some external process which occcurs to the db.
pm = Pm(mysql_db='test_bugs', p4_port = settings.ICMSERVER_TEST_PORT)
pmsite, pmproject, pmvariant, pmlibtype, pmlibrary, pmrelease = pm.add_release_tree()
prop_type, pmvalue = ("string", "Funny Business")
pmproperty = "%s_%s_basic" % (pmproject.name, prop_type)
pm.add_property_definition(pmproperty, prop_type=prop_type)
pm.add_propval(pmproperty, value=pmvalue, project=pmproject.name)
# Now use Django to pull the value back out..
project = Project.objects.get(name=pmproject.name)
property = project.get_property(pmproperty)
self.assertEqual(pmvalue, property.value)
希望这有助于我花一些时间来弄明白。我还有一个问题(做重复插入/查询..)