单元测试的编写

Python 单元测试示例

在 Python 中,通常使用 unittest 模块来编写单元测试。以下是一个简单的示例:

示例代码:calculator.py
# calculator.py
def add(a, b):return a + bdef subtract(a, b):return a - b
单元测试代码:test_calculator.py
import unittest
from calculator import add, subtractclass TestCalculator(unittest.TestCase):def test_add(self):self.assertEqual(add(2, 3), 5)self.assertEqual(add(-1, 1), 0)self.assertEqual(add(-1, -1), -2)def test_subtract(self):self.assertEqual(subtract(10, 5), 5)self.assertEqual(subtract(-1, -1), 0)self.assertEqual(subtract(-1, 1), -2)if __name__ == '__main__':unittest.main()
运行测试

在命令行中运行以下命令:

bash复制

python -m unittest test_calculator.py

Java 单元测试示例

在 Java 中,通常使用 JUnit 框架来编写单元测试。以下是一个简单的示例:

示例代码:Calculator.java
public class Calculator {public int add(int a, int b) {return a + b;}public int subtract(int a, int b) {return a - b;}
}
单元测试代码:CalculatorTest.java
import static org.junit.Assert.assertEquals;
import org.junit.Test;public class CalculatorTest {private Calculator calculator = new Calculator();@Testpublic void testAdd() {assertEquals(5, calculator.add(2, 3));assertEquals(0, calculator.add(-1, 1));assertEquals(-2, calculator.add(-1, -1));}@Testpublic void testSubtract() {assertEquals(5, calculator.subtract(10, 5));assertEquals(0, calculator.subtract(-1, -1));assertEquals(-2, calculator.subtract(-1, 1));}
}
运行测试

如果你使用的是 Maven 项目,可以在 pom.xml 中添加 JUnit 依赖:

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope>
</dependency>

然后在命令行中运行以下命令:

mvn test

如果你使用的是 Gradle 项目,可以在 build.gradle 中添加 JUnit 依赖:

dependencies {testImplementation 'junit:junit:4.13.2'
}

然后在命令行中运行以下命令:

./gradlew test

总结

  • Python:使用 unittest 模块编写单元测试,通过 assertEqual 等断言方法验证函数的返回值。

  • Java:使用 JUnit 框架编写单元测试,通过 assertEquals 等断言方法验证方法的返回值。

通过编写单元测试,可以确保代码的正确性,减少缺陷,并提高代码的可维护性。

单元测试是一种软件测试方法,用于验证软件中最小可测试单元(通常是函数或方法)的正确性。单元测试可以检测多种功能,确保每个单元在各种输入条件下都能正确运行。以下是单元测试可以检测的一些常见功能:

单元测试的功能:

1. 功能正确性

  • 验证功能逻辑:确保函数或方法的逻辑符合预期。

    • 示例:对于一个加法函数,确保 add(2, 3) 返回 5

  • 边界条件:测试函数在边界值上的行为。

    • 示例:对于一个排序函数,测试空数组、单元素数组和大量元素数组的排序结果。

  • 异常处理:验证函数在异常输入下的行为。

    • 示例:对于一个除法函数,确保在除数为零时抛出 ArithmeticError

2. 性能

  • 执行时间:测试函数的执行时间是否在预期范围内。

    • 示例:确保一个排序函数在大数据集上的执行时间不超过特定阈值。

  • 资源使用:测试函数对系统资源(如内存、CPU)的使用情况。

    • 示例:确保一个内存密集型函数不会导致内存泄漏。

3. 接口和契约

  • 输入验证:验证函数是否正确处理各种输入类型和格式。

    • 示例:对于一个 JSON 解析函数,确保它能正确处理合法和非法的 JSON 字符串。

  • 输出验证:验证函数的输出是否符合预期格式和内容。

    • 示例:对于一个日期格式化函数,确保输出的日期字符串符合指定的格式。

4. 错误处理

  • 错误抛出:验证函数在错误情况下是否抛出正确的异常。

    • 示例:对于一个文件读取函数,确保在文件不存在时抛出 FileNotFoundException

  • 错误恢复:验证函数在错误情况下是否能正确恢复。

    • 示例:对于一个网络请求函数,确保在请求失败后能重试或返回错误信息。

5. 边界条件

  • 最小值和最大值:测试函数在输入值的边界条件下的行为。

    • 示例:对于一个整数加法函数,测试其在 INT_MININT_MAX 时的行为。

  • 空值和默认值:测试函数在输入为空或默认值时的行为。

    • 示例:对于一个字符串处理函数,测试其在输入为空字符串时的行为。

6. 并发和线程安全

  • 并发执行:测试函数在多线程环境下的行为。

    • 示例:对于一个共享资源访问函数,确保在多线程访问时不会出现数据竞争或死锁。

  • 线程安全:验证函数是否在多线程环境下保持线程安全。

    • 示例:对于一个线程安全的队列实现,确保在多线程环境下不会出现数据丢失或重复。

