2012-10-07 37 views
0

时,我想有一个 settings.py文件中运行的应用Django的变量测试

./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

听起来很像http://stackoverflow.com/questions/4088253/django-how-to-detect-test-environment –

+0

相同的解决方案确实如此。对不起,关于那个:-) –

回答

3

如果你只需要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

如果DEBUG: 是一个常用的用法。 – eusid

+0

@eusid您可能会发现在单元测试期间设置了'DEBUG = False'的人可以加速它们,例如[here](http://www.daveoncode.com/2013/09/23/effective-tdd-tricks-to速-UP-django的检验向上到10X-更快/)。 –

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',      
     } 
    }