高级UI与直接TDD不兼容。
使用XP实践来指导你。
盲目地遵循TDD(甚至BDD)对于UI来说是不明智的,值得思考这两种实践的根本目标。特别是,我们要避免使用通用的TDD工具来进行UI测试。它们根本没有为这种用例而设计,你最终会将自己绑定在必须像UI代码一样快速迭代的测试上(我称之为UI测试锁定)。
这不是TDD的目的。我们不是为了变慢而这么做,我们是为了更快地前进(并且不破坏任何东西!)。
我们想通过TDD实现以下几点:
- 代码/算法正确性
- 完成测试所需的最小代码量
- 快速反馈
- 将关注点分离到单元(模块化的被测试部分,不多不少)
- 以有用/可用的方式规范化说明书
- 在某种程度上,记录模块/系统的功能(例如提供使用示例)。
我们可以在UI开发中实现这些目标,但如何以及在哪里应用实践是避免测试锁定的重要因素。
将这些原则应用于UI
测试UI有什么好处?我们如何避免测试锁定。
通常的TDD的一个主要好处是,我们可以考虑抽象概念,并设计测试主题的形状,就像我们考虑名称、关系等一样。
对于UI来说,我们想做的很多事情,特别是如果它不是微不足道的,只有当我们可以在屏幕上看到它的表现时,才能有效地进行推理。
编写描述我们期望在UI中看到的内容的测试,特别是数据的测试,可以进行TDD测试。例如,如果我们有一个视图应该显示一个账户余额,一个测试,期望它出现在可以通过某种形式的ID进行寻址的屏幕元素中,是很好的。我们将知道我们的应用程序/视图正在显示预期的内容,在标准UI库元素中。
另一方面,如果我们想创建一个更复杂的UI,并希望将TDD应用于它,我们会遇到一些问题。很可能,如果它足够新颖,我们甚至不知道如何编码它。
为此,我们将使用能够快速反馈但不需要先编写测试的工具进行原型设计和迭代。当我们达到实现清晰的阶段时,我们可以切换到先测试再编写生产代码。
这样可以保持我们的速度。团队中的设计师和产品负责人也可以看到结果,提供意见和调整。
代码应该是良好的形式。一旦我们确定了可能成为生产代码的小部分,我们就可以将它们迁移到测试下。使用TCR或类似方法添加测试,或者简单地使用TDD方法进行重写。记住,一旦它运行正常,您可以应用快照/录制回放测试来避免回归错误。
做有效的事情,保持简单。
附录
关于上述 UI 范围的注释
在任何高级 UI 中,需要找出如何使事情按预期工作。还有可能规格会以极其武断/反复无常的方式发生变化和调整。我们需要确保对这些测试对象应用的任何测试都是灵活的,或者基于工作模型极易重新生成。(回放测试对此非常重要。)
简而言之,良好的开发实践就是代码分离。这将帮助您确保代码至少是可测试的,并且更容易进行调试、维护和推理。
不要成为仪式的奴隶。
这并不能让你正确。只会让你变得更慢。