7. 兼容性

  • 向后兼容性:验证函数在新版本中是否保持向后兼容。

    • 示例:对于一个 API 函数,确保在新版本中调用旧版本的代码不会失败。

  • 跨平台兼容性:测试函数在不同操作系统或环境下的行为。

    • 示例:对于一个文件路径处理函数,确保在 Windows 和 Linux 系统上都能正确处理路径。

8. 安全

  • 输入验证:验证函数是否正确处理恶意输入,防止注入攻击。

    • 示例:对于一个 SQL 查询函数,确保在输入包含 SQL 注入代码时不会执行非法查询。

  • 权限检查:验证函数是否正确处理权限问题。

    • 示例:对于一个文件写入函数,确保只有具有写入权限的用户才能执行写入操作。

9. 日志和监控

  • 日志记录:验证函数是否正确记录日志信息。

    • 示例:对于一个错误处理函数,确保在发生错误时记录详细的错误日志。

  • 监控指标:验证函数是否正确生成监控指标。

    • 示例:对于一个性能敏感的函数,确保在执行时生成性能监控指标。

10. 依赖关系

  • 依赖注入:验证函数是否正确处理依赖注入。

    • 示例:对于一个依赖数据库连接的函数,确保在注入不同的数据库连接时能正确执行。

  • 外部服务:验证函数是否正确处理外部服务的调用。

    • 示例:对于一个调用外部 API 的函数,确保在外部服务返回不同响应时能正确处理。

示例代码

以下是一个简单的 Python 示例,展示如何编写单元测试来检测多种功能:

示例代码:calculator.py
def add(a, b):return a + bdef subtract(a, b):if b > a:raise ValueError("Subtraction result cannot be negative")return a - b
单元测试代码:test_calculator.py
import unittest
from calculator import add, subtractclass TestCalculator(unittest.TestCase):def test_add(self):self.assertEqual(add(2, 3), 5)self.assertEqual(add(-1, 1), 0)self.assertEqual(add(-1, -1), -2)def test_subtract(self):self.assertEqual(subtract(10, 5), 5)self.assertEqual(subtract(1, 1), 0)with self.assertRaises(ValueError):subtract(1, 2)def test_add_performance(self):import timestart_time = time.time()add(1000000, 2000000)end_time = time.time()self.assertLess(end_time - start_time, 0.001)  # 确保执行时间小于 1 毫秒if __name__ == '__main__':unittest.main()

总结

单元测试可以检测多种功能,包括功能正确性、性能、接口和契约、错误处理、边界条件、并发和线程安全、兼容性、安全、日志和监控以及依赖关系。通过编写全面的单元测试,可以确保代码的正确性、稳定性和可维护性。

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

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

相关文章

大模型学习:从零到一实现一个BERT微调

目录 一、准备阶段 1.导入模块 2.指定使用的是GPU还是CPU 3.加载数据集 二、对数据添加词元和分词 1.根据BERT的预训练&#xff0c;我们要将一个句子的句头添加[CLS]句尾添加[SEP] 2.激活BERT词元分析器 3.填充句子为固定长度 代码解释&#xff1a; 三、数据处理 1.…

10组时尚复古美学自然冷色调肖像电影照片调色Lightroom预设 De La Mer – Nautical Lightroom Presets

De La Mer 预设系列包含 10 种真实的调色预设&#xff0c;适用于肖像、时尚和美术。为您的肖像摄影带来电影美学和个性&#xff01; De La Mer 预设非常适合专业人士和业余爱好者&#xff0c;可在桌面或移动设备上使用&#xff0c;为您的摄影项目提供轻松的工作流程。这套包括…

SDL多窗口多线程渲染技术解析

SDL多窗口多线程渲染技术解析 技术原理 SDL多线程模型与窗口管理 SDL通过SDL_Thread结构体实现跨平台线程管理。在多窗口场景中,每个窗口需关联独立的渲染器,且建议遵循以下原则: 窗口与渲染器绑定:每个窗口创建时生成专属渲染器(SDL_CreateRenderer),避免跨线程操作…

QT 跨平台发布指南

一、Windows 平台发布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 应用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 库 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…

L2-037 包装机 (分数25)(详解)

题目链接——L2-037 包装机 问题分析 这个题目就是模拟了物品在传送带和筐之间的传送过程。传送带用队列模拟&#xff0c;筐用栈模拟。 输入 3 4 4 GPLT PATA OMSA 3 2 3 0 1 2 0 2 2 0 -1输出 根据上述操作&#xff0c;输出的物品顺序是&#xff1a; MATA样例分析 初始…

机器学习的一百个概念(4)下采样

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

qt6下配置qopengl

qt部件选择 Qt 6&#xff1a;需要手动选择 Qt Shader Tools 和 Qt 5 Compatibility Module&#xff08;如果需要兼容旧代码&#xff09; cmake文件 cmake_minimum_required(VERSION 3.16) # Qt6 推荐最低 CMake 3.16 project(myself VERSION 0.1 LANGUAGES CXX)set(CMAKE_A…

数据安全系列4:密码技术的应用-接口调用的身份识别

