『软件工程12』软件工程实践方法——软件测试

软件工程实践方法—— 软件测试

  • 一、软件测试概述
    • 1、软件测试的目的
      • (1)从用户和开发者角度
      • (2)Myers软件测试目的
  • 2、软件测试的原则
    • 3、软件测试的对象
    • 4、测试信息流
    • 5、测试与软件开发各阶段的关系
  • 二、软件测试用例
    • 1、黑盒测试概述
    • 2、白盒测试概述
    • 3、白盒测试方法
    • 4、条件测试路径选择
    • 5、循环测试路径选择
      • (1)简单循环
      • (2)嵌套循环
      • (3)连锁循环
      • (4)非结构循环
    • 6、基本路径测试
    • 7、黑盒测试的测试用例设计
  • 三、软件测试步骤
    • 1、单元测试
      • (1)单元测试的定义
      • (2)单元测试的内容
      • (3)单元测试的步骤
    • 2、组装测试
      • (1)组装测试的什么
      • (2)组装测试需考虑问题
    • 3、确认测试
      • (1)确认测试是什么
      • (2)确认测试的步骤
    • 4、系统测试
      • (1)系统测试是什么
  • 四、写在最后

在一项系统软件完成之后,且在上线之前,需要经过不断的软件测试,找出 bug 和错误,不断修补,才能正式上线。在下面的这篇文章中,将讲解软件测试的一些基础知识以及测试用例的设计和软件测试的步骤。

接下来开始进行讲解。

一、软件测试概述

1、软件测试的目的

(1)从用户和开发者角度

基于不同的立场,存在着两种完全不同的测试目的:

  • 从用户的角度出发,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,以考虑是否可接受该产品。

  • 从软件开发者的角度出发,则希望测试表明软件产品中不存在错误的过程,验证该软件已正确地实现了用户的要求,树立人们对软件质量的信心。

(2)Myers软件测试目的

  • 测试是程序的执行过程,目的在于发现错误;

  • 一个好的测试用例在于能发现至今未发现的错误

  • 一个成功的测试是发现了至今未发现的错误的测试

总结来说就是,测试的目的是想以最少的时间和人力,系统地找出软件中潜在的各种错误和缺陷。如果我们成功地实施了测试,我们就能够发现软件中的错误。测试的附带收获是,它能够证明软件的功能和性能与需求说明相符合。实施测试收集到的测试结果数据为可靠性分析提供了依据。

2、软件测试的原则

  • 应当把“尽早地和不断地进行软件测试”作为软件开发者的座右铭。
  • 测试用例应由测试输入数据对应的预期输出结果这两部分组成。
  • 程序员应避免检查自己的程序
  • 在设计测试用例时,应包括合理的输入条件不合理的输入条件
  • 充分注意测试中的群集现象。经验表明,测试后程序中残存的错误数目与该程序中已发现的错误数目成正比。
  • 严格执行测试计划,排除测试的随意性。
  • 应当对每一个测试结果做全面检查。
  • 妥善保存测试计划,测试用例,出错统计和最终分析报告,为维护提供方便。

3、软件测试的对象

软件测试并不等于程序测试。软件测试应贯穿于软件定义与开发的整个期间。

需求规格说明、概要设计规格说明、详细设计规格说明以及源程序,都应成为软件测试的对象。

简单来说,就是程序、数据和文档都应该成为测试对象。

4、测试信息流

测试信息的步骤:

  • 软件配置(对象):软件需求规格说明、软件设计规格说明、源代码等;
  • 测试配置(方法):测试计划、测试用例、测试程序等;
  • 测试工具:测试数据自动生成程序、静态分析程序、动态分析程序、测试结果分析程序、以及驱动测试的测试数据库等等。
  • 测试结果分析:比较实测结果与预期结果,评价错误是否发生。
  • 排错(调试):对已经发现的错误进行错误定位和确定出错性质,并改正这些错误,同时修改相关的文档。
  • 修正后的文档再测试:直到通过测试为止。

