为什么集成测试比单元测试更重要

单元测试很棒。在假定一些数据的环境下,能顺利通过测试的系统就可算是一个好系统。

不过,现在可以直连外部资源的集成测试才让程序更有价值。谁知道那些内容商(供应商,vendor)会做出什么傻事来!

很多人一直尝试着让测试达到100%的代码覆盖率,这是很棒的想法,但我倒觉得它有些基本概念上的问题。LosTechiesRyan
Svihla
 提出了"反模式(anti-pattern", 有个有趣的观点: “多数应用都需要与外部资源交互”。他们有许多不错的论点,比如:

  大多数的单元测试都需一个运行着的数据库、网页或应用服务器。

确实如此。

全是同数据和外部系统相关的

我下面将要证明多数Bug并不来源于程序本身,而是由从外部输入的数据所引起的。

为什么? 因为通常Bug出现在实际的工作环境中,我们的程序总会处理不好那些外部系统输入的原始数据,或者程序输出到外部系统中的数据。而"单元测试"或TDD中所强调的是提供一组假定的数据,检验程序是否能够按照预期的方式运行。也就说整个测试是在一个假定环境下进行的。这就是为什么接口总是如此轻易就成功运行了。在这之上还可以达到自动化,预测试性,以及可重复的测试。但是仍有很多系统无法解决现实的问题。

因为这样的测试方式所能解决的仅是软件开发要面对的问题中的一部分。如何才能发现真正的问题?最终还是要让你的软件与它的外部资源连接起来运行才能发现。

举个略为抽象的例子:

 1) 一些来自外部系统的数据.

 2) 应用程序开始处理这些数据.

 3) 应用程序将处理后的数据发送到外部资源中 (一般是与第1步不同的数据)

 4) 外部数据拿到第3步的数据,在处理后再发送到应用程序.

 5) 再次接收到数据,并加以处理.

如此反复。

我们常用mocks/stubs或者类似的程序来产生第1步的数据来进行第2步的测试,而测试第5步时所使用的数据也是使用类似的方式产生的。其中第1步和第4步是不可靠,也是不可预计的,因为你根本不知道外部系统会给你什么数据。

第1步和第4步是程序在上线环境下要面对的,所以它们才是最需要关注的。


外部系统都很挑剔(External systems are finicky mean things)

对于一些e-Commerce系统,或者财务系统,各式的接口,各式的数据在各个系统间流转。

我们来谈一些高层次的问题:

1)理想情况下,当外部系统更改了要发送的数据,无论是是格式(format)或模式(schema),你希望会提前知道。这有些一厢情愿了。最近我曾与一个电子商务系统,外部数据系统的税务信息增加了一栏,同时需要应用程序调整内部逻辑。就是外部数据系统已经开始发送数据了,我们才知道的。

2)理想情况下,当外部系统声称支持新的API,你应该改变应用程序的内部逻辑,并且发送新数据。最后,你会发现,他们支持新的API,要么在他们的UAT(User Acceptance Test)环境而不在上线(PRODUCTION)的环境,或者只在上线环境中而不在UAT环境中。

3)你的程序已使用关于国内资产的采购信息很顺畅了,外部系统和程序的配合也很好。然后开始加入一些国际资产信息时,你可能并不能及时地发现数据已完全变了。

这些都是我曾遇到的场景。我要说就是你在单元测试中根据无法了解到未来面对的环境,只有实际运行时才有办法。更悲哀的是那些在凌晨3点把你叫起来的问题通常都这样产生的。

如何完善测试规格(How to setup your Specs)

我做设计也是从规格文档开始的。规格(specification)其实就是另一种测试(well-crafted tests)。我会区分规格中的单元和集成,并写不同的代码。

所谓“单元”的测试规格是测试内部的业务逻辑,看看有没有把东西都串起来了。就是在测试时提供一些场景,确保程序执行正确的逻辑,输出期望的结果。

而集成(Integration)的测试规格则和外部资源有关。直接提供一组外部资源数据,以及要返回的数据。这些是集成测试中实际关心的东西。和外部资源的交互才能真正确定程序是否可以正常工作。

[只译出主要概念,详细内容请阅读原文!翻译的初衷是因为发现接口的定义和维护常常做得不充分,工程师自主的口头交流常常带来很高的风险。这篇文章可以带来一点思考,重新审视工作中的关于接口是不是得到了充分的重视!]

原文地址: More Reasons Why Integration Tests Can Be More Important
Than Unit Tests

转载请注明出处:http://blog.csdn.net/horkychen

时间: 2024-10-28 18:57:19

为什么集成测试比单元测试更重要的相关文章

单元测试培训系列:(一)单元测试概念以及必要性

说起单元测试,多数同学应该都知道或听过,可能不少同学认为自己也写过,甚至觉得单元测试很简单有什么好培训的?其实这个事情还真没想象的那么简单!我基本可以比较负责任的说,你若没深入对单元测试做过研究,不知道Mock对象为何物的话,那么可能你以前写过的单元测试压根就不是单元测试. 单元测试是什么? 这个问题其实并不太容易一两句话说得特别清楚.先借用下百度百科的定义: 单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试. 从以

