软件测试:1、单元测试

1. 单元测试的基本概念

  • 单元(Unit):软件系统的基本组成单位,可以是函数、模块、方法或类。

  • 单元测试(Unit Testing):对软件单元进行的测试,验证代码的正确性、规范性、安全性和性能。

  • 特点

    • 单元相互独立,互不影响。

    • 及时发现代码缺陷,降低纠错成本。

    • 主要由程序员负责,测试员辅助。

    • 可并行开展。

    • 依据《软件详细规格说明书》。

    • 以代码覆盖率作为评估标准。

    • 需要开发辅助的测试程序。

2. 动态测试

  • 驱动程序(Driver):模拟被测模块的上级模块,调用被测模块并传递测试数据。

  • 桩程序(Stub):模拟被测模块调用的下层模块,便于检查接口。

  • 示例:某程序将摄氏温度转换为华氏温度,测试GUI模块时需要配置驱动模块和桩模块。

3. 自动化单元测试框架JUnit

  • JUnit简介

    • 针对Java语言的单元测试框架,1997年由Erich Gamma和Kent Beck开发。

    • JUnit4对测试框架体系结构进行了重大调整,与JUnit3有较大不同。

    • JUnit的设计思想被抽象为xUnit框架,已移植到多种语言和环境中。

  • 技术特点

    • 简化测试代码编写。

    • 测试代码与产品代码分离。

    • 测试代码可自动运行。

    • 提供丰富的断言方法。

    • 支持固化方法(资源分配和释放)。

    • 可将测试用例组织成测试套件。

    • 支持文本和图形运行界面。

4. JUnit的测试类和测试方法

  • 测试类:包含测试代码,定义一组测试方法。

  • 测试方法:需满足以下条件:

    • 方法名用@Test注解修饰。

    • 必须用public void修饰。

    • 不带任何参数。

  • 示例

    java复制

    @Test
    public void test01() throws Exception {isu = new InsuredPerson(20, 'M', false);int p = isu.premium();assertEquals(600, p);
    }

5. JUnit的断言(Assertion)

  • 常用断言方法:

    • assertEquals(expected, actual):判断预期结果与实际结果是否相同。

    • assertArrayEquals(expected, actuals):判断数组是否相同。

    • assertSame(expected, actual):判断是否引用相同对象。

    • assertTrue(condition):判断条件是否为真。

    • assertNull(obj):判断对象是否为空。

    • fail():直接指示测试失败。

6. JUnit的固化方法(Fixture)

  • 固化方法:用于分配和释放资源。

    • @BeforeClass:类构造固化方法,测试前调用一次。

    • @AfterClass:类析构固化方法,测试后调用一次。

    • @Before:构造固化方法,每次执行测试方法前调用。

    • @After:析构固化方法,每次执行测试方法后调用。

  • 示例

    java复制

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {System.out.println("setUpBeforeClass");
    }
    @AfterClass
    public static void tearDownAfterClass() throws Exception {System.out.println("tearDownAfterClass");
    }
    @Before
    public void setUp() throws Exception {System.out.println("setUp");
    }
    @After
    public void tearDown() throws Exception {System.out.println("tearDown");
    }

7. 参数化测试

  • 参数化测试:将测试用例集组织在一个线性表中,JUnit框架遍历线性表,每次取出一条测试用例作为参数实例化一个测试类对象。

  • 参数化测试类的特征

    • @RunWith(Parameterized.class)注解修饰。

    • 定义一个存储测试用例的数据域集合。

    • 定义一个以测试用例为参数的构造方法。

    • 定义一个静态方法(用@Parameters注解修饰),返回测试用例线性表。

    • 定义至少一个测试方法。

8. 异常测试和超时测试

  • 异常测试:通过@Test(expected = 异常类.class)指定预期异常。

    java复制

    @Test(expected = Exception.class)
    public void test03() throws Exception {isu = new InsuredPerson(10, 'M', true);isu.premium();
    }
  • 超时测试:通过@Test(timeout = 超时时限)指定超时时间。

    java复制

    @Test(timeout = 1000)
    public void test() throws Exception {isu = new InsuredPerson(10, 'M', true);isu.premium();  /* 假设premium中包含超时操作 */
    }

9. 测试套件

  • 测试套件(Test Suite):一种特殊的测试类,包含若干其他测试类,执行测试套件即成批地自动执行套件中的所有测试类。

  • 特征

    • @RunWith(Suite.class)注解修饰。

    • @SuiteClasses({测试类1.class, 测试类2.class, ...})指定测试套件中包含的测试类。

    • 是一个空类,没有定义任何数据域和方法。