得出结论:

通过收集和分析测试结果数据,对软件建立可靠性模型。

利用可靠性分析,评价软件质量。

如果测试发现不了错误,可以肯定,测试配置考虑得不够细致充分,错误仍然潜伏在软件中。

测试信息流

5、测试与软件开发各阶段的关系

(1)软件开发过程是一个自顶向下逐步细化的过程,主要有以下步骤:

  • 软件计划阶段定义软件作用域。
  • 软件需求分析阶段建立软件信息域、功能和性能需求、约束等。
  • 软件设计。
  • 把设计用某种程序设计语言转换成程序代码。

(2)而测试过程是按照相反顺序安排的自底向上逐步集成的过程。

测试过程

二、软件测试用例

1、黑盒测试概述

测试对象看做一个黑盒子,测试人员完全不考虑程序内部的逻辑结构和内部特性,只依据需求规格说明来检查程序的功能是否符合。

黑盒测试又叫做功能测试数据驱动测试

黑盒测试方法是在程序接口上进行测试,主要是为了发现以下错误:

  • 是否有不正确或遗漏了的功能?

  • 在接口上,输入能否正确地接受? 能否输出正确的结果?

  • 是否有数据文件访问错误?

  • 性能上是否能够满足要求?

用黑盒测试发现程序中的错误,必须在所有可能的输入条件和输出条件中确定测试数据,来检查程序是否都能产生正确的输出。

但这是不可能发生的事情。为什么呢?

假设一个程序P有输入量X和Y及输出量Z。在字长为32位的计算机上运行。若X、Y取整数,按照黑盒测试方法进行穷举测试

可能采用的测试数据组:232 x 232 = 264。

如果测试一组数据需要1毫秒,一年工作365× 24小时,完成所有测试需5亿年

5亿年!想想都不太可能。所以说,程序一般没有办法引入穷举测试。

2、白盒测试概述

把测试对象看做一个透明的盒子,它允许测试人员利用程序内部的逻辑结构设计测试用例,对程序所有逻辑路径进行测试。

通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致

因此白盒测试又称为结构测试逻辑驱动测试

白盒测试方法,主要对程序模块作出以下检查:

  • 对程序模块的所有独立的执行路径至少测试一次;
  • 所有的逻辑判定,取“”与取“”的两种情况都至少测试一次;
  • 在循环的边界和运行界限内执行循环体;
  • 测试内部数据结构的有效性等等。

对一个具有多重选择和循环嵌套的程序,不同的路径数目可能是天文数字。给出一个小程序的流程图,它包括了一个执行20次的循环。

包含的不同执行路径数达520条,对每一条路径进行测试需要1毫秒,假定一年工作365 × 24小时,要想把所有路径测试完,需3170年。

比起穷举测试的5亿年,3170年似乎少了不少。但是呢?3170年会不会也挺太漫长的。

因此,我们要引入一些黑白盒测试方法来解决这些问题。

3、白盒测试方法

白盒测试方法主要有以下6种方法:

  • 语句覆盖
  • 判定覆盖
  • 条件覆盖
  • 判定-条件覆盖
  • 条件组合覆盖
  • 路径覆盖

白盒测试方法这里篇幅较长,放在另外一篇文章中,有需要的小伙伴自取~

4、条件测试路径选择

当程序中的判定条件超过一个时,形成的分支结构可以分为两类:嵌套型分支结构连锁型分支结构

对于嵌套型分支结构,若有 n 个判定语句,需要 n+1 个测试用例;

对于连锁型分支结构, 若有 n 个判定语句,需要有 2n 个测试用例,覆盖它的 2n 条路径。

如下图所示:

嵌套型和连锁型分支结构

5、循环测试路径选择

循环分为4种不同类型:简单循环连锁循环嵌套循环非结构循环。如下图所示:

循环测试路径选择

接下来对这四种循环进行一一介绍。

