软件测试用例经典方法 | 单元测试法案例
单元测试又称模块测试,是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验,检查程序在语法、格式和逻辑上的错误,并验证程序是否符合规范,以发现单元内部可能存在的各种缺陷。
单元测试的对象是软件设计的最小单位——模块、函数或者类。在传统的结构化程序设计语言(如C语言)中,单元测试的对象一般是函数或者过程。在面向对象设计语言(如Java、C#)中,单元测试的对象可以是类,也可以是类的成员函数/方法。由此可见,单元测试与程序设计和编码密切关联,测试者需要根据详细设计说明书和源程序清单来了解模块的I/O条件和逻辑结构。
本节利用风靡全球的“俄罗斯方块游戏排行榜”的程序作为案例来串讲单元测试的内容。
01、测试策划
1. 目的
俄罗斯方块游戏(Tetris)的排行榜功能经过编码后,在与其他模块进行集成之前,需要经过单元测试,测试其功能点的正确性和有效性。以便在后续的集成工作中不会引入更多的问题。
2. 背景
俄罗斯方块是一款风靡全球的电视游戏机和掌上游戏机游戏,它由俄罗斯人阿列克谢·帕基特诺夫发明,故得此名。俄罗斯方块的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
排行榜功能是俄罗斯方块游戏中不可或缺的一部分,其用于将当前用户的得分与历史得分记录进行比较并重新排序。
该程序主要涉及的功能点有历史记录文件的读取、分数排名的计算与排序、新记录文件的保存、新记录的显示等。这些功能将在一局游戏结束,并获取到该局游戏的得分后启动。
3. 待测源代码
private void gameOver (int score)//游戏结束
{//Display game over
string s="您的得分为:";
string al =".
char[]A={};
int i=1;
_blockSurface.FontStyle= new Font(FontFace,BigFont);//设置基本格式_blockSurface.FontFormat.Alignment = StringAlignment.Near;
_blockSurface.DisplavText ="GAME OVER!!
string sc = Convert.ToString( score);//得到当前玩家的分数//write into file;
string path="D: test2.txt";//文件路径
try{
FileStream fs = newFileStream
(path,FileMode.OpenOrCreate,FileAccess.ReadWrite);
StreamReader strmreader = new StreamReader(fs);//建立读文件流
String[] str = new String[5];
String[] split = new String[5];
while(strmreader.Peek()!= -1)
for(i=0;i<5;i++)
strli] = strmreader.ReadLine();//以行为单位进行读取,赋予数组
//str[i]
split [i]split[i]= str[i].split(':')[1];//按照":"将文字分开,赋予数组
person1 = Convert.ToInt32(split[0]); //splt[0]的值赋予第一名
person2 = Convert.ToInt32(split[1]); //splt[1]的值赋予第一名
person3 = Convert.ToInt32(split[2]); //splt[2]的值赋予第一名
person4 = Convert.ToInt32(split[3]); //splt[3]的值赋予第一名
person5 = Convert.ToInt32(split[4]); //splt[4]的值赋予第一名
strmreader.Close(); //关闭流
fs.Close();
FileStream ffs = new
FileStream(path, FileMode.OpenOrCreate,
FileAccess.ReadWrite));
StreamWriter sw = new StreamWriter(ffs)//建立写文件流
if(_score > person1)//如果当前分数大于第一名,排序
{
person5=person4; person4 = person3; person3 = person2; person2 = person1;
person1=score;
}
else if(_score> person2)//如果当前分数大于第二名,排序
{
person5 = person4; person4 = person3; person3 = person2; person2=
_score;
}
else if(_score> person3)//如果当前分数大于第三名,排序
{
person5 = person4; person4 = person3; person3 =_score;
else if(_score> person4)//如果当前分数大于第四名,排序
{
person5 = person4; person4 =_score;
}
else if(_score > person5)//如果当前分数大于第五名,排序
{
person5 = _score;
//在文件中的文件内容
string ppl ="第一名:“+ Convert.ToString(person1);
string pp2 ="第二名:"+ Convert.ToString(person2);
string pp3 ="第三名:”+ Convert.ToString(person3);
string pp4 ="第四名:"+ Convert.ToString(person4);
string pp5 ="第五名"+ Convert.ToString(person5);
string
ppR= pp1+"r\n"+ pp2 +"r\n" + pp3 +"r\n"+ pp4+"r\n"+ pp5 +"r\n";
byte[] info = new UTF8Encoding(true).GetBytes(ppR);
sw.Write(ppR); //将内容写入文件
sw.Close();
ffs.Close();
}
Catch(Exception ex)
{
Console.WriteLine(ex.ToString());
}
S=s+""+ sC;
//Draw surface to display text;
MessageBox.Show(s); //在界面中显示排行榜内容
}
02、测试设计
下面将利用相关静态和动态(白盒测试、黑盒测试)方法对案例进行相应的测试,得到测试报告与错误列表,在实际项目中可进一步反馈给开发方进行Bug的确认与修复。
1. 代码走查
利用代码走查的方法检查该模块的代码,对代码质量进行初步评估。具体实现如表1所示。
■ 表1 代码走查情况记录
从表1的分析中可以看出,本模块的代码基本情况如下。
(1) 代码直观。
(2) 代码和设计文档对应。
(3) 无用的代码已经被删除。
(4) 注释过于简单。
2. 基本路径测试法
基本路径测试法是在程序控制流图的基础上,通过分析控制构造的环路复杂性,导出可执行的路径集合,从而设计测试用例的方法。首先需要简化程序模块,绘制程序模块如图2所示。接着按照模块图的设计路径来覆盖策略。主要可分为以下4步执行。
■ 图2 程序模块图
1) 绘制程序的控制流图
基本路径测试法的第一步是绘制控制流图,根据程序模块图的逻辑关系,获得该程序块的控制流图,如图3所示。
■ 图3 程序模块的控制流图
2) 计算环路复杂度
其次是根据控制流图计算环路复杂度,环路复杂度是一种为程序逻辑复杂性提供定量测度的软件度量,该度量将用于计算程序基本的独立路径数目,为确保所有语句至少执行一次的测试数量的上界。
V(G)=P+1=5+1=6
根据以上公式确定至少要覆盖6条路径。
3) 导出独立路径
根据控制流图可以方便地得到以下6条路径。
path1:1—2—11。
path2:1—3—4—11。
path3:1—3—5—6—11。
path4:1—3—5—7—8—11。
path5:1—3—5—7—9—10—11。
path6:1—3—5—7—9—11。
4) 设计测试用例
最后设定一组初始参数,以此来设计测试用例。令:
person1=23
person2=20
person3=10
person4=6
person5=4
作为测试输入,可设计测试用例如表2所示。
■ 表2 基本路径法测试用例
3. 边界值分析
边界值分析法利用输入变量的最小值、略大于最小值、输入范围内任意值、略小于最大值、最大值等来设计测试用例。
由于输入的只会是数据,且数据均大于0,因此可令:
person1 = 23
person2 = 20
person3 = 10
person4 = 6
person5 = 4
采用边界值法设计测试用例如表3所示。
■ 表3 边界值法测试用例
03、测试执行
将设计的测试用例整理合并为测试用例集合,必要时需要开发相应的驱动模块和桩模块。本次测试需要开发一个驱动模块,用于初始化相应的参数,并调用待测模块以达到测试效果。驱动模块代码如下。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main(){
public static void main(String[]args)
throws IOException{
int person1 = 23,person2 = 20, person3 = 10,person4 = 6,person5 = 4;
int score;
String s;
BufferedReader bf = new BufferedReader(newInputStreamReader(System.in));
s = bf.readLine():
score = Integer.valueOf(s);
_gameOver(score);
}
}
04、测试总结
测试结果可利用Bug记录平台进行记录,在实际项目中则可反馈给开发人员,由开发人员确认并修复。
测试结束后,形成测试报告。
相关文章:

