结束2结束测试足够吗?

Bor*_*sky 8 javascript testing tdd unit-testing angularjs

我的问题主要是关于测试方法.我在一个实施TDD(测试驱动开发)的组织工作.我们正在使用AngularJS,因此它的完整测试堆栈 - 用于单元测试的Jasmine和用于e2e测试的Protractor.

在开发特征时,我们的过程首先编写失败的e2e测试,然后使用TDD编写特征.测试仅针对公共方法编写(无论是控制器/指令/服务).它自己的产品不包含任何复杂的逻辑(除了几个例外).最近我们开始讨论这样一个事实,即为控制器编写单元测试是没有意义的,因为它们暴露了功能,100%暴露在视图中并且无论如何都使用e2e测试进行了测试.基本上 - 单元测试和e2e测试是重叠的.起初我们都同意了,但随后这个决定打开了潘多拉盒子.毕竟,关于指令也可以说同样的事情.那么为什么要测试它们呢?然后出现了服务问题.他们中的大多数(98%)只是进行后端呼叫并返回响应.那么为什么不简单地模拟httpBackend并在测试控制器时测试服务,这些控制器是通过e2e测试的.

你得到漂移......

我确实看到了进行单元测试和e2e测试的好处,尽管它们实际上是重叠的.主要是 - 即时反馈和"可执行文档".你在练什么?您是否看到其他好处并且是"值得挤压的果汁" - 为了获得上述两个好处,是否值得为最简单的实施编写重叠测试?

Ste*_*e U 4

这是一个很大的话题,并不能真正有权威的答案,但我会尽力涵盖几点。

首先,您应该考虑测试的目的。根据敏捷测试象限,单元测试的存在主要是为了支持团队。它们通常是在接近产品的情况下编写的(例如,使用 TDD,可能是由开发人员自己编写的),并且可以增强开发人员的信心,让他们相信最后的更改没有破坏任何内容。有了这种信心,开发人员就可以高效地工作并用鲁莽的 abadon 进行重构——TDD 梦想。单元测试不能回答“这是否适合我们客户的目的”的问题,但这不是它们存在的原因。

功能测试(e2e,如果我理解你的描述)仍然支持团队快速周转测试结果,但实际上确实开始回答“用户可以做这件事吗?”的问题。您正在测试用户所看到的内容,并开始以对用户有意义的方式测试您的实际产品。

第三象限和第四象限开始解决产品是否做得很好的问题(即它是否适合目的而不仅仅是功能),但这是另一个主题。

基于对测试的理解,部分答案取决于您的团队结构。你们有独立的开发和测试团队吗?如果是这样,那么您的开发人员编写单元测试(毕竟是为了他们的利益)以及测试团队独立处理其他象限(包括编写他们认为合适的 e2e)可能是有意义的。如果您的测试和开发团队是相同的?如果您可以从功能/e2e 测试中获得与单元测试类似的周转时间(编写的测试 -> 有用的结果),那么专注于它们并在不重叠的情况下获得两种方法的回报可能是有意义的。

我给出的简短答案是简单地问“我们从这次测试中得到什么好处?”。如果您发现测试答案重叠,则删除冗余可能是有意义的。

这里讨论了上面的一些观点以及其他一些观点,所以我现在不再胡言乱语。