(1)简单循环

①零次循环: 从循环入口到出口。

②一次循环: 检查循环初始值。

③二次循环: 检查多次循环。

④m次循环: 检查在多次循环。

⑤最大次数循环: 比最大次数多一次、少一次的循环。

(2)嵌套循环

对最内层循环做简单循环的全部测试。所有其它层的循环变量置为最小值

②逐步外推,对其外面一层循环进行测试。测试时保持所有外层循环的循环变量取最小值,所有其它嵌套内层循环的循环变量取“典型”值。

③反复进行,直到所有各层循环测试完毕。

对全部各层循环同时取最小循环次数,或者同时取最大循环次数

(3)连锁循环

如果各个循环互相独立,则可以用与简单循环相同的方法进行测试。但如果几个循环不是互相独立的,则需要使用测试嵌套循环的办法来处理。

(4)非结构循环

这一类循环应该使用结构化程序设计方法重新设计测试用例。

6、基本路径测试

基本路径测试法也已经放到白盒测试方法文章当中,有需要的小伙伴自取~

7、黑盒测试的测试用例设计

黑盒测试方法主要有以下8种方法:

  • 等价类划分法
  • 边界值分析法
  • 错误推测法
  • 因果图法
  • 判定表驱动法
  • 正交实验设计法
  • 场景法
  • 功能图法

黑盒测试方法篇幅较长,已放在另外一篇文章中,有需要的小伙伴自行查阅~

三、软件测试步骤

测试过程需要按照4个步骤进行,分别是单元测试(模块)组装测试(集成)确认测试系统测试详细过程如下:

  • 开始是单元测试,集中对使用源代码实现的每一个程序单元进行测试,检查各个程序模块是否正确地实现了规定的功能。
  • 组装测试已测试过的模块组装起来,主要对与设计相关的软件体系结构的构造进行测试。
  • 确认测试则是要检查已实现的软件是否满足了需求规格说明中已经确定的各种需求,以及软件配置是否完全、正确。
  • 系统测试把已经经过确认的软件纳入实际运行环境中,与其它系统成份地组合在一起进行测试。
    软件测试的步骤

以下将对这四个测试步骤进行一一讲解。

1、单元测试

(1)单元测试的定义

单元测试又称模块测试,是针对软件设计的最小单位 —— 程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错。

单元测试需要从程序的内部结构出发设计测试用例。多个模块可以平行地独立进行单元测试。

(2)单元测试的内容

在单元测试时,测试者需要依据详细设计说明书和源程序清单,了解该模块的I/O条件和模块的逻辑结构,主要采用白盒测试的测试用例,辅之以黑盒测试的测试用例,使之对任何合理的输入和不合理的输入,都能鉴别和响应。

如下图所示:

单元测试的内容

下面对这五个测试内容进行一一讲解。

1)模块接口测试

在单元测试的开始,应该对通过被测模块的数据流进行测试。测试项目包括:

  • 调用本模块的输入参数是否正确;
  • 本模块调用子模块时输入给子模块的参数是否正确;
  • 全局量的定义在各模块中是否一致;

在做内外存交换时要考虑:

  • 文件属性是否正确;

  • OPENCLOSE 语句是否正确;

  • 缓冲区容量与记录长度是否匹配;

  • 在进行读写操作之前是否打开了文件;

  • 在结束文件处理时是否关闭了文件;

  • 正文书写/输入错误,

  • I/O 错误是否检查并做了处理。

2)局部数据结构测试

  • 不正确或不一致的数据类型说明;
  • 使用尚未赋值或尚未初始化的变量;
  • 错误的初始值或错误的缺省值;
  • 变量名拼写错或书写错;
  • 不一致的数据类型;
  • 全局数据对模块的影响。

3)路径测试

  • 选择适当的测试用例,对模块中重要的执行路径进行测试;
  • 应当设计测试用例来查找因错误的计算不正确的比较不正常的控制流而导致的错误;
  • 基本执行路径和循环进行测试,可以发现到大量的路径错误。

