软件测试

2018-12-03  本文已影响0人  zcfelix

什么是测试

根据Wiki的定义,软件测试是指在规定的条件下对程序进行操作,以发现程序错误,衡量软件质量 ,并对其是否能满足设计要求进行评估的过程。那么测试在软件开发中扮演什么样的角色,为我们提供什么价值呢?如果在项目中引入测试,我们应该按照什么样的原则去安排测试呢?带着这些问题,我们先来看看常见的测试有哪些。

软件架构与测试分类

我们常见的测试有单元测试、集成测试、组件测试、端到端测试、性能测试、安全测试、探索性测试、验收测试、Alpha/Beta 测试、场景测试等等。这么一大堆名词,他们各自有什么含义呢?首先,抛弃枯燥的理论,我们可以结合软件系统架构来确认每种测试的内容及作用。

软件系统架构

传统的企业级应用架构如下图

software-architecture.png

单元测试

在上述的软件架构下,在哪些模块可以使用单元测试呢?单元测试在各个模块分别为我们提供什么价值呢?

unit-test.png

集成测试

单元测试只验证本模块的逻辑正确性,但是无法验证模块之间的交互,也无法保证系统的行为。集成测试可以解决这个问题。

integration-test-boundary.png

组件测试

集成测试可以保证模块的交互与行为,但仍然没有测试完整的业务。换句话说:单元测试和集成测试虽然都可以对内支撑团队的开发工作,但对于最终用户的价值有限。因此,我们需要组件测试。组件测试将我们的服务整体作为一个组件,隔离外部数据库和外部服务,测试本服务的完整业务场景。

component-test-boundary.png

这里存在一个问题,我们如何隔离外部依赖呢?

端到端测试

将系统中的各个模块(包含外部依赖服务)作为一个整体,选取合适的终端对系统整体进行测试。端到端测试针对最终用户,测试完整的 user case。这部分测试对最终用户最有价值,需要包含主要的用户场景(User Journey),但因为端到端测试的成本比较高,所以这部分测试需要尽可能少。

end-to-end-test.png

测试分层

测试金字塔

如图所示,单元测试、集成测试、组件测试、端到端测试和探索性测试,从金字塔的底部到顶部的变化趋势为:集成度更高、反馈更为真实,但其测试的成本也更高,覆盖率较低;与之相反,从金字塔的顶部到底部的变化趋势为:运行速度更快,反馈周期更短,覆盖率也更高,但没法测试系统的连通性,而且因为测试中存在某些外部隔离,测试反馈真实性也会打些折扣。

test-pyramid.png

确认测试层次的基本原则

对于我们的系统而言,关于测试,我们需要思考两个问题:系统的哪些地方需要测试,以及什么层次的测试最契合我们的测试需求?对于第一个问题:我们可以根据以下原则来综合度量。

在确认系统哪些地方需要引入测试之后,我们可以问问自己:在这里引入测试的目的是什么?是帮助我们理清和确认业务,还是保证复杂逻辑的正确性,抑或是用于评断系统的性能?我们可以借助敏捷测试四象限图来帮助我们分析。

agile-test-quardrant.png

如上图所示:根据我们定位的测试点和引入测试的目的,我们可以把不同的测试放入到象限图的不同象限。每个象限的测试复杂程度各不相同,测试方式可能也存在比较差异。结合项目的情况与开发进展,可以明确需要做什么测试,以及分别由团队的什么角色来做这些测试。项目的不同阶段可能需要不同象限的测试,我们可以根据项目的开发流程的发展来调节测试的内容,找到最佳方案。

上一篇下一篇

猜你喜欢

热点阅读