Web 开发中的单元测试与集成测试 [已关闭]

我想问一下在Web开发中使用单元测试。单元测试的想法很棒,但它真的在Web应用程序的上下文中带来了价值吗?我问题的第二部分是关于TDD的。如果在实际代码之前创建集成测试,这种方法是否可以称为“测试驱动开发”?

1. 假设

根据定义,单元测试应该只在一个服务层上测试代码。如果测试跨多个层测试代码,我们就有一个集成测试。

2. 参数

2.1 无算法

Web 应用程序中的算法并不多。这不像构建一个3D物理引擎,每个方法都会做一些具有挑战性且难以调试的事情。Web应用程序主要是关于集成和生成HTML。

Web应用程序面临的最大挑战是: - 干净的代码(任何软件的通用问题,但不可测试) - 数据一致性 - 集成(编程语言,文件系统,配置文件,Web服务器,缓存系统,数据库,搜索引擎,外部API - 所有这些系统都必须根据请求协同工作)

如果要为 Web 应用中的每个类生成单元测试,则需要进行测试(在大多数情况下):填充数组、字符串串联和语言的本机函数。

2.2 成本

仅仅因为Web应用程序是关于集成的,所以总是有多个依赖项。你必须嘲笑许多不同的类,即使是一个小的测试也可能是一项艰巨的工作。更糟糕的是,这不仅仅是关于测试。软件需要可测试。这意味着必须能够在几乎每个类中注入依赖项。在不创建两个类(或系统)之间的额外层的情况下,并不总是能够注入依赖关系。它使代码复杂化,并使其使用起来更加昂贵。

3. 集成测试

如果Web开发都是关于集成的,为什么不测试它呢?反驳的论点很少。

3.1 集成测试说“有东西坏了”,但没有说在哪里

这实际上归结为:当集成测试失败时,与使代码“UnitTestable”和更复杂的时间相比,需要多少时间才能找到错误(我想这是主观的)?根据我的经验,找到问题的根源从未花费很长时间。

3.2 你可以在任何环境上运行单元测试,集成测试很难做到

是的,如果要在没有数据库的情况下运行集成测试。通常有一个数据库。只要你对修复数据进行操作并在每次测试后清理,那么它应该没问题。事务数据库非常适合此任务。打开事务、插入数据、测试、回滚。

3.3 集成测试难以维护

我不能对此发表评论,因为我所有的测试都运行良好,而且我从来没有遇到过问题。

4. 创建良好的单元测试!

整个论点可以用“如果你正确地创建你的单元测试,那么你没有任何问题”来攻击。集成测试难道不是一样的吗?如果创建集成测试更容易,为什么不坚持下去,只是把它做好呢?

不要误会我的意思,我不反对单元测试。这是完美的主意,我推荐给大家。我试图理解:它真的适合Web开发吗?我想听听你的意见和经验。


答案 1

这是一个非常好的问题,也是更多开发人员应该问自己的问题

我不认为这只适用于Web开发,但我认为这是一个很好的例子来作为讨论的基础。

在决定测试策略时,您提出的观点非常有效。在商业世界中,成本(就时间而言)可能是最重要的因素。我总是遵循一些简单的规则来保持我的测试策略切合实际。

  • 单元测试重要,单元可测试的“库”(身份验证,计费,服务抽象等)
  • 单元测试模型,假设你有,在可能的情况下(这真的应该是可能的!
  • 集成测试应用程序的重要端点(完全取决于应用程序)

一旦你确定了这三点,考虑到你的成本限制,你可能会继续以有意义的方式测试其他任何有意义的东西。

单元测试和集成测试并不相互排斥,除非你正在构建一个漂亮的单元可测试库,否则你应该同时做这两件事。


答案 2

简短的回答是肯定的。单元测试很有价值,集成测试也很有价值。就我个人而言,我并不擅长做TDD,但我注意到它极大地改善了设计,因为我必须先思考,然后再编码。至少对我来说,这是无价的,但也需要很多时间来适应。我认为,这是它被广泛误解的主要原因。

让我们来看看你的观点:

没有算法(但你的意思是很少):

正如评论中所述,这取决于应用程序。这实际上与TDD无关。拥有很少的算法并不是不测试它们的论据。您可能有几个不同的案例,具有许多不同的状态。知道它们按预期工作不是很好吗?

成本

当然,它会花费成本,如果它是一个小项目,如果你或你的开发人员是新手,你可能不会从TDD获得任何价值。再说一次,一个小项目可能只是开始它的东西,所以你可以跟上下一个更大的项目。这是您必须自己完成的计算。我们是程序员,不是经济学家。

集成测试

也要测试一下!

集成测试说“有东西坏了”,但没有说在哪里

我很抱歉,但我不明白这个。

难以维护

如果很难维持,你就做错了。在更改代码时,先编写测试,在实现之前更改测试。在开发过程中测试失败是TDD的必备条件。实际上,不要引用我的话,这只是我对TDD的有限理解。

我发现这是关于单元测试的一个非常好的引用

单元测试应该是规范性的,而不是描述性的。换句话说,单元测试应该定义代码应该做什么,而不是在事后说明代码的作用。

归根结底,集成测试和单元测试是两回事。TDD是一种开发方法,集成测试更多的是从用户有利位置验证应用程序按预期工作。

编辑社区维基是这样描述集成测试的:

在集成测试中,所有输入模块都是已经过单元测试的模块。这些模块分组到较大的聚合中,集成测试(在集成测试计划中定义)应用于这些聚合。集成测试成功后,集成系统即可进行系统测试。

因此,实际上我对问题的理解从一开始就是错误的,但我认为除了最后一段之外,我的答案并不遥远。integration testing


推荐