Web开发中的单元测试与集成测试

Luk*_*awa 18 php java tdd integration-testing unit-testing

我想问一下在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.创建良好的单元测试!

整个论点可以被攻击"如果你创建单元测试权利,那么你没有任何问题.".集成测试不能相同吗?如果更容易创建集成测试,为什么不坚持下去,只是做对了?

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

adl*_*son 5

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

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

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

  • 单元测试重要,单元可测试"库"(Auth,Billing,Service Abstractions等)
  • 单元测试模型,假设你有任何可能的(并且它应该是可能的!)
  • 集成测试应用程序的重要端点(完全取决于应用程序)

一旦你得到这三个点,考虑到你的成本限制,你可以继续以有意义的方式测试任何有意义的东西.

单元测试和集成测试并不是相互排斥的,除非您构建一个精美的单元可测试库,否则您应该同时执行这两项操作.


Dan*_*roa 3

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

让我们回顾一下您的观点:

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

正如评论中所述,这取决于应用程序。这其实和TDD没有关系。算法很少并不是不测试它们的理由。您可能有几种不同的情况,有很多不同的状态。如果知道它们按预期工作不是很好吗?

成本

当然它会花费成本,而且如果它是一个小项目,并且您或您的开发人员是新手,您可能无法从 TDD 中获得任何价值。话又说回来,一个小项目可能正好适合开始,这样你就可以加快下一个更大项目的速度。这是您必须自己进行的计算。我们是程序员,不是经济学家。

集成测试

也测试一下!

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

抱歉,我不明白这一点。

难以维护

如果很难维护,那你就做错了。先写测试,改变测试再实现,改变代码的时候。开发期间测试失败对于 TDD 来说是必须的。其实不要引用我的话,那只是我对 TDD 的有限理解。

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

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

归根结底,集成测试和单元测试是两个不同的东西。TDD 是一种开发方法,集成测试更多的是从用户的角度验证应用程序是否按预期工作。

编辑 社区 wiki 关于集成测试是这样说的:

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

所以实际上我对问题的理解integration testing从一开始就是错误的,但除了最后一段之外,我认为我的答案并没有离得太远。