传送门 数据安全系列1&#xff1a;开篇 数据安全系列2&#xff1a;单向散列函数概念 数据安全系列3&#xff1a;密码技术概述 什么是认证&#xff1f; 一谈到认证&#xff0c;多数人的反应可能就是"用户认证" 。就是应用系统如何识别用户的身份&#xff0c;直接…

STL之map和set

1. 关联式容器 vector、list、deque、 forward_list(C11)等&#xff0c;这些容器统称为序列式容器&#xff0c;因为其底层为线性序列的数据结构&#xff0c;里面存储的是元素本身。 关联式容器也是用来存储数据的&#xff0c;与序列式容器不同的是&#xff0c;其里面存储的是结…

Vue3 其它API Teleport 传送门

Vue3 其它API Teleport 传送门 在定义一个模态框时&#xff0c;父组件的filter属性会影响子组件的position属性&#xff0c;导致模态框定位错误使用Teleport解决这个问题把模态框代码传送到body标签下

C++练习

1.将File练习题&#xff0c;内部的FILE*描述符&#xff0c;改成int描述符 2。写一个类Fifo管道类。提高难度&#xff0c;什么都不提示。只要求&#xff1a;使用自己编写的Fifo类对象&#xff0c;实现2个终端之间互相聊天 file.cpp #include <iostream> #include <c…

《Python Web网站部署应知应会》No4:基于Flask的调用AI大模型的高性能博客网站的设计思路和实战(上)

基于Flask的调用AI大模型的高性能博客网站的设计思路和实战&#xff08;上&#xff09; 摘要 本文详细探讨了一个基于Flask框架的高性能博客系统的设计与实现&#xff0c;该系统集成了本地AI大模型生成内容的功能。我们重点关注如何在高并发、高负载状态下保持系统的高性能和…

实现一个简易版的前端监控 SDK

【简易版的前端监控系统】 1、Promise的错误如何监控&#xff1f;–promise不是所有都是接口请求 2、接口的报错如何监控&#xff1f;–全局监控sdk&#xff0c;不改动公共的请求方法、不改动业务代码&#xff1b;一般接口使用axios请求 3、资源的报错如何监控&#xff1f; 4、…

【操作系统】软中断vs硬中断

在操作系统中&#xff0c;中断&#xff08;Interrupt&#xff09; 是 CPU 响应外部事件的重要机制&#xff0c;分为 硬中断&#xff08;Hardware Interrupt&#xff09; 和 软中断&#xff08;Software Interrupt&#xff09;。它们的核心区别在于 触发方式 和 处理机制。 1. 硬…

力扣刷题-热题100题-第27题(c++、python)

21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/merge-two-sorted-lists/description/?envTypestudy-plan-v2&envIdtop-100-liked 常规法 创建一个新链表&#xff0c;遍历list1与list2&#xff0c;将新链表指向list1与list2…

Python包下载路径 Chrome用户数据 修改到非C盘

查看 site-packages 是否能通过命令行完成&#xff1f; 可以&#xff0c;使用以下命令&#xff08;不需写脚本&#xff09;&#xff1a; python -m site输出包含&#xff1a; sys.path site-packages 路径&#xff08;全局和用户级&#xff09; 如果只想看安装路径&#…

【鸿蒙5.0】鸿蒙登录界面 web嵌入(隐私页面加载)

在鸿蒙应用中嵌入 Web 页面并加载隐私页面&#xff0c;可借助 WebView 组件来实现。以下是一个完整示例&#xff0c;展示如何在鸿蒙 ArkTS 里嵌入 Web 页面并加载隐私政策页面。 在 HarmonyOS 应用开发中&#xff0c;如果你希望嵌入一个网页&#xff0c;并且特别关注隐私页面加…

AI加Python的文本数据情感分析流程效果展示与代码实现

本文所使用数据来自于梯田景区评价数据。 一、数据预处理 数据清洗 去除重复值、空值及无关字符(如表情符号、特殊符号等)。 提取中文文本,过滤非中文字符。 统一文本格式(如全角转半角、繁体转简体)。 中文分词与去停用词 使用 jieba 分词工具进行分词。 加载自定义词…

Microi吾码界面设计引擎之基础组件用法大全【内置组件篇·上】

&#x1f380;&#x1f380;&#x1f380; microi-pageengine 界面引擎系列 &#x1f380;&#x1f380;&#x1f380; 一、Microi吾码&#xff1a;一款高效、灵活的低代码开发开源框架【低代码框架】 二、Vue3项目快速集成界面引擎 三、Vue3 界面设计插件 microi-pageengine …

【多线程】单例模式和阻塞队列

目录 一.单例模式 1. 饿汉模式 2. 懒汉模式 二.阻塞队列 1. 阻塞队列的概念 2. BlockingQueue接口 3.生产者-消费者模型 4.模拟生产者-消费者模型 一.单例模式 单例模式&#xff08;Singleton Pattern&#xff09;是一种常用的软件设计模式&#xff0c;其核心思想是确保…