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

时间:2020-06-30 06:18:44

标签: django postgresql heroku heroku-ci

我正在使用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"
      }
    }
  }
}

我在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

1 个答案:

答案 0 :(得分:0)

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

在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中进行。 ew!