4) 错误处理测试

  • 出错的描述是否难以理解;
  • 出错的描述是否能够与具体错误相定位;
  • 显示的错误与实际的错误是否相符;
  • 对错误条件的处理正确与否;
  • 在对错误进行处理之前,错误条件是否已经引起系统的干预等。

5) 边界测试

  • 注意数据流控制流中刚好等于、大于或小于确定的比较值时出错的可能性;
  • 对这些地方要仔细地选择测试用例,认真加以测试;
  • 如果对模块运行时间有要求的话,还要专门进行关键路径测试,以确定最坏情况下正常情况下影响模块运行时间的因素。

(3)单元测试的步骤

模块并不是一个独立的程序,因此,在考虑测试模块时,同时要考虑它和外界的联系,用一些辅助模块去模拟与被测模块相联系的其它模块。其中,辅助模块包括:

  • 驱动模块 (driver);
  • 桩模块 (stub) —— 存根模块。

依据驱动模块和桩模块,单元测试的步骤如下图所示:

单元测试的步骤

如果一个模块要完成多种功能,可以将这个模块看成是由几个小的程序组成。必须对其中的每个小的程序先进行单元测试所需要做的工作,对关键模块还要做性能测试

对支持某些标准规定的程序,更要着手进行互联测试。有人把这种情况特别称为模块测试,以区别单元测试

2、组装测试

(1)组装测试的什么

组装测试 ,也称为集成测试联合测试

(2)组装测试需考虑问题

通常,在单元测试的基础上,需要将所有模块按照设计的要求组装成为系统。这时需要考虑的问题是:

  • 在把各个模块连接起来的时侯,穿越模块接口的数据是否会丢失;

  • 一个模块的功能是否会对另一个模块的功能产生不利的影响;

  • 各个子功能组合起来,能否达到预期要求的父功能;

  • 全局数据结构是否有问题;

  • 单个模块的误差累积起来,是否会放大,从而达到不能接受的程度。

  • 在单元测试的同时可进行组装测试,发现并排除在模块连接中可能出现的问题,最终构成要求的软件系统。

  • 子系统的组装测试特别称为部件测试,它所做的工作是要找出组装后的子系统与系统需求规格说明之间的不一致。

  • 通常,把模块组装成为系统的方式有两种:

    • 一次性组装方式
    • 增殖式组装方式

3、确认测试

(1)确认测试是什么

确认测试又称有效性测试

任务是验证软件的功能和性能和其它特性是否与用户的要求一致。

在软件的需求规格说明书中明确规定软件的功能和性能要求。

它包含的信息就是软件确认测试的基础。

如下图所示:

确认测试

(2)确认测试的步骤

  • 进行有效性测试(黑盒测试);
  • 软件配置复查;
  • α 测试和 β 测试;
  • 验收测试 (Acceptance Testing)

4、系统测试

(1)系统测试是什么

将通过确认测试的软件,作为整个基于计算机系统的一个元素,与计算机硬件、外设、某些支持软件、数据和人员等其它系统元素结合在一起

在实际运行环境下,对计算机系统进行一系列的组装测试确认测试

四、写在最后

🙋🙋🙋

在软件工程实践中,也有软件测试这一步骤。但相较于软件测试这一整个大体系而言,软件测试在软件工程中所占的比例较小,个人认为掌握部分基础的内容即可。如有需要学习软件测试的其他内容,也可以到『软件测试』专栏中进行查看~

软件工程实践方法中的软件测试讲到这里就结束啦!如有需要了解软件工程相关的其他内容,可到『软件工程』栏目进行查看学习~

同时,有不理解或有误的地方也欢迎评论区评论或私信我交流~

  • 关注公众号 星期一研究室 ,不定期分享学习干货,学习路上不迷路~
  • 如果这篇文章对你有用,记得点个赞加个关注再走哦~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308001.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode59:螺旋矩阵||(思路+详解)