Android系列----JUnit单元测试的使用

[正文] 一.单元测试的引入: 如果只是普通的一个小程序,编写测试是有些多此一举,但是当项目比较庞大的时候,一般都应该去编写单元测试.JUnit测试是白盒测试,即主要是程序员自己对开发的方法进行功能性测试.JUnit是一套框架,Android中也沿用了这一套框架. 在Android中使用JUnit测试大致分如下几个步骤: (1)在AndroidManifest.xml中增加对JUnit的支持,并制定测试项目包. (2)在AndroidManifest.xml中<application.../>

Java RESTful Web Service实战(第2版)

Java核心技术系列 Java RESTful Web Service实战 (第2版) 韩陆 著 图书在版编目(CIP)数据 Java RESTful Web Service实战 / 韩陆著. -2版. -北京:机械工业出版社,2016.7 (Java核心技术系列) ISBN 978-7-111-54213-1 Ⅰ. J-   Ⅱ. 韩-   Ⅲ. JAVA语言-程序设计   Ⅳ. TP312 中国版本图书馆CIP数据核字(2016)第156331号 Java RESTful Web Servi

浅谈一种有效的测试策略

在最近的一个大型项目中,我们在早期就定下了一个目标:不会在软件中使用大量QA人员专注于手工测试.通过手工测试发现bug极其耗时且成本高昂,这促使团队尝试尽可能的将质量内嵌到产品内部.但这并不意味着手工测试毫无价值,因为人们总能在怎样使用软件上给你一些特别的惊喜. 这是一个为期18个月左右,周期很长的项目,并且后续也会持续更新. 在项目初期,团队就意识到项目成功的重中之重在于一个优秀的测试策略,尤其是让我们的团队能够做到:1)随着项目时间的推移能够持续的提高团队的工作效率.2)不管面对的变更是大是

写代码容易,编程并不容易

当我的编程生涯开始的时候,我认为"编程很简单--怎么会需要去学校学习呢?"但经过学习和实践,我了解到编程很难. 不知道是编程不难还是我什么都不懂. ~MemeGenerator.net 自我评价对我自己来说一直都很重要,因为在一天结束的时候,不管别人怎么想,自己的想法都很重要.我会在评价中思考强项.弱项.学习.训练和个人成长.这个过程让我反思.理解并思考成为一个程序员究竟意味着什么. 教育:编码?编程?关键性的抨击? 我在技术领域的第一份工作主要是通过 HTML.CSS 和 JavaS

 《XPP极速编程实践》

<XPP极速编程实践>主要介绍了XPP的模式,在此模式下PD,Dev,QA,DevOps各角色的职责与定位,以及如何持续快速交付高质量产品. XPP的模式--面向交付开发与传统的面向测试开发区别: 极限编程的模式,面向交付的开发:有测试的工作,但没有真正的测试环节存在.开发写完代码,直接上线.没有经过严格的测试,会不会出现质量倒退呢,其实是赋予测试一些定的含义. 开发在编码阶段加入:代码审查.单元测试.集成测试:在交付阶段:加入一个新的角色DevOps,从复杂的TC编写中释放出来,而是做用例审

Java RESTful Web Service实战(第2版) 2.3 传输格式

2.3 传输格式 本节要考虑的就是如何设计表述,即传输过程中数据采用什么样的数据格式.通常,REST接口会以XML和JSON作为主要的传输格式,这两种格式数据的处理是本节的重点.那么Jersey是否还支持其他的数据格式呢?答案是肯定的,让我们逐一掌握各种类型的实现. 2.3.1 基本类型 Java的基本类型又叫原生类型,包括4种整型(byte.short.int.long).2种浮点类型(float.double).Unicode编码的字符(char)和布尔类型(boolean). 阅读指南 本

初步了解Angular 2端到端的测试

有许多原因使我过去不愿对自己的应用添加自动化测试.原因之一是不知道其中的效益成本比率,另一个原因是考虑到集成到现有生产环境的应用可能比较难.测试应用而不用从头重构代码,仅仅只是引入测试要怎么做呢? 首先我们先从简单区分测试的类型开始.应用测试有很多类型,但最为常见的是单元测试及端对端测试(亦称为集成测试).单元测试是测试代码自身行为的一种测试.在用户看来什么也没有做,但可以确保其方法能达到期望的目的.集成测试是模仿用户行为的一种测试.比如说,登陆系统,创建帖子,退出系统等这些操作都可以自动化,并

中国平安银行关于软件测试笔试试题(二)

接:中国平安银行关于软件测试笔试试题(一) 51.以下哪一项测试是自动化测试无法胜任的:(  )(该题为必答题) 3 对图形验证码的测试 对数据流的测试 对业务流程的测试 对页面校验规则的测试 52.一个对象有4个属性,每个属性有3种可能的值,如果要求对所有值的组合进行测试,则共有()种组合(该题为必答题)  2 12 81 7 64 53.软件测试术语"V&V"指()(该题为必答题) 4 Valid and Valuable Version and Version Valid