结束 2 结束测试是否足够?

Is end 2 end testing enough?

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

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

你明白了....

我确实看到同时进行单元测试和端到端测试的好处,尽管它们实际上是重叠的。主要是——即时反馈和"executable documentation"。 你在练什么?您是否看到其他好处并且 "juice worth the squeeze" - 是否值得为最简单的实现编写重叠测试以获得上述两个好处?

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

首先,您应该考虑测试的目的。根据 Agile Testing Quadrants,单元测试的存在主要是为了支持团队。它们通常是在接近产品的情况下编写的(例如,使用 TDD,可能由开发人员自己编写),并有助于增加开发人员的信心,即他们在最后一次更改中没有破坏任何东西。有了这种信心,开发人员可以高效地工作并不计后果地进行重构——这就是 TDD 的梦想。单元测试不回答问题 "Is this fit for our customer's purpose",但这不是它们存在的原因。

功能测试(e2e,如果我理解你的描述)仍然支持团队快速周转测试结果,但实际上确实开始回答问题 "Can a user do the thing?"。您正在测试用户看到的内容,并开始以对用户有意义的方式测试您的实际产品。

第 3 和第 4 象限开始解决产品是否(即它是否适合目的而不仅仅是功能),但这是另一个主题.

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

我给出的简短回答是直接问 "What benefit are we getting out of this test?"。如果您发现测试的答案重叠,删除冗余可能是有意义的。

上面的一些要点和其他一些要点已经讨论过了here,所以我现在就不再啰嗦了。