一:题目 二:思路 1.我们需要模拟数字的变化过程, 2.模拟填充的过程:(顺时针) 填充上行 从左到右 填充右行 从上到下 填充下行 从右向左 填充左行 从下到上 3.分析我们填充数字的过程,比如n3的时候 上行:1,2 右行:3,4 下行:5,6 左行:7,8 这么分析下来我们…

在香蕉派的树莓派系统上配置 Syncthing 自启动(暨 Linux 软件自启服务配置)

在香蕉派的树莓派系统上配置 Syncthing 自启动独立观察员 2020 年 1 月 19 日(2020年8月30日 更新)首先做个名词解释,” 香蕉派” 是国内一款山寨树莓派的硬件产品,” 树莓派系统” 指的是”raspberrypi”,而”Syncthi…

『软件工程13』浅谈面向对象方法,统一建模语言UML

浅谈面向对象方法UML一、UML的含义二、UML的主要内容1、UML的概念模型2、UML概念模型图例三、UML的基本构造块1、UML中的事物(1)UML中的四种事物(2)UML中各种事物的图示法2、UML中的四种关系(1)依赖&#x…

leetcode54:螺旋矩阵

一:题目 二&#xff1a;上码 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;int startx 0,starty 0;int n matrix.size();//求出行int m matrix[0].size();//求出列int loop m/2 < n/…

查漏补缺方为上策!!两万六字总结vue的基本使用和高级特性,周边插件vuex和vue-router任你挑选

vue的基本使用和高级特性&#xff0c;周边插件vuex和vue-router一、vue的使用1、vue-cli2、基本使用&#xff08;1&#xff09;模板&#xff08;插值&#xff0c;指令&#xff09;&#xff08;2&#xff09;computed和watch&#xff08;3&#xff09;class和style&#xff08;4…

数据库单表千万行 LIKE 搜索优化手记

我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索&#xff0c;LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。如果需要查找客户表中所有姓氏是“张”的数据&#xff0c;可以使用下面的 SQL 语句&#xff1a;SELECT * FROM Customer WHERE Name LIKE 张%如果需要…

Mybatis第一个程序

一:整体流程 这个流程可以根据官方文档进行编写 mybatis的官方文档 二:实现 1:创建一个表 CREATE DATABASE mybatis;CREATE TABLE user(id INT NOT NULL PRIMARY KEY,name VARCHAR(30) NOT NULL DEFAULT ,pwd VARCHAR(20) NOT NULL DEFAULT )ENGINE INNODB;INSERT I…

基于.NetCore3.1系列 —— 日志记录之初识Serilog

前言对内置日志系统的整体实现进行了介绍之后&#xff0c;可以通过使用内置记录器来实现日志的输出路径。而在实际项目开发中&#xff0c;使用第三方日志框架&#xff08;如&#xff1a;Log4Net、NLog、Loggr、Serilog、Sentry 等&#xff09;来记录也是非常多的。首先一般基础…

手把手教你剖析vue响应式原理,监听数据不再迷茫

Object.defineProperty实现vue响应式原理一、组件化基础1、“很久以前”的组件化&#xff08;1&#xff09;asp jsp php 时代&#xff08;2&#xff09;nodejs2、数据驱动视图&#xff08;MVVM&#xff0c;setState&#xff09;&#xff08;1&#xff09;数据驱动视图 - Vue MV…

leetcode:203. 移除链表元素(两种方法)

一:题目 二:上码 1:方法一&#xff1a;(虚拟一个首结点) class Solution { public:ListNode* removeElements(ListNode* head, int val) {//1.虚拟一个头结点 这样就不用单独处理了ListNode * virtuals new ListNode(0);//给其开辟个空间并且赋初值virtuals->next head…

面试中的网红虚拟DOM,你知多少呢?深入解读diff算法