软件测试用例经典方法 | 单元测试法案例
单元测试又称模块测试,是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验,检查程序在语法、格式和逻辑上的错误,并验证程序是否符合规范,以发现单元内部可能存在的各种缺陷。 单元测试的对象是软件设计的最…...
Leetcode 2967. Minimum Cost to Make Array Equalindromic
Leetcode 2967. Minimum Cost to Make Array Equalindromic 1. 解题思路2. 代码实现 题目链接:2967. Minimum Cost to Make Array Equalindromic 1. 解题思路 这一题其实我的思路有点笨,多少有点暴力求解的意思。 显然,如果我们给出全部的…...

【数据结构】什么是堆?
🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 堆的概念及结构 堆的定义如下: n个元素的序列{k1,k2,...,kn}当且仅当满足以下关系时,称之为堆. 或 把这个序列对应的一维数组(即以一维数组作此序列的存储结构)看成是一个…...

生产环境_Spark处理轨迹中跨越本初子午线的经度列
使用spark处理数据集,解决gis轨迹点在地图上跨本初子午线的问题,这个问题很复杂,先补充一版我写的 import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.sql.{Row, SparkSession} import org.apache.spark.sql.func…...

Vue前端与后端放在一起的搭建方式
1.首先把后端项目搭建好 去到项目的存放位置 2.然后cmd黑窗口输入命令创建vue项目 3.创建成功后回到后端项目进行合并 3.1在File处选择Project Structure 3.2选择模块 3.3找到自己的vue项目 3.4疯狂next最后create 3.5选择Apply并确定OK,恭喜您创建成功了 二、启动…...

