【问题标题】:Django variable that is true when testing测试时为真的 Django 变量
【发布时间】:2012-09-28 02:37:49
【问题描述】:

我想要一个 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 中必须有一个变量。你知道它在哪里吗?

【问题讨论】:

标签: python django testing


【解决方案1】:

如果您仅出于 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

【讨论】:

  • 如果 DEBUG: 是一种常见用法。
  • @eusid 你可能会发现有人在单元测试期间设置了DEBUG=False 以加快测试速度,例如here
【解决方案2】:

Afaik Django 没有这样的变量。假设您可以编辑 PyCharm 运行的确切命令,您只需在其中添加 test 参数,然后在 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',                      
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多