10. 实验练习提示

  • 教学目标:掌握JUnit的初级和高级用法,包括参数化测试类和编写测试套件。

  • 主要内容

    • 初级:核心运行器、固化方法、断言。

    • 高级:异常测试、参数化运行器、测试套件运行器。

  • 建议练习

    • 使用@Test注解的JUnit方法。

    • 使用assertEquals断言比较变量或对象。

    • 使用@Test(expected = Exception.class)注解的JUnit方法。

    • 使用@RunWith(Parameterized.class)@Parameters注解的JUnit方法。

    • 使用测试套件@RunWith(Suite.class)@SuiteClasses({})

总结

这份PPT详细介绍了单元测试的基本概念、JUnit框架的特点和使用方法,以及如何设计和运行测试用例。通过学习这些内容,可以掌握如何使用JUnit进行自动化单元测试,提高代码质量和测试效率。

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

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

相关文章

Leetcode.264 丑数 II

题目链接 Leetcode.264 丑数 II mid 题目描述 给你一个整数 n n n ,请你找出并返回第 n n n 个 丑数 。 丑数 就是质因子只包含 2 2 2、 3 3 3 和 5 5 5 的正整数。 示例1: 输入:n 10 输出:12 解释:[1, 2, 3,…

瑞芯微RV1126部署YOLOv8全流程:环境搭建、pt-onnx-rknn模型转换、C++推理代码、错误解决、优化、交叉编译第三方库

目录 1 环境搭建 2 交叉编译opencv 3 模型训练 4 模型转换 4.1 pt模型转onnx模型 4.2 onnx模型转rknn模型 4.2.1 安装rknn-toolkit 4.2.2 onn转成rknn模型 5 升级npu驱动 6 C++推理源码demo 6.1 原版demo 6.2 增加opencv读取图片的代码 7 交叉编译x264 ffmepg和op…

【Python爬虫(32)】从单飞 to 团战:Python多线程爬虫进化史

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取&#xff…

C#初级教程(1)——C# 与.NET 框架:探索微软平台编程的强大组合

图片来源: https://www.lvhang.site/docs/dotnettimeline 即梦AI - 一站式AI创作平台 一、历史发展脉络 在早期的微软平台编程中,常用的编程语言有 Visual Basic、C、C。到了 20 世纪 90 年代末,Win32 API、MFC(Microsoft Found…

【接口封装】——13、登录窗口的标题栏内容设置

解释&#xff1a; 1、封装内容&#xff1a;图标、文本内容、宽度 2、ui.iconLabel&#xff1a;在UI文件中的自定义命名 3、引入头文件&#xff1a;#include<qpixmap.h> 函数定义&#xff1a; #pragma once#include <QWidget> #include "ui_TitleBar.h"cl…

DeepSeek全生态接入指南:官方通道+三大云平台

DeepSeek全生态接入指南&#xff1a;官方通道三大云平台 一、官方资源入口 1.1 核心交互平台 &#x1f5a5;️ DeepSeek官网&#xff1a; https://chat.deepseek.com/ &#xff08;体验最新对话模型能力&#xff09; 二、客户端工具 OllamaChatboxCherry StudioAnythingLLM …

web安全:跨站请求伪造 (CSRF)

跨站请求伪造 (CSRF) ​ 跨站请求伪造&#xff08;CSRF&#xff0c;Cross-Site Request Forgery&#xff09; 是一种网络攻击方式&#xff0c;攻击者诱使受害者在未经其授权的情况下执行特定操作。CSRF 利用受害者已登录的身份和浏览器自动发送的认证信息&#xff08;如 Cooki…

前端ES面试题及参考答案

目录 let/const 与 var 的区别?TDZ 是什么? 箭头函数与普通函数的区别?箭头函数能否作为构造函数? 模板字符串的嵌套表达式和标签模板用法? 解构赋值的应用场景及对象 / 数组解构差异? 函数参数默认值的生效条件及暂时性死区问题? 展开运算符(...)在数组 / 对象中…

Windows 图形显示驱动开发-查询 WDDM(3.2) 功能支持和启用

查询 Windows 显示驱动程序模型 (WDDM) 功能的支持和启用。 其中介绍了&#xff1a; 用户模式和内核模式显示驱动程序&#xff08;UMD 和 KMD&#xff09;如何查询 OS&#xff0c;以确定 WDDM 功能在系统上是否受支持和已启用。 OS 如何确定驱动程序是否支持特定的 WDDM 功能…

MySQL InnoDB 存储引擎的索引详解

在 MySQL 中&#xff0c;InnoDB 是最常用的存储引擎&#xff0c;它支持事务、行级锁和外键约束等功能&#xff0c;而索引则是提升数据库查询性能的关键。在 InnoDB 存储引擎中&#xff0c;索引不仅仅是提高查询速度的工具&#xff0c;还是数据库的核心组成部分之一。本文将详细…

基于Spring Boot的RabbitMQ延时队列技术实现

文章目录 基于Spring Boot的RabbitMQ延时队列技术实现延时队列应用场景基本概念实现延时队列添加依赖基础配置配置类设计消息生产者消息消费者 两种TTL设置方式 订单超时关闭实例订单服务消息处理 延迟消息插件安装插件配置延迟交换机 基于Spring Boot的RabbitMQ延时队列技术实…

毕业项目推荐:基于yolov8/yolov5/yolo11的番茄成熟度检测识别系统(python+卷积神经网络)

文章目录 概要一、整体资源介绍技术要点功能展示&#xff1a;功能1 支持单张图片识别功能2 支持遍历文件夹识别功能3 支持识别视频文件功能4 支持摄像头识别功能5 支持结果文件导出&#xff08;xls格式&#xff09;功能6 支持切换检测到的目标查看 二、数据集三、算法介绍1. YO…

【智能客服】ChatGPT大模型话术优化落地方案

本文原创作者:姚瑞南 AI-agent 大模型运营专家,先后任职于美团、猎聘等中大厂AI训练专家和智能运营专家岗;多年人工智能行业智能产品运营及大模型落地经验,拥有AI外呼方向国家专利与PMP项目管理证书。(转载需经授权) 目录 一、项目背景 1.1 行业背景 1.2 业务现…

STM32的HAL库开发---单通道ADC采集(DMA读取)实验

一、实验简介 正常单通道ADC采集顺序是先开启ADC采集&#xff0c;然后等待ADC转换完成&#xff0c;也就是判断EOC位置1&#xff0c;然后再读取数据寄存器的值。 如果配置了DMA功能&#xff0c;在EOC位被硬件置1后&#xff0c;自动产生DMA请求&#xff0c;然后DMA进行数据搬运…

编译原理基础(1)

1.什么是ASCII码&#xff1f; ASCII码即美国信息交换标准代码&#xff0c;是基于拉丁字母的电脑编码系统&#xff0c;用于显示现代英语和部分西欧语言。其7位编码范围0-127&#xff0c;8位扩展到0-255。字符集含控制字符&#xff08;0-31、127&#xff0c;用于控制设备或表示通…

基于 Highcharts 实现 Vue 中的答题统计柱状图组件

在现代 Web 开发中&#xff0c;数据可视化是一个重要的组成部分&#xff0c;而 Highcharts 是一个广泛使用的 JavaScript 图表库&#xff0c;可以帮助开发者在 Web 页面上轻松地绘制丰富的图表。在本文中&#xff0c;我们将基于 Highcharts 创建一个用于答题统计的柱状图&#…

SQLAlchemyError: A transaction is already begun on this Session.

资料 sqlalchemy 事务 - 简书 在 SQLAlchemy 中&#xff0c;事务是通过会话来管理的。当你开始一个事务&#xff08;例如使用 async with db.begin()&#xff09;&#xff0c;它会开启一个新的事务&#xff0c;并在事务块结束时自动提交或回滚。如果在同一个会话中&#xff0c…

Java Web开发实战与项目——Spring Boot与Redis实现缓存管理

缓存技术在现代Web开发中至关重要&#xff0c;尤其是在高并发的环境中&#xff0c;缓存能够有效减少数据库访问压力、提高系统性能。Redis作为最流行的内存数据存储系统之一&#xff0c;常用于缓存管理。本节将讲解如何在Spring Boot项目中集成Redis&#xff0c;实现缓存管理&a…

C语言学习【1】C语言关于寄存器的封装

目录 1.封装寄存的C语言的语法volatile&#xff1a;unsigned int:*pGpiobOdrvolatile unsigned int * 2.进一步C语言的封装 在嵌入式中&#xff0c;底层一定是操作寄存器&#xff0c;我有一个理念&#xff0c;凡事一定要想清楚&#xff0c;把任何知识点融入自己的理解之中&…

#渗透测试#批量漏洞挖掘#畅捷通T+远程命令执行漏洞

免责声明 本教程仅为合法的教学目的而准备,严禁用于任何形式的违法犯罪活动及其他商业行为,在使用本教程前,您应确保该行为符合当地的法律法规,继续阅读即表示您需自行承担所有操作的后果,如有异议,请立即停止本文章读。 目录 一、漏洞概况 二、攻击特征 三、应急处置…