我正在使用DRF,并且测试是针对API编写的。我想在heroku上运行这些测试,并在开发环境的管道中使用CI。
在配置中使用默认的SQLlite数据库时,出现的错误-
通常,Django将使用与“ postgres”数据库的连接,以避免在不需要生产数据库时(例如,在运行测试时)对生产数据库运行初始化查询。 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"
}
}
}
}
django.db.utils.OperationalError: server does not support SSL, but SSL was required
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
答案 0 :(得分:0)
经过大量的实验和阅读,我有一个解决方案
在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中进行。 ew!