【软件测试】详解软件测试中的测试级别

目录

    • 一、测试级别
    • 二、组件测试
    • 三、开发者测试
      • 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)的额外测试案例很容易从代码中推导出来。但是价格计算规范没有包含相关的信息,相应的功能也不是需求的一部分。代码审查可以发现这样的缺陷,使你能够检查代码是否正确,规范是否需要改变,或者是否需要修改代码以适应规范。

然而,在许多实际情况下,组件测试 "只 "作为黑盒测试进行–换句话说,测试用例不是基于组件的内部结构。软件系统通常由成百上千个单独的构件组成,所以分析代码只对选定的组件真正实用。

在集成过程中,单个组件越来越多地被组合成更大的单元。这些集成单元可能已经大到无法彻底检查其代码。组件测试是在单个组件上进行还是在更大的单元(由多个组件组成)上进行,这是一个重要的决定,必须作为集成和测试计划过程的一部分。

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

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

相关文章

VMware Aria Operations for Logs 8.18 发布,新增功能概览

VMware Aria Operations for Logs 8.18 - 集中式日志管理 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-logs/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 集中式日志管理 VMware Aria …

C#测试调用FreeSpire.PDFViewer浏览PDF文件

Free Spire.PDFViewer是商业版Spire.PDFViewer的社区版本,支持以控件形式打开并查看PDf文件,但由于是免费版本,存在使用限制,打开的PDF文档只显示前10页内容。如果日常操作的pdf文件都不超过10页,可以考虑使用Free Spi…

Redis: Sorted Set 底层算法的简单分析

概述 我们先看下 Shorted Set 有序集合的内部数据结构所谓有序集合,比如有个容器,容器里边都已经排好序了,那无非就是快速的查找和插入不管你是查找还是插入,肯定要确定那个位置最简单的办法就是从最开头开始,挨个比较…

【unity进阶知识6】Resources的使用,如何封装一个Resources资源管理器

文章目录 一、Unity资源加载的几种方式1、Inspector窗口拖拽2、Resources3、AssetBundle4、Addressables(可寻址资源系统)5、AssetDatabase 二、准备三、同步加载Resources资源1、Resources.Load同步加载单个资源1.1、基本加载1.2、加载指定类型的资源1.…

无源码实现免登录功能

因项目要求需要对一个没有源代码的老旧系统实现免登录功能,系统采用前后端分离的方式部署,登录时前端调用后台的认证接口,认证接口返回token信息,然后将token以json的方式存储到cookie中,格式如下: 这里有…

HTTPS加密流程

本文尽量用最小的篇幅来介绍HTTPS的加密过程,如果还看不懂可以参考文末尾的文章。 加密算法 先简单介绍一下HTTPS中使用的是混合加密算法,即对称加密和非对称加密的混合使用: 1.对称加密:顾名思义就是加密和解密都是使用同一个密钥。 优点…

MySQL 问题小结

mysqld --initialize 初始化 data 文件夹 初始化的密码在这个 err 文件夹中

DC00025【含论文】基于协同过滤推荐算法springboot视频推荐管理系统

1、项目功能演示 DC00025【含文档】基于springboot短视频推荐管理系统协同过滤算法视频推荐系统javaweb开发程序设计vue 2、项目功能描述 短视频推荐系统分为用户和系统管理员两个角色 2.1 用户角色 1、用户登录、用户注册 2、视频中心:信息查看、视频收藏、点赞、…

数据链路层 ——MAC

目录 MAC帧协议 mac地址 以太网帧格式 ARP协议 ARP报文格式​编辑 RARP 其他的网络服务或者协议 DNS ICMP协议 ping traceroute NAT技术 代理服务器 网络层负责规划转发路线,而链路层负责在网络节点之间的转发,也就是"一跳"的具体传输…

Qt_绘图

目录 1、绘图核心类 2、QPainter类的使用 2.1 绘制线段 2.2 绘制矩形 2.3 绘制圆形 2.4 绘制文本 3、QPen类的使用 3.1 使用画笔 4、QBrush类的使用 4.1 使用画刷 5、绘制图片 5.1 测试QPixmap 5.1.1 图片移动 5.1.2 图标缩小 5.1.3 旋转图片 5.1.4 将…

【四】Spring Cloud OpenFeign原理分析

Spring Cloud OpenFeign原理分析 概述 Spring Cloud 微服务实践也有挺多年了,一直想着总结一下这系列的知识点,最近终于下定决心来出一个Spring Cloud 系列文章了。本文主要围绕fegin组件来进行讲解,文中将会给出基础使用的示例,还…

docker-compose 快速部署clickhouse集群

在本教程中,我们将学习如何使用 Docker Compose 部署一个带有三节点的 ClickHouse 集群,并使用 ZooKeeper 作为分布式协调服务。 前提条件 注意事项: 镜像版本号注意保持一致 [zookeeper:3.7, clickhouse/clickhouse-server:22.5.4]config…

uniapp微信小程序使用ucharts遮挡自定义tabbar的最佳解决方案

如图所示: 使用的ucharts遮挡住了我自定义的tabbar(如果不是提需求的有病,我才不会去自定义tabbar) 查阅了不少文档,说是开启 ucharts 的 canvas2d 即可: 官网文档地址: uCharts官网 - 秋云…

资源《Arduino 扩展板1-LED灯》说明。

资源链接:Arduino 扩展板1-LED灯 1.文件明细: 2.文件内容说明 包含:AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程,采用AD做的。 该文件打板后配合Arduino使用,属于Arduino的扩展板。 该文件主要有…

深度学习自编码器 - 分布式表示篇

序言 深度学习作为人工智能领域的重要分支,其核心在于表示学习( Representation Learning \text{Representation Learning} Representation Learning),尤其是分布式表示( Distributed Representation \text{Distribut…

netty之基础aio,bio,nio

前言 在Java中,提供了一些关于使用IO的API,可以供开发者来读写外部数据和文件,我们称这些API为Java IO。IO是Java中比较重要知识点,且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能,目前有三种IO共…

Go基础学习06-Golang标准库container/list(双向链表)深入讲解;延迟初始化技术;Element;List;Ring

基础介绍 单向链表中的每个节点包含数据和指向下一个节点的指针。其特点是每个节点只知道下一个节点的位置,使得数据只能单向遍历。 示意图如下: 双向链表中的每个节点都包含指向前一个节点和后一个节点的指针。这使得在双向链表中可以从前向后或从后…

无人机之数据提取篇

一、无人机平台与传感器 无人机是进行数据采集的基础设施,其稳定性、可靠性、灵活性和负载能力直接影响到数据采集的效果。根据实际需求,需选择适合的无人机类型,如固定翼无人机适合大范围、长时间的数据采集,而多旋翼无人机则更适…

HTML基础用法介绍一

VS code 如何快速生成HTML骨架注释是什么?为什么要写注释?注释的标签是什么?标题标签段落标签换行标签与水平线标签 (都是单标签)文本格式化标签图片标签超链接标签音频标签视频标签 🚘正片开始 VS code 如何快速生成…

基于Spring框架的分层解耦详解

博客主页:誓则盟约系列专栏:Java Web关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Java Web 三层架构: Java Web可以大致被分为三层架构:…