【问题标题】:Functional tests in Django reusable appsDjango 可重用应用程序中的功能测试
【发布时间】:2014-04-01 13:31:43
【问题描述】:

我正在编写一个 Django 可重用应用程序。它不是一个可以单独使用的普通应用程序。它需要其他应用程序才能使用,就像 django.contrib.admin 或 django-dajaxice 一样。

我当前的项目树如下所示:

django-myapp/
    docs/
        some.rst
        docs.rst
        ...
    myapp/
        static/
            myapp/
                some_js_stuff.js
        templatetags/
            some_file.py
        __init__.py
        base.py
        manager.py
        ...
    unit_tests/
        __init__.py
        test_base.py
        test_manager.py
    functional_tests/
        __init__.py
        functional_tests.py
        urls.py
    README.rst
    LICENSE
    requirements.txt
    requirements-test.txt
    setup.py
    ...

单元测试很简单——我只是在测试我的代码,所以我不需要完整的 Django 环境来运行它们。简单的./setup.py test 完美运行。

功能测试是棘手的部分。我想使用 selenium,所以我需要运行开发服务器,这需要整个 Django 环境。我正在尝试使用django.test.LiveServerTestCase,但没有成功(看起来没有定义url,在settingsurls 类中设置ROOT_URLCONF 属性没有帮助)。

我找到的每一个文档,stackoverflow 上的每个问题都讲述了在 Django 项目中测试 Django 应用程序。这是我的问题:在不设置完整的 Django 项目的情况下运行可重用应用程序的功能/集成测试的最佳(和有效)方法是什么?

【问题讨论】:

  • 我假设您有一个可以正常工作的本地开发版本? LiveServerTestCase 本质上需要一个工作的开发环境,但它会使用一个测试数据库并为它运行的每个测试执行标准设置/拆卸。很难对没有功能的东西进行功能测试。

标签: django testing selenium integration-testing


【解决方案1】:

作为Nathan says,很难在没有堆栈的情况下测试整个堆栈中的单元。所以你必须有一个设置文件。看看优秀的django-debug-toolbar 应用是如何做到的:

它有一个 Makefile 和一个 test_selenium 规则:

test_selenium:
    DJANGO_SELENIUM_TESTS=true DJANGO_SETTINGS_MODULE=tests.settings \
        django-admin.py test tests

在它的tests 模块中,它有一个基本的settings.py 和基本的必需品:

  • INSTALLED_APPS 正在测试的应用程序
  • ROOT_URLCONF 指向 urls.py
  • MIDDLEWARE_CLASSES 这样的东西,可能会跳过,因为你没有。

还有一个test_integration.py

@skipUnless('DJANGO_SELENIUM_TESTS' in os.environ, "selenium tests not requested")
class DebugToolbarLiveTestCase(LiveServerTestCase):
    ...

研究他们的设置。从 Makefile 开始,深入挖掘,确保你理解为什么所有东西都在那里。

我喜欢这种设置,因为集成/功能测试往往很慢。可以理解的是,他们测试了整个堆栈及其所有移动部件。他们的 Makefile 提供了一种简单的方法来跳过它们。如果我有一个使用 Javascript 的可重用应用程序,我也会看看 。或一些other tool 对javascript 进行单元测试。因为运行缓慢的集成测试只是为了查看 js 单元是否工作很痛苦。

【讨论】:

  • 谢谢@Chris。这正是我一直在寻找的 :) 我知道我需要对 Django 堆栈进行最少的初始化,但我不知道如何正确地做到这一点。我尝试了自定义测试运行程序或在我的功能测试模块中设置堆栈,但没有成功。
猜你喜欢
  • 2017-04-30
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2012-03-14
  • 2020-06-26
  • 2017-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多