首页 > 到底什么是集成测试?

到底什么是集成测试?

CI中经常提到测试,网上也有非常多教程来说明怎么搭建自动CI。但是!但是!TM到底什么是集成测试,一直没有说明白。我的疑问如下:

  1. 单元测试为什么要集中到CI中跑?每个人写的单元测试,自己跑过了再推送不更好?
    单元测试需要mock,对吧? A->B->C , C没有写好, A、B都没有办法跑,所以B只能 Mock出C、A Mock出B。这样就隔离了依赖。 但是单元测试本质上没有必要集成起来再跑。类跟类之间完全隔离,本地就能跑。(除非一个类由多个人来负责)。

  2. 到底什么才是集成测试?是不是去掉Mock的单元测试代码就是集成测试?让A真实的依赖B, B真实的依赖C?


你说的是对的,集成测试是单元测试后的另一个阶段。

单元测试--> 集成测试 --> 冒烟测试 --> 回归测试 --> 用户验证测试
Unit --> Integration --> smoke --> Regression --> Acceptance

我不是专业测试,不过你就以造飞机为例:

飞机零件的检验 -- 单元测试

飞机组装过程中的调试 -- 集成测试

飞机装好了,会不会漏气呢(飞机里面是加压的),在里面放把火,在外面看会不会冒烟就知道有没有漏洞了(举例,非真实场景,哈哈) -- 冒烟测试

在机舱右侧找到一个孔,修补了,但是补的时候会不会把其他部件弄坏了? -- 回归测试。

试飞 -- 用户验证测试


你的问题其实要分两块儿来说,因为现在用的是手机所以先简要回答一二,不明白的话再补充。

单元测试就是最小代码单元的针对性测试,可以是对象的一个属性,检查是否存在或值是否有效等等;也可以是一个函数或方法,检查其行为或输出是否如预期或者代码执行效能等等。

集成测试是要测试若干代码单元整合行为的结果,但是测试的写法却不一定是简单的一加一加一……而是从高阶层面模拟一种行为的开始(比如路由跳转)然后测试结果的预期(如当前路径),在此黑盒当中代码的流转和交互会牵涉到多个代码单元,谓之“集成”。

Mock 是模拟依赖对象的,它既可以用于单元测试也可以用于集成测试,并没有使用场景的严格限制。即使说集成测试是覆盖多个代码单元的,但 mock 依然有用武之地。比如说某个场景下系统调用了某第三方库做了 http 请求,如果你确信这个第三方库是可靠的(带有良好测试的开源软件)或者你确信返回结果的格式是可以预期的,你一样可以把这个部分 mock 了,因为它与你所写的代码并没有直接关系。

除此之外还有很多测试手段,比如冒烟,验收等等,每一种测试都有自己的针对性目标,不一而同,略过不谈。

再来说说 CI,虽然 CI 也带“集成”二字,但它与之前提到的集成测试是不同的。

集成测试的目标是软件系统的内部行为(只不过行为的层级较高,不是单一代码单元的行为,后者是单元测试的范畴),和外部运行环境无关(比如操作系统和运行环境的差异),它是封闭的,编写集成测试往往是在假设外部环境理想化的前提下进行的。

而 CI 的集成,意在软件系统与运行环境的整合,重点不在于你写了哪些测试,而在于你的测试在特定的环境下是否能表现如一,也就是排除或扩展了理想化环境这一限定条件。所以 CI 的配置里一定会有对于运行环境的描述。

为什么要 CI 之后才入代码管理?因为开发者的本地环境是多变的,是不可靠的。本地跑测试通过只能说明在特定的环境下一切 OK,但真实的产品是跑在产品服务器上的,你很难强求所有的开发者都去把本地环境模拟成产品服务器,因此需要 CI 来模拟产品环境来把持最后一道关口(有时候还有一道人工随机测试在后面)。因为 CI 所模拟的环境可以保持一致性,所以才叫“持续”集成,它不会因为开发者的变化而改变对测试代码运行的参照环境。

【热门文章】
【热门文章】