【软件测试】详解软件测试中的测试级别
目录
- 一、测试级别
- 二、组件测试
- 三、开发者测试
- 3.1测试与调试
- 3.2 组件测试目标
- 3.3 测试功能
- 四、稳健性测试
- 4.1 效率的测试
- 4.2 测试可维护性
- 4.3 测试策略
- 4.4 白盒测试
一、测试级别
软件系统通常是由许多子系统组成的,而这些子系统又是由多个组件组成的,通常被称为单元或模块。由此产生的系统结构也被称为系统的 "软件结构 "或 “架构”。设计能完美支持系统要求的架构是软件开发过程中的关键部分。
在测试过程中,系统必须在其结构的每个层面上进行检查和测试,从最基本的组件一直到完整的集成系统。与架构的某一层次有关的测试活动被称为测试 “层次”,每个测试层次都是测试过程的一个实例。
以下各节将详细说明各个测试层次在不同的测试对象、测试目标、测试技术和责任/角色方面的区别。
二、组件测试
- 术语
组件测试包括系统地检查系统结构中的最低层组件。根据用于创建这些组件的编程语言,这些组件有不同的名称,如 “单元”、"模块 "或(在面向对象编程的情况下)“类”。因此,相应的测试被称为 “模块测试”、"单元测试 "或 “类测试”。
组件和组件测试
无论使用哪种编程语言,所产生的软件构件是 “组件”,相应的测试被称为 “组件测试”。
- 测试基础
组件的具体要求和组件的设计(即规格)要被参考以形成测试基础。为了设计白盒测试或评估代码覆盖率,你必须分析组件的源代码并将其作为额外的测试基础。然而,为了判断组件对测试用例的反应是否正确,你必须参考设计或需求文档。
- 测试对象
如上所述,模块、单元或类是典型的测试对象。然而,像shell脚本、数据库脚本、数据转换和迁移程序、数据库内容和配置文件也都可以成为测试对象。
- 组件测试验证了组件的内部功能
组件测试通常只测试与系统其他部分隔离的组件。这种隔离的作用是在测试中排除外部的影响。它还简化了测试用例的设计和自动化,因为它们的范围很窄。
组件可以由多个构建块组成。重要的一点是,组件测试只需要检查有关组件的内部功能,而不是与外部组件的交互。后者是集成测试的主题。组件测试对象通常是 “从程序员的硬盘中获得的”,这使得这一层次的测试与开发工作紧密相连。因此,组件测试人员需要足够的编程技能来正确地完成他们的工作。
案例研究: 测试calculate_price类
经销商折扣是从清单价格中减去的,而配件折扣只适用于额外的东西。这两种折扣不能同时使用。最后的价格是用以下方法计算的:

为了测试这个计算,测试人员通过调用calculate_price()方法和提供适当的测试数据来使用相应的类接口。然后,测试人员记录组件对这个调用的反应–即读取并记录方法调用所返回的值。
这段代码是有错误的:计算≥5的折扣的代码永远无法到达。这个编码错误可以作为例子来解释第五章详述的白盒分析。
要做到这一点,你需要 “测试驱动”。测试驱动是一个独立的程序,它进行所需的接口调用,并记录测试对象的反应(也见第5章)。
对于calculate_price()测试对象,简单的测试驱动可以是这样的:

