在我们公司,我们通常会确保为我们的网站/ Web应用程序编写一个端到端测试。这意味着我们访问一个URL,填写一个表单,将该表单提交到另一个URL并检查页面结果。我们这样做是为了测试表单验证,测试HTML模板是否具有正确的上下文变量等。
我们还使用它间接测试基础逻辑。
一位同事告诉我,这样做的原因是,只要端到端测试通过,我们就可以随时淘汰和更改基础实现。
我想知道这种解耦是否有意义,或者这仅仅是避免编写针对较小代码单元的测试的方法?
在我们公司,我们通常会确保为我们的网站/ Web应用程序编写一个端到端测试。这意味着我们访问一个URL,填写一个表单,将该表单提交到另一个URL并检查页面结果。我们这样做是为了测试表单验证,测试HTML模板是否具有正确的上下文变量等。
我们还使用它间接测试基础逻辑。
一位同事告诉我,这样做的原因是,只要端到端测试通过,我们就可以随时淘汰和更改基础实现。
我想知道这种解耦是否有意义,或者这仅仅是避免编写针对较小代码单元的测试的方法?
Answers:
端到端测试也是必要的。您还怎么知道如何将所有单元正确地连接在一起?在非常简单的代码上,可以仅使用端到端测试来测试代码中的所有路径,但是随着层数的增加,这样做的代价将变得非常高昂。
例如,假设您有三层,每层都有五个可能的路径。要测试通过整个应用程序的所有路径,将需要进行5 3个端到端测试,但是您可以仅使用5·3个单元测试来测试通过每个单元的所有路径。如果仅进行端到端测试,则很多路径最终都会被忽略,主要是在错误处理和边界条件下。
是的,端到端测试(或集成测试)很有意义,但是单元测试也是如此。理想情况下,您应该同时拥有它们,因为它们通常会捕获不同类型的错误。因此,进行端到端测试绝不能成为没有单元测试的借口。
经过几年的编码和从事项目工作,我将为我自己的问题提供答案。
是的,您应该编写单元测试。端到端测试更难编写且易碎,尤其是如果它们依赖于UI组件。
如果您使用的是Django或Rails之类的框架(或您自己的自定义类),则应该有一个用于处理表单验证的表单类。您还将拥有视图类,这些类显示渲染的模板和表单并处理GET和POST请求。
在端到端测试中,您将:
您正在测试很多代码,覆盖范围会很好,但是只有在一切顺利时才测试幸福的道路。您如何确保表单具有正确的验证?如果在多个页面上使用该表格怎么办?您还编写另一项端到端测试吗?
让我们通过单元测试再试一次:
通过使用单元测试,您正在测试较小的代码段,并且这些测试是特定的并且易于编写。当您将其与TDD(测试驱动开发)结合使用时,您将获得更高质量的代码。
编写单元测试的简便性不应该被忽略,因为当您在没有自动测试的项目中时,您必须从某个地方开始。从单元测试开始更容易,更快捷,它使您可以立即开始测试错误,而不仅仅是开始尝试。
它验证系统行为,而单元测试则验证单元行为。两者的收益和成本是不同的。您可以做一个或另一个。
在我的工作中,我们进行没有单元测试的验收测试驱动开发,这听起来与您所描述的相似。我们从开始就开始做这两个过程,随着时间的流逝,最终取消了单元测试,这样做的代价超出了我们的收益。
话虽这么说,但我认为针对您的问题领域和环境的成本/收益应该驱动做出参与任何开发实践(包括不同的自动化测试实践)的决策。我更喜欢信念,而不是信念,所有实践都应有经验证据来支持它们。
For Any Practice: Practice iff Benefit > Cost
was told by a co-worker that the reason for this is that we can rip out and change the underlying implementation at any point as long as the end-to-end tests pass.
-单元测试也是如此。在我看来,端到端测试被用作不编写单元测试的借口。