我希望单个 settings.py文件在运行应用程序时表现不同
./manage.py runserver
和测试时
./manage.py test myapp
因此,我可以将测试数据库更改为sqlite,例如:
if IS_TESTING:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test_db',
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': DATABASE_NAME,
'USER': DATABASE_USER,
'PASSWORD': DATABASE_PASS,
'HOST': 'localhost',
'PORT': '5432',
}
}
我可以通过更改manage.py脚本来实现此行为:
if __name__ == "__main__":
os.environ.setdefault('IS_TESTING', 'false')
print 'off'
if sys.argv[1] == 'test':
print 'on'
os.environ['IS_TESTING'] = 'true'
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "frespo.settings")
from django.core.management import execute_from_command_line
execute_from_command_line(sys.argv)
但我认为这还不够好,因为当我在IDE(PyCharm)中运行测试时,它不会使用我的自定义manage.py文件。 Django里面必须有一个变量。你知道它在哪里吗?
答案 0 :(得分:4)
如果仅为Django单元测试目的而需要此条件,settings.py
文件中的以下行应该有效:
if 'test' in sys.argv:
DATABASES['default']['ENGINE'] = 'django.db.backends.sqlite3'
SOUTH_TESTS_MIGRATE = False # if you're using south
这假定始终声明其他标准DATABASES
设置。在单元测试运行的情况下,上面的行只是将数据库设置为sqlite
。
答案 1 :(得分:0)
Afaik Django没有这样的变量。假设你可以编辑PyCharm运行的确切命令,你可以在那里添加测试参数,然后在settings.py文件中查找它。
if "test-argument" in sys.argv:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': 'test_db',
}
}
else:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': DATABASE_NAME,
'USER': DATABASE_USER,
'PASSWORD': DATABASE_PASS,
'HOST': 'localhost',
'PORT': '5432',
}
}