我们例子中的测试驱动非常简单,例如,可以扩展到记录测试数据和带有时间戳的结果,或者从外部数据表中输入测试数据。
三、开发者测试
要写测试驱动,你需要编程技巧。你还必须研究和理解测试对象的代码(或者至少是它的接口的代码),以便编程正确调用测试对象的测试驱动。换句话说,你必须掌握相关的编程语言,你需要获得适当的编程工具。这就是为什么组件测试通常是由组件的开发者自己进行的。这样的测试通常被称为 “开发者测试”,尽管 "组件测试 "才是真正的意思。开发者测试自己的代码的缺点将在第2.4节讨论。
3.1测试与调试
组件测试经常与调试相混淆。然而,调试涉及消除缺陷,而测试涉及系统地检查系统的故障。
使用单元测试框架(比如pytest、unittest、junit等)大大减少了测试驱动编程的工作量,并在整个项目中创建一致的组件测试架构。使用标准化的测试驱动也使团队中不熟悉各个组件或测试环境的其他成员更容易进行组件测试。这些类型的测试驱动可以通过命令行界面控制,并提供处理测试数据的机制,以及记录和评估测试结果。因为所有的测试数据和日志都是相同的结构,所以有可能在多个(或所有)被测组件中评估结果。
3.2 组件测试目标
组件测试级别的特点是不仅有测试对象的类型和测试环境,而且有非常具体的测试目标。
3.3 测试功能
组件测试最重要的任务是检查测试对象是否完全正确地实现了其规范中定义的功能(这种测试也被称为 "功能测试 "或 “功能性测试”)。在这种情况下,功能等同于测试对象的输入/输出行为。为了检查实现的完整性和正确性,该组件要接受一系列的测试案例,每个案例都涵盖了输入和输出数据的特定组合。
案例研究: 测试VSR-II的价格计算
这种测试输入/输出数据的组合在上例中的测试案例中得到了很好的说明。每个测试用例都输入了特定的价格和特定数量的额外费用。然后测试用例检查测试对象是否计算出正确的总价格。
例如,测试用例#2检查 “五个或更多额外项目的折扣”。当测试用例#2被执行时,测试对象输出一个不正确的总价格。测试用例#2产生了一个故障,表明测试对象没有满足其对这个输入数据组合的指定要求。
组件测试揭示的典型故障是错误的计算或缺失(或选择不当)的程序路径(例如,被忽略或错误解释的特殊情况)。
四、稳健性测试
软件组件必须与多个相邻的组件进行交互和交换数据,不能保证该组件不会被错误地访问和使用(即违背其规范)。在这种情况下,被错误处理的组件不应该简单地停止工作并使系统崩溃,而是应该做出 "合理 "和稳健的反应。因此,测试稳健性是组件测试的另一个重要方面。这个过程与普通的功能测试非常相似,但是用无效的输入数据而不是有效的数据为被测组件服务。这样的测试案例也被称为 “负面测试”,并假设组件将产生合适的异常处理作为输出。如果没有内置足够的异常处理,组件可能会产生运行时错误,如除以零或空指针访问,导致系统崩溃。
案例研究: 负面测试
对于我们之前使用的价格计算的例子,负测试将涉及到用负的输入值或错误的数据类型(例如,char而不是int)7进行测试:
// testcase 20
price = calculate_price(-1000.00,0.00,0.00,0,0);
test_ok = test_ok && (ERR_CODE == INVALID_PRICE);...// testcase 30
price = calculate_price("abc",0.00,0.00,0,0);
test_ok = test_ok && (ERR_CODE == INVALID_ARGUMENT);
各种有趣的事情出现了:
除了功能和健壮性,组件测试还可以用来检查组件的其他属性,这些属性会影响其质量,并且只能在更高的测试级别上使用大量的额外工作来测试(如果有的话)。例如,非功能属性 "效率 "和 "可维护性 "。
4.1 效率的测试
效率属性表明一个组件与可用的计算资源的交互是多么的经济。这包括诸如内存使用、处理器使用、或执行功能或算法所需的时间等方面。与其他大多数测试目标不同,测试对象的效率可以使用合适的测试标准进行精确评估,如内存的千字节或以毫秒计算的响应时间。效率测试很少对系统中的所有组件进行测试。它通常只限于那些在需求目录或组件规范中定义了某些效率要求的组件。
例如,如果在嵌入式系统中可用的硬件资源有限,或者对于必须保证预定的响应时间限制的实时系统。
4.2 测试可维护性
可维护性包含了所有影响增强或扩展程序的容易程度(或困难程度)的属性。这里的关键因素是开发人员(团队)需要花费多少精力来掌握现有的程序和它的背景。这对于需要修改他多年前编程的系统的开发者和一个从同事那里接手代码的人来说,同样有效。
需要测试的可维护性的主要方面是代码结构、模块化、代码注释、文档的可理解性和最新性等等。
案例分析: 难以维护的代码
示例的calculate_price()代码包含许多可维护性问题。例如,完全没有代码注释,数字常量没有被声明,而是硬编码的。例如,如果需要修改这样的常量,就不清楚在系统中是否需要修改,以及在哪里需要修改,这就迫使开发者要花大力气去弄清楚。
像可维护性这样的属性当然不能用动态测试来检查(见第五章)。相反,你需要用静态测试和审查会议来分析系统的规范和代码库(见第4.3节)。然而,由于你要检查单个组件的属性,这种分析必须在组件测试的范围内进行。
4.3 测试策略
如前所述,组件测试是高度面向开发的。测试人员通常可以访问源代码,支持组件测试中面向白盒的测试技术。在这里,测试人员可以使用组件的内部结构、方法和变量的现有知识来设计测试用例(见5.2节)。
4.4 白盒测试
在测试执行过程中,源代码的可用性也是一个优势,因为你可以使用适当的调试工具(见第7.1.4节)来观察测试过程中变量的行为,看看组件的功能是否正常。调试器还可以让你操作组件的内部状态,所以在测试健壮性时,你可以故意启动异常。
calculate_price()代码包括以下值得测试的语句:
满足条件(discount > addon_discount)的额外测试案例很容易从代码中推导出来。但是价格计算规范没有包含相关的信息,相应的功能也不是需求的一部分。代码审查可以发现这样的缺陷,使你能够检查代码是否正确,规范是否需要改变,或者是否需要修改代码以适应规范。
然而,在许多实际情况下,组件测试 "只 "作为黑盒测试进行–换句话说,测试用例不是基于组件的内部结构。软件系统通常由成百上千个单独的构件组成,所以分析代码只对选定的组件真正实用。
在集成过程中,单个组件越来越多地被组合成更大的单元。这些集成单元可能已经大到无法彻底检查其代码。组件测试是在单个组件上进行还是在更大的单元(由多个组件组成)上进行,这是一个重要的决定,必须作为集成和测试计划过程的一部分。
相关文章:
【软件测试】详解软件测试中的测试级别
目录 一、测试级别二、组件测试三、开发者测试3.1测试与调试3.2 组件测试目标3.3 测试功能 四、稳健性测试4.1 效率的测试4.2 测试可维护性4.3 测试策略4.4 白盒测试 一、测试级别 软件系统通常是由许多子系统组成的,而这些子系统又是由多个组件组成的,…...
一条sql在MySQL中是怎么执行的
目录 一、MySQL总体架构二、各层的作用1、连接层2、应用层3、存储引擎层 一、MySQL总体架构 作为常问八股文,相信不少小伙伴当年都被问到过这个问题,回答这个问题我们首先得知道MySQL服务器基本架构,主要分为连接层,应用层和存储…...
Git | Dockerized GitLab 安装使用(简单实操版)
1. 详细步骤 1.1 安装启动 postgresql 服务 docker pull sameersbn/postgresql:14-20230628docker run --name gitlab-postgresql -d \--env DB_NAMEgitlabhq_production \--env DB_USERgitlab --env DB_PASSpassword \--env DB_EXTENSIONpg_trgm,btree_gist \--volume /srv/…...
SpringCloud简介 Ribbon Eureka 远程调用RestTemplate类 openfeign
〇、SpringCloud 0.区别于单体项目和soa架构,微服务架构每个服务独立,灵活。 1. spring cloud是一个完整的微服务框架,springCloud包括三个体系: spring cloud Netflix spring cloud Alibaba spring 其他 2.spring cloud 版本命名…...
微信小程序开发系列之-微信小程序性能优化
微信小程序开发系列之-微信小程序性能优化 性能优化是任何应用开发中的重要组成部分,尤其是在移动环境中。对于微信小程序而言,随着用户量的增加和应用功能的丰富,性能优化显得尤为关键。良好的性能不仅提升用户体验,还能增加用户…...
线程池面试集
目录 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优雅的停止一个线程? 线程池的核心线程数、最大线程数该如何设置? 如何理解Java并发中的可见性、原子性、有序性? Java死锁如何避免? 线程池中提交一个任务的流程是怎样的? 线程池有五种状态 如何优…...
从密码学看盲拍合约:智能合约的隐私与安全新革命!
文章目录 前言一、什么是盲拍合约?二、盲拍合约的优势1.时间压力的缓解2.绑定与秘密的挑战 三、盲拍合约的工作原理1.提交盲出价2.披露出价3.结束拍卖4.退款机制 四、代码示例总结 前言 随着区块链技术的发展,智能合约在各种场景中的应用越来越广泛。盲…...
c++学习笔记(47)
七、_public.cpp #include "_public.h" // 如果信号量已存在,获取信号量;如果信号量不存在,则创建它并初始化为 value。 // 如果用于互斥锁,value 填 1,sem_flg 填 SEM_UNDO。 // 如果用于生产消费者模型&am…...
软件设计之SSM(1)
软件设计之SSM(1) 路线图推荐: 【Java学习路线-极速版】【Java架构师技术图谱】 尚硅谷新版SSM框架全套视频教程,Spring6SpringBoot3最新SSM企业级开发 资料可以去尚硅谷官网免费领取 学习内容: Spring框架结构SpringIoC容器SpringIoC实践…...
STM32F745IE 能进定时器中断,无法进主循环
当你遇到STM32F745IE这类问题,即能够进入定时器中断但无法进入主循环(main() 函数中的循环),可能的原因和解决方法包括以下几个方面: 检查中断优先级和嵌套: 确保没有其他更高优先级的中断持续运行并阻止了主循环的执行。使用调试工具查看中断的进入和退出情况。检查中断…...
《凡人歌》中的IT职业启示录
《凡人歌》是由中央电视台、正午阳光、爱奇艺出品,简川訸执导,纪静蓉编剧,侯鸿亮任制片,殷桃、王骁领衔主演,章若楠、秦俊杰、张哲华、陈昊宇主演的都市话题剧 ,改编自纪静蓉的小说《我不是废柴》。该剧于2…...
go libreoffice word 转pdf
一、main.go 关键代码 完整代码 package mainimport ("fmt""github.com/jmoiron/sqlx""github.com/tealeg/xlsx""log""os/exec""path/filepath" ) import _ "github.com/go-sql-driver/mysql"import &q…...
打造双模兼容npm包:无缝支持require与import
为了实现一个npm包同时支持require和import,你需要确保你的包同时提供了CommonJS和ES6模块的入口点。这通常是通过在package.json文件中指定main和module字段来实现的,以及在构建过程中生成两种不同模块格式的文件。 以下是具体步骤: 设置pa…...
便捷将屏幕投射到安卓/iOS设备-屏幕投射到安卓/iOS设备,Windows/Mac电脑或智能电视上-供大家学习研究参考
1. 下载并安装软件(安卓苹果都需要) 确保 Android 设备和 Windows/Mac电脑都安装。启动应用程序并将 Android 设备和 Windows / Mac 了解到同一个wifi下面。 2、 发起投屏请求 在接收设备上:...
yolox训练自己的数据集
环境搭建 gpu按自己情况安装 nvidia-smi 查看自己的版本 CUDA和cudnn 按自己的安装,我的驱动551.76,注意不要用最新的,官网只要求驱动是大于等于,可以用低版本的cuda,我安装的是CUDA 11.1 cuda下载后,…...
Centos8.5.2111(1)之本地yum源搭建和docker部署与网络配置
由于后边可能要启动多个服务,避免服务之间相互干扰,本课程建议每个服务独立部署到一台主机上,这样做会导致资源占用过多,可能会影响系统的运行。服务器部署一般不采用GUI图形界面部署,而是采用命令行方式部署ÿ…...
基于SSM+小程序的自习室选座与门禁管理系统(自习室1)(源码+sql脚本+视频导入教程+文档)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 1、管理员实现了首页、基础数据管理、论坛管理、公告信息管理、用户管理、座位管理等 2、用户实现了在论坛模块通过发帖与评论帖子的方式进行信息讨论,也能对账户进行在线充值…...
支付宝远程收款api之小荷包跳转码
想要生成小荷包跳转码的二维码,需要进行以下步骤: 1、开通支付宝小荷包的收款功能权限 2、获取支付宝的小荷包收款码和支付宝账户的UID已经手机号等相应信息(可能会有变动) 3、可能需要一定的代码基础,讲所需信息填…...
STM32 F1移植FATFS文件系统 USMART组件测试相关函数功能
STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能 文章目录 STM32 F1移植FATFS文件系统 使用USMART调试组件测试相关函数功能前言部分主要相关代码# USMART介绍1. mf_scan_files 扫描磁盘文件2. mf_mount 挂载磁盘3. mf_open 打开文件4. mf_read 读数据内容5. mf…...
YOLOv8改进 | 融合篇,YOLOv8主干网络替换为MobileNetV3+CA注意机制+添加小目标检测层(全网独家首发,实现极限涨点)
原始 YOLOv8 训练结果: YOLOv8 + MobileNetV3改进后训练结果: YOLOv8 + MobileNetV3 + CA 注意机制 + 添加小目标检测层改进后训练结果(极限涨点): 摘要 小目标检测难点众多,导致很多算法对小目标的检测效果远不如大中型目标。影响算法性能的主要原因如下:第一,小目…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
