运行 在 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
我引用的资源 -
经过大量实验和阅读,我有一个解决方案
在 Django 中创建了不同的环境文件 - develop
、productions
、ci
。
在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 中完成所有测试 运行。呸!
我正在使用 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
我引用的资源 -
经过大量实验和阅读,我有一个解决方案
在 Django 中创建了不同的环境文件 - develop
、productions
、ci
。
在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 中完成所有测试 运行。呸!