【问题标题】:How to run behave-django features in PyCharm?如何在 PyCharm 中运行行为 django 功能?
【发布时间】:2016-12-18 12:53:06
【问题描述】:

背景

我有一个带有单元测试和行为特性的 Django 项目(“api”)。其结构的相关部分是

code/ # i.e. the Django root is not the root of the project
    manage.py
    api/
        settings.py
        # and other Django stuff
    app/
        # Django app stuff
    features/
        environment.py
        steps/
        foo.feature
    virtualenv/

我使用行为-django。 python manage.py behave 有效。

我使用 PyCharm。它被配置为使用项目的 virtualenv。它的 Django 支持是这样配置的:

在 PyCharm 中运行 Django 和运行单元测试可以正常工作。

问题

当我尝试在 PyCharm 中运行一个行为功能时(通过在编辑功能文件并选择行为运行上下文配置时按 control-shift-R)我得到

/Users/dave/data/projects/api/code/virtualenv/bin/python2.7 "/Applications/PyCharm 2016.3.app/Contents/helpers/pycharm/behave_runner.py"
Testing started at 04:31 ...
Traceback (most recent call last):
  File "/Applications/PyCharm 2016.3.app/Contents/helpers/pycharm/behave_runner.py", line 294, in <module>
    _BehaveRunner(my_config, base_dir).run()
  File "/Applications/PyCharm 2016.3.app/Contents/helpers/pycharm/_bdd_utils.py", line 91, in run
    number_of_tests = self._get_number_of_tests()
  File "/Applications/PyCharm 2016.3.app/Contents/helpers/pycharm/_bdd_utils.py", line 211, in _get_number_of_tests
    for feature in self._get_features_to_run():
  File "/Applications/PyCharm 2016.3.app/Contents/helpers/pycharm/behave_runner.py", line 231, in _get_features_to_run
    self.__real_runner.run()
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/behave/runner.py", line 672, in run
    return self.run_with_paths()
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/behave/runner.py", line 678, in run_with_paths
    self.load_step_definitions()
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/behave/runner.py", line 658, in load_step_definitions
    exec_file(os.path.join(path, name), step_module_globals)
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/behave/runner.py", line 304, in exec_file
    exec(code, globals, locals)
  File "code/features/steps/common.py", line 5, in <module>
    from django.contrib.auth.models import User
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/contrib/auth/models.py", line 4, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 52, in <module>
    class AbstractBaseUser(models.Model):
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 53, in AbstractBaseUser
    password = models.CharField(_('password'), max_length=128)
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 1043, in __init__
    super(CharField, self).__init__(*args, **kwargs)
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/db/models/fields/__init__.py", line 166, in __init__
    self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/conf/__init__.py", line 53, in __getattr__
    self._setup(name)
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/conf/__init__.py", line 39, in _setup
    % (desc, ENVIRONMENT_VARIABLE))
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

Process finished with exit code 1

如何在 PyCharm 中以预期的方式运行我的行为功能?

我尝试过的方法不起作用

将运行配置的工作目录设置为.../api/code 并没有什么不同。

上面堆栈跟踪中的建议似乎是假的,因为设置文件是默认文件,我不需要设置 DJANGO_SETTINGS_MODULE 来使任何其他东西在 PyCharm 内外工作,但如果我添加 DJANGO_SETTINGS_MODULE=api.settings我得到的 PyCharm 中的行为运行配置

[some duplicate stack frames removed]
  File "code/features/steps/common.py", line 5, in <module>
    from django.contrib.auth.models import User
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/contrib/auth/models.py", line 4, in <module>
    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 52, in <module>
    class AbstractBaseUser(models.Model):
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/db/models/base.py", line 105, in __new__
    app_config = apps.get_containing_app_config(module)
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/apps/registry.py", line 237, in get_containing_app_config
    self.check_apps_ready()
  File "/Users/dave/data/projects/api/code/virtualenv/lib/python2.7/site-packages/django/apps/registry.py", line 124, in check_apps_ready
    raise AppRegistryNotReady("Apps aren't loaded yet.")
django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

当我在features/environment.py 中运行django.setup()(不是在before_all 中,而是在顶层)时,我会走得更远,但是

  • 测试在我的常规数据库中运行,而不是在临时测试数据库中,并且
  • behave-django 功能(如 context.base_url)不可用,因此某些测试失败。

我怎样才能做到这一点?

【问题讨论】:

标签: python django python-2.7 pycharm python-behave


【解决方案1】:

(披露:我是behave-django的维护者之一,behavior和Django的集成。)

Behave 是一个独立的工具

实际的问题是behave 并不是要了解 Django 并融入其中。它旨在作为外部工具运行。这就是 PyCharm (2016.3.1) 似乎认为理所当然的事情,以及 PyCharm 运行测试时会发生什么。测试的运行就像您从终端运行 behavenot python manage.py behave!)一样。

code/features/steps/common.py,第 5 行,您有一个对 Django(用户模型)的导入,这需要 Django 已经在运行,例如通过管理命令 (runserver)。在behave-django 中,我们需要运行管理命令,以便在到达您的代码之前启动LiveServerTestCase。 Django 将准备就绪,因为我们让它在运行您的代码之前启动一个运行服务器。

如果 behave-django 开箱即用,JetBrains 必须考虑到这一点。

替代集成(部分解决方案)

可以只用behave 集成到Django,不需要behave-django,在environment.py 中增加几行代码。您失去我们集成的一些功能,但您必须在所有项目中复制这种集成方法。

请参阅 behave 文档的 Manual Integration 部分。您可以尝试复制behave-django 的行为,方法是将它的一些code to access the live_server_url 添加到您的测试设置中。

其余的可能取决于 JetBrains。很抱歉有坏消息!

【讨论】:

  • 感谢您的回答和其他跟进。记录在案的行为和 django 的手动集成对我不起作用;我问a new question
  • 这个答案是正确的,所以接受。请参阅my other question,了解如何手动与 Django 集成行为的详细信息。
猜你喜欢
  • 1970-01-01
  • 2017-08-29
  • 2013-12-22
  • 2021-04-02
  • 2021-06-26
  • 2018-01-08
  • 1970-01-01
  • 2020-01-28
  • 2016-08-07
相关资源
最近更新 更多