Django单元测试失败的Travis CI构建

时间:2018-06-11 20:56:51

标签: django python-3.x travis-ci

我有一个非常基本的Django应用程序(Python 3.6.4),我已经编写了一个本地传递的单元测试。内存中SQLite DB(默认情况下)为测试创建。当我的Travis CI构建运行相同的测试时,测试通过但测试命令失败并出现以下错误:

File "/home/travis/virtualenv/python3.6.5/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py", line 301, in execute
    return Database.Cursor.execute(self, query)
django.db.utils.OperationalError: near "SCHEMA": syntax error

The command "python manage.py test --settings=myapp.dev_settings" exited with 1.

我注意到一个奇怪的事情是,当测试在Travis上运行时,它说它重用现有数据库并且在测试运行后从不销毁它:

$ python manage.py test --settings=myapp.dev_settings

将现有测试数据库用于别名'默认' ...

我真的没有,因为它应该是内存数据库,当我在本地运行它时,每次都会创建一个新的数据库:

Creating test database for alias 'default'... 
. . .
Destroying test database for alias 'default'... 

我的dev_settings.py文件在文件系统上有一个sqlite db,但它仅用于运行本地开发服务器:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

Travis会安装所有依赖项,并且它们与我的本地环境相匹配(我非常肯定)。

任何帮助都会很棒,我在这里肯定会遗漏一些明显的东西!!!

3 个答案:

答案 0 :(得分:1)

@LaSmell是正确的(我有同样的问题)。这是因为您试图访问构建中的Heroku依赖项。

但是我仍然可以向您展示如何实施解决方案。

您需要做三件事才能解决此问题。

1-指定不带django-heroku的新需求文档

我亲自制作了另一个文件,名为requirements-build.txt,除了 django-heroku == 0.3.1

以外,它具有所有相同的依赖项。

我只是将其删除。

2-在.travis.yml

中指定新的需求文件

在.travis.yml文件中,只需替换

install:
  - pip install -r requirements.txt

使用

install:
  - pip install -r requirements-build.txt

3-在您的settings.py文件中说明这些更改

要确保未导入heroku-django,请确保是否可以首先导入它。我做到了:

# Try to import django-heroku depending on Travis or Heroku
try:
    # Configure Django App for Heroku.
    import django_heroku
    django_heroku.settings(locals())
except ImportError:
    found = False

这样,如果已安装,它将仅使用django-heroku。由于默认情况下,Heroku使用requirements.txt,因此此补丁可以正常运行。

希望这会有所帮助!我花了一段时间才自己搞定。

答案 1 :(得分:1)

这是因为Django-Heroku软件包设置了自己的Test Runner,如果它检测到CI环境,则可以对数据库进行额外的处理,大概是为了迎合其Heroku CI产品:

 # Enable test runner if found in CI environment.
 if 'CI' in os.environ:
     config['TEST_RUNNER'] = 'django_heroku.HerokuDiscoverRunner'

测试运行程序执行以下操作,该操作不适用于SQLite:

with connection.cursor() as cursor:
    cursor.execute(
        """
            DROP SCHEMA public CASCADE;
            CREATE SCHEMA public;
            GRANT ALL ON SCHEMA public TO postgres;
            GRANT ALL ON SCHEMA public TO public;
            COMMENT ON SCHEMA public IS 'standard public schema';
        """
    )

不幸的是,此检查还检测到非Heroku CI环境(例如Travis或GitLab CI),并尝试使用上述配置。

您可以通过在settings.py中禁用Heroku测试运行程序来解决此问题:

# Configure Django App for Heroku.
django_heroku.settings(locals(), test_runner=False)

答案 2 :(得分:0)

在travis构建的堆栈跟踪中,我注意到正在执行的意外包:

  File "/home/travis/virtualenv/python3.6.5/lib/python3.6/site-packages/django_heroku/core.py", line 41, in teardown_databases
self._wipe_tables(connection)

问题是我正在使用包含Heroku(部署)特定代码的settings.py文件执行我的测试:

import django_heroku
import dj_database_url

# Parse database configuration from Heroku's $DATABASE_URL (Postgres)
DATABASES = {
    'default': dj_database_url.config(conn_max_age=500, ssl_require=True)
}

# Activate Django-Heroku (DATABASE_URL and all that).
django_heroku.settings(locals())

我的requirements.txt文件中的依赖项:

django-heroku==0.3.1

一旦我从Travis构建配置中删除了所有Heroku配置,构建就会通过!

仍然不确定我是如何在本地看到这种失败的。

相关问题