深入浅出虚拟DOM和diff算法一、虚拟DOM&#xff08;Vitual DOM&#xff09;1、虚拟DOM&#xff08;Vitual DOM&#xff09;和diff的关系2、真实DOM的渲染过程3、虚拟DOM是什么&#xff1f;4、解决方案 - vdom&#xff08;1&#xff09;问题引出&#xff08;2&#xff09;vdom如…

Blazor带我重玩前端(六)

本文主要讨论Blazor事件内容&#xff0c;由于blazor事件部分很多&#xff0c;所以会分成上下两篇&#xff0c;本文为第二篇。双向绑定概述如图所示当点击单项绑定的时候&#xff0c;MyOnewayComponent里的属性值会发生变化&#xff0c;这种变化是单项的&#xff0c;仅仅只是本地…

leetcode707:设计链表(增删差)

一:题目 二:上码 class MyLinkedList { public://定义链表节点结构体struct LinkedNode {int val;LinkedNode* next;LinkedNode(int val):val(val), next(nullptr){}};// 初始化链表MyLinkedList() {node new LinkedNode(0); // 这里定义的头结点 是一个虚拟头结点&#xff0…

深入探究.Net Core Configuration读取配置的优先级

前言在之前的文章.Net Core Configuration源码探究一文中我们曾解读过Configuration的工作原理&#xff0c;也.Net Core Configuration Etcd数据源一文中探讨过为Configuration自定义数据源需要哪些操作。由于Configuration配置系统也是.Net Core的核心&#xff0c;其中也包含了…

TypeScript,从0到入门带你进入类型的世界

从0到入门进入TS的世界一、什么是TypeScript&#xff1f;1、编程语言的类型2、TypeScript究竟是什么&#xff1f;二、为什么要学习TypeScript&#xff1f;1、程序更容易理解2、效率更高3、更少的错误4、非常好的包容性5、一点小缺点三、typescript入门1、如何安装TypeScript2、…

编写第一个 .NET 微服务

介绍本文的目的是&#xff1a;通过创建一个返回列表的简单服务&#xff0c;并在 Docker 容器中运行该服务&#xff0c;让您熟悉使用 .NET 创建微服务的构建过程。安装 .NET SDK要开始构建 .NET 应用程序&#xff0c;首先下载并安装 .NET Core SDK&#xff08;软件开发工具包&am…

模板编译template的背后,究竟发生了什么事?带你了解template的纸短情长

解析模板编译template的背后发生了什么一、&#x1f4d1;初识模板编译1、vue组件中使用render代替template2、模板编译总结二、✏️感受模板编译的美1、with语法&#xff08;1&#xff09;例子展示&#x1f330;&#xff08;2&#xff09;知识点归纳三、&#x1f4c8;编译模板1…

leetcode24. 两两交换链表中的节点(思路+解析)

一:题目 二:思路 思路: 1.分析题意 这是相邻结点进行交换 如果是4个结点 那么1和2交换 3和4交换 如果是3个结点 那么就1和2进行交换 3不动 2.这里我们定义一个虚拟头节点方便操作&#xff0c;我们只需三步实现结点的交换 <1>:让虚拟结点指向第二个结点(进行交换的结点我…

把Autofac玩的和java Spring一样6

大家好&#xff0c;今天来介绍我开源的一个autofac.Annotation项目 源码&#xff1a;https://github.com/yuzd/Autofac.Annotation本项目是autofa的一个扩展组件&#xff0c;autofac是一个老牌的DI容器框架 &#xff0c;支持netframework和netcoreAnnotdation是注解的意思&…

『软件测试5』测开岗只要求会黑白盒测试?NO!还要学会性能测试!

浅谈软件测试中的性能测试一、&#x1f92a;性能测试概念1、为什么要有性能测试&#xff1f;2、性能测试是什么&#xff1f;3、性能测试的目的二、&#x1f910;性能测试指标1、响应时间2、吞吐量3、并发用户数4、TPS(Transaction Per Second)5、点击率6、资源利用率三、&#…