运行 在 Heroku CI 上进行 Django 测试时出现错误

Getting Error when running Django Test on Heroku CI

我正在使用 DRF,测试是为 API 编写的。我想 运行 在 heroku 上进行那些测试,并在我的开发环境管道中使用 CI。

当在配置中使用默认的 SQLlite 数据库时,我得到的错误是 -

通常 Django 会使用到 'postgres' 数据库的连接,以避免在不需要时(例如,运行ning 测试时)对生产数据库进行 运行ning 初始化查询. Django 无法创建与 'postgres' 数据库的连接,将改用第一个 PostgreSQL 数据库。

我的代码和配置

test_*.py

class TestUser(APITestCase):
    def setUp(self):
        ...

    def test_user(self):
    ...

base.py 文件

db_config = dj_database_url.config(conn_max_age=600, ssl_require=False)
DATABASES_AVAILABLE = {
    'test': db_config,
    'sqlite': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
}

database = os.environ.get('DJANGO_DATABASE_TEST', 'sqlite')
DATABASES = {
    'default': DATABASES_AVAILABLE[database]
}

# Database Configuration Ends
django_heroku.settings(locals())

在 Heroku CI 配置中,我有

DJANGO_DATABASE_TEST : test

app.json

{
  "buildpacks": [{ "url": "heroku/python" }],
  "environments": {
    "test": {
      "env": { "POSTGRESQL_VERSION": "10" },
      "addons": ["heroku-postgresql:in-dyno"],
      "scripts": {
        "test": "./manage.py migrate && ./manage.py  test"
      }
    }
  }
}

我进入 heroku 时出错 ci

django.db.utils.OperationalError: server does not support SSL, but SSL was required

更新 1:

django_heroku.settings(locals())


db_config = dj_database_url.config(conn_max_age=600, ssl_require=False)
DATABASES_AVAILABLE = {
    'test': db_config,
    'sqlite': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    },
}

database = os.environ.get('DJANGO_DATABASE_TEST', 'sqlite')
DATABASES = {
    'default': DATABASES_AVAILABLE[database]
}

如果我将 django_heroku.settings(locals(), databases=True) 移动到 DATABASE 之前,则会出现此错误

psycopg2.errors.UndefinedObject: role "postgres" does not exist

我引用的资源 -

  1. https://github.com/heroku/django-heroku/issues/17, 2) https://devcenter.heroku.com/articles/heroku-postgresql, 3) https://devcenter.heroku.com/articles/sqlite3

经过大量实验和阅读,我有一个解决方案

在 Django 中创建了不同的环境文件 - developproductionsci

ci环境下我没有包含django_heroku.settings(locals()),只添加了以下配置

DEBUG = True
APPEND_SLASH = True
SECURE_SSL_REDIRECT = False

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres_buildpack_db',
    }
}

并在 app.json 文件中

{
  "buildpacks": [{ "url": "heroku/python" }],
  "environments": {
    "test": {
      "env": { "POSTGRESQL_VERSION": "10" },
      "addons": ["heroku-postgresql:in-dyno"],
      "scripts": {
        "test-setup": "./manage.py migrate && ./manage.py createsuperuser --noinput --username='admin' --email='admin@admin.com'",
        "test": "./manage.py migrate"
      }
    }
  }
}

django_heroku.settings(locals()) 正在将 Db SLL 连接设置为 true,而 indyno db 不支持 SSL,因此在 CI env.

中将其删除

最后在 Heroku-CI 中完成所有测试 运行。呸!