【发布时间】:2011-08-19 13:23:37
【问题描述】:
我的测试严重不足,我对它们没有很大的信心。使用 Django/Python 获得最大测试覆盖率的最佳实践是什么?我一直在看Freshen 和Lettuce,它们看起来很有前途,但我不能将它们用于所有的事情,对吗?我正在寻求有关如何通过测试构建工作流/项目的建议,以便在生产环境中部署新代码时充满信心。
【问题讨论】:
标签: python django unit-testing testing code-coverage
我的测试严重不足,我对它们没有很大的信心。使用 Django/Python 获得最大测试覆盖率的最佳实践是什么?我一直在看Freshen 和Lettuce,它们看起来很有前途,但我不能将它们用于所有的事情,对吗?我正在寻求有关如何通过测试构建工作流/项目的建议,以便在生产环境中部署新代码时充满信心。
【问题讨论】:
标签: python django unit-testing testing code-coverage
此外,到目前为止,这一系列文章对测试 django 应用程序有一些很好的建议:
http://toastdriven.com/blog/2011/apr/10/guide-to-testing-in-django/
我对答案的唯一批评是不要将所有内容都存储在 tests.py 文件中,而是按照文章的建议进行操作。创建一个tests 目录并通过添加__init__.py 文件并将所有测试用例导入其中将其转换为模块。例如from myapp.tests.views import *。但绝对是合理的建议。必须先走路才能跑……tests!看看我在那里做了什么?
【讨论】:
我假设你已经完成了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 上查找)。
【讨论】:
停止编码。
为您的应用程序应该做的事情编写测试。
首先,使用内置的 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。
我会等你完成的。
这些是您应该在编写任何应用程序代码之前首先编写的测试。
这将为您提供一个测试基线,以确认您的应用程序将最小化运行。
当你完成了这些,你可以开始考虑单元测试来反映你的应用程序背后的真正目的和价值。
【讨论】:
models.py 中编写测试时,我找不到任何消息来源说测试应该在测试文件夹或tests.py 之外的任何地方。你会说它在models.py 中而不是在测试目录中更好吗?我指的是您的第一步/说明。