SI24R03国产自主可控RISC-V架构MCU低功耗2.4GHz收发芯片SoC
目录 RISC-V架构的优势SI24R03/04特性射频收发器模块特征MCU 模块特征 其他特征 RISC-V架构的优势 相对于目前主流的英特尔X86架构及ARM等架构来说,RISC-V架构具有指令精简、模块化、可扩展、开源、免费等优点。RISC-V的基础指令集只有40多条,加上其他基…...

基于FPGA的温度控制系统设计(论文+源码)
1.系统设计 本次基于FPGA的智能温度控制系统,以FPGA为控制核心,采用自顶向下的设计方法,按照模块化设计的思路分别实现各个模块,再加以整合实现整个系统,从而达到了温度控制的目的。系统以水箱为被控对象,…...

C语言训练:三个字符串比较大小,实现两个整数数的交换统计二进制中1的个数
目录 一、编写程序,输入三个字符串,比较它们的大小,并将它们按由小到大的顺序输出。要求用函数、指针实现。要求:要采用函数调用,并用指向函数的指针作为函数的参数。 1.不使用函数指针作为参数,并自己模拟strcmp。 …...

module ‘tensorflow‘ has no attribute XXX 报错解决
问题描述: 粘了别人的tensorflow项目,运行总是报错module ‘tensorflow’ has no attribute什么什么 问题解决: 导入tensorflow的代码如下 import tensorflow as tf此时,某个某块报错,比如下面这个 那么就直接把tf.…...

MySQL数据库 DDL
目录 一、DDL 二、操作数据库 三、操作表 四、数据类型 五、表操作案例 六、修改表 七、删除表 一、DDL Data Definition Language,数据定义语言,用来定义数据库对象(数据库,表,字段) 。 二、操作数据库 (1&am…...

力扣二叉树--总结篇(2)
前言 总体回顾:11.18-12.14,中间有一个星期左右因为考试没有写题。37道题。 内容 这是第二阶段刷的题 从路径到构造二叉树,合并二叉树,再到二叉搜索树,公共祖先问题 看到二叉树,看到递归 都会想&#…...

小米移动端页面练习---重点:导航栏点击下箭头内容的切换以及样式,高亮显示的实现
效果图 1.html <div><header><div class"header-ad"><img src"./images/ad.png" alt"" srcset""></div><div class"header-two-section"><div class"logo"><div c…...

从零开始创建一个项目,springBoot+mybatisPlus+mysql+swagger+maven
一,前提 从零开始创建一个项目,绑定了数据库 用到的技术栈:springBootmybatisPlusmysqlswaggermaven 二,创建项目步骤 1,创建项目 创建出来的项目结构如图所示 2,修改配置文件 因为我比较习惯yml语言&…...
【视点合成】代码解读:生成demo视频
变换工具 def render_3dphoto(src_imgs, # 输入的源图像,维度为 [batch_size, 3, height, width]mpi_all_src, # 输入的所有源图像的MPI,维度为 [batch_size, num_planes, 4, height, width]disparity_all_src, # 所有源图像的视差信息&…...

Process On在线绘制流程图
目录 一.ProcessOn 1.1.介绍 1.2.直接网上使用 二.绘制门诊流程图 三.绘制住院流程图 四.绘制药库采购入库流程图 五.绘制OA会议流程图 今天就到这里了哦!!!希望能帮到你哦!!! 一.ProcessOn 1.1.介绍 ProcessOn(流程&#…...
【Hadoop-OBS-Hive】利用华为云存储对象 OBS 作为两个集群的中间栈 load 文件到 Hive
【Hadoop-OBS-Hive】利用华为云存储对象 OBS 作为两个集群的中间栈 load 文件到 Hive 1)压缩文件2)上传文件到 OBS 存储对象3)crontab 定时压缩上传4)从 obs 上拉取下来文件后解压缩5)判断对应文件是否存在6࿰…...
直线检测算子
hough_lines_dir 接口 hough_lines_dir(ImageDir : HoughImage, Lines : DirectionUncertainty, AngleResolution, Smoothing, FilterSize, Threshold, AngleGap, DistGap, GenLines : Angle, Dist) 参数 in: ImageDir :由边缘检测算子sobel_dir、edge_image获取的…...

如何在本地Docker中部署MinIO服务并实现远程访问管理界面
文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器,可以在各种环境中运行,例如本地、Docker容器、Kubernetes集群等。它兼…...
逛商场。。。
题目名字 逛商场 题意 见到想买的物品,只要能买得起,就一定会买下来之后才会继续往前走;如果买不起就直接跳过 思路 接着,它读取数组 aa 的值,并存储在数组中。然后,程序读取一个整数 m。初始化计数器 cn…...

RTrPPG
研究背景 心率 (HR) 和脉搏率变异性 (PRV) 是允许分析心脏行为的两个生理参数。心率监测可以通过接触式和非接触式的两种方法进行。通常用于测量 HR 和 PRV 的两种接触式技术是心电图 (ECG) 和光电容积脉搏波 (PPG)。 ECG 测量由心脏活动引起的电场。另一方面,PPG …...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...