django - 何时以及为什么我应该在 Django 网络应用程序中从功能性 Selenium 测试切换到单元测试?

标签 django testing selenium tdd functional-testing

我正在开发 Django 网站。我使用 Selenium 进行功能测试(从最终用户的角度来看)并进行 TDD。我还对我的所有模型进行基本的单元测试。

我通常会编写一个新的功能性 Selenium 测试(例如,用于提交表单并检查更新是否存在)然后编写一些大量代码以使测试通过。我创建了一个 View 、一些表单、模型方法、模板等。毕竟,测试通过了,我继续进行下一个 Selenium 测试。

问题是这种方法感觉并不完全正确。也许我也应该编写更多的单元测试,所以这里是问题:

  1. 如果功能测试似乎可以完成任务,为什么还需要单元测试?请注意,我的 Selenium 测试是完全自动化的,并通过 Jenkins CI 进行管理,因此管理许多功能测试并在每次提交后运行它们没有问题。
  2. 我应该对应用的哪些部分进行单元测试?

附言 好书Test-Driven Development with Python Harry Percival(可免费在线获取)建议您使用以下工作流程:

testing workflow

最佳答案

我现在同时使用 selenium 和单元测试,以下是我的一些想法:

单元测试比 selenium 场景测试运行得更快。 单元测试比 selenium 场景测试更容易编写。 单元测试比 selenium 场景测试更精细。 单元测试没有 selenium 场景测试那么脆弱。

与设计为在不到一秒内运行的单元测试相比,我的 selenium 测试往往会在几分钟内运行(它们有几页长)。我必须花很多时间为特定的 selenium 测试设置环境然后运行它,然后检查整个环境是否处于正确的状态。为了测试稍微不同的场景,例如,如果有人为一个字段输入了错误的值会发生什么,我必须从头开始。

另一方面,单元测试,尤其是一些巧妙的模拟,不需要整个环境。为给定的方法或函数设置所需的输入,运行方法或函数,然后测试输出。他们往往需要更少的“设置”来使其正常运行。

单元测试也比 selenium 测试更不脆弱。 selenium 测试不仅非常依赖于您正在测试的内容,而且还依赖于网页本身的结构。对 View 层的 HTML 进行修改,您就有机会破坏许多 Selenium 测试。因为单元测试包含更多内容,所以它们较少依赖许多其他因素,例如 View 层的确切结构。

一般来说,我从单元测试开始,然后使用我的 selenium 测试进行更广泛的测试,而不是为每个场景编写 selenium 测试。

关于django - 何时以及为什么我应该在 Django 网络应用程序中从功能性 Selenium 测试切换到单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18003592/

相关文章:

Django : Formset as form field

WPF 和 ICUTest 单元测试

java - 使用多个 Java 工具链运行 Gradle 测试

python - Ruby on Rails 是否与 Google Code API 配合得很好?

python - Django 查询查找具有大于零的特定值的行数,按用户分组

python - Django - 同一张表上的两个不同的连接语句

maven - 在 Maven 中有条件地运行集成测试

angularjs - 在 Protractor 测试中从 localStorage 中删除项目

python - 如果类名是数字,则无法按类名获取元素

python - selenium python 检查隐藏错误