【问题标题】:Best practices for getting the most testing coverage with Django/Python?使用 Django/Python 获得最大测试覆盖率的最佳实践?
【发布时间】:2011-08-19 13:23:37
【问题描述】:

我的测试严重不足,我对它们没有很大的信心。使用 Django/Python 获得最大测试覆盖率的最佳实践是什么?我一直在看Freshen 和Lettuce,它们看起来很有前途,但我不能将它们用于所有的事情,对吗?我正在寻求有关如何通过测试构建工作流/项目的建议,以便在生产环境中部署新代码时充满信心。

【问题讨论】:

    标签: python django unit-testing testing code-coverage


    【解决方案1】:

    此外,到目前为止,这一系列文章对测试 django 应用程序有一些很好的建议:

    http://toastdriven.com/blog/2011/apr/10/guide-to-testing-in-django/

    我对答案的唯一批评是不要将所有内容都存储在 tests.py 文件中,而是按照文章的建议进行操作。创建一个tests 目录并通过添加__init__.py 文件并将所有测试用例导入其中将其转换为模块。例如from myapp.tests.views import *。但绝对是合理的建议。必须先走路才能跑……tests!看看我在那里做了什么?

    【讨论】:

    • 虽然我之前选择的最佳答案更全面一些,但我认为您的文章提供了更明确的指导,帮助我更好地理解测试。
    • 这是另一个非常详细的测试驱动教程,涵盖了使用 selenium 进行的 LiveServerTestCase 测试tdd-django-tutorial.com
    【解决方案2】:

    我假设你已经完成了Testing Django Applications。使用正确的帮助工具集,您应该可以使用 Django 测试框架进行默认单元测试。

    为了让您开始测量覆盖率,您可能需要查看 coverage 独立版以了解您已测试的内容。

    安装后,您可以执行以下操作:

    $ coverage run manage.py test *yourapp*
    

    它将为您创建.coverage 文件。您可以使用

    格式化此文件中的数据
    $ coverage report
    

    获取测试覆盖率的完整列表(包括来自其他 python 库的代码)。 您可以轻松地coverage report --omit path 以特定路径开头的模块。此外,您还可以使用-m 选项查看在测试运行期间未执行的行。

    另外,我认为有一个 django_coverage Django 应用程序将 coverage 集成到 Django 项目的测试中。它为您制​​作了漂亮的 HTML 覆盖率报告。

    现在还有其他工具,如斜纹等,可满足特定需求(如 javascript 测试)。

    另外,如果您想详细了解在 Django 下设置 vanilla 测试的详细步骤,您可能需要阅读“Django 1.1 测试和调试”(在 Amazon 上查找)。

    【讨论】:

      【解决方案3】:
      1. 停止编码。

      2. 为您的应用程序应该做的事情编写测试。

      首先,使用内置的 Django 测试。在您的 models.py 中将模型测试编写为 TestCase 类。

      现在就这样做。在进一步阅读之前。立即添加 django.test.TestCase 类来创建、修改和检索模型对象。确保为您定义的每个属性、属性或额外方法都有一个测试方法。

      我会等你完成的。


      模型测试完成了吗?很好。

      现在在每个应用程序中创建一个 tests.py 文件。每一个。全部为空。

      在每个 tests.py 文件中为每个表单创建 django.test.TestCase 类。

      现在就做。创建好的和坏的表格。为每个单独的字段验证问题创建表单。

      不要创建坏数据的所有可能排列。每个单独的验证规则只有一个测试用例。

      现在就这样做。在进一步阅读之前。为每个表单添加django.test.TestCase 类到tests.py。

      我会等你完成的。


      现在,您必须测试每个视图功能。他们也进入了 tests.py 文件。每个视图函数至少有两个测试用例,可能更多,具体取决于您使用的各种装饰器。

      如果一个视图函数需要登录,你有两种情况:登录和未登录。

      如果一个视图函数需要权限,你至少有三种情况:未登录、错误用户登录、正确用户登录。

      现在,您只需要确保视图函数做了一些事情并返回正确的 HTML 模板和任何正确的数据。不要发疯。您只想确保所有视图函数实际上都返回预期的页面。仅此而已。

      现在就这样做。在进一步阅读之前。为每个视图函数添加django.test.TestCase 类到tests.py。

      我会等你完成的。


      这些是您应该在编写任何应用程序代码之前首先编写的测试。

      这将为您提供一个测试基线,以确认您的应用程序将最小化运行。

      当你完成了这些,你可以开始考虑单元测试来反映你的应用程序背后的真正目的和价值。

      【讨论】:

      • 我正在使用这种策略,我看到这种方法的唯一缺陷是(至少,我是)在模型和/或表单中放入过多的业务逻辑会受到鼓励(而不是等待视图层出现并集成一些逻辑),从而使应用程序变得不必要的复杂。
      • @LaundroMat:“模型中的业务逻辑过多”不可能发生。很多业务逻辑属于模型中。将业务逻辑放入模板和表单小部件时会出现问题。
      • @S. Lott - 啊哈,这很有趣。我一直觉得模型应该可以在不同的应用程序中使用,因此不要包含太多的应用程序特定逻辑。有了你所说的,我想我可以把每次我在模型中引入复杂逻辑时的那种不安感放下。谢谢:)
      • @LaundroMat:模型不是 Django 中的重用单元。应用程序——作为一个整体——是重用单元。
      • @S.Lott 当你说要在models.py 中编写测试时,我找不到任何消息来源说测试应该在测试文件夹或tests.py 之外的任何地方。你会说它在models.py 中而不是在测试目录中更好吗?我指的是您的第一步/说明。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2010-09-20
      • 2011-06-29
      • 2020-02-05
      • 1970-01-01
      • 2013-05-07
      • 2017-08-07
      相关资源
      最近更新 更多