【单元测试】

一、框架

不同的编程语言有不同的测试框架,以下是一些常见的测试框架:

1)Java:JUnit、TestNG2)Python:unittest、pytest3)JavaScript:Jest、Mocha4)C#:NUnit、xUnit5)C++:Google Test

二、编写单元测试的步骤

1、确定测试目标

首先,明确你要测试的函数或方法的功能。例如,一个函数的目的是计算两个数的和,那么测试目标就是验证这个函数在各种输入下都能正确返回结果。

 2、编写测试用例

  • 正常输入:测试函数在正常输入下的行为。例如,对于加法函数,输入两个正数、两个负数、一个正数一个负数等。

  • 边界输入:测试函数在边界条件下的行为。例如,输入最大值、最小值、零等。

  • 异常输入:测试函数在异常输入下的行为。例如,输入非法类型(如字符串代替数字)、空值等。

  • 特殊输入:测试函数在特殊条件下的行为。例如,输入两个相同的数、输入两个相反数等。

3、编写测试代码(用例开发) 

  • 使用测试框架提供的语法和功能编写测试代码。以下是2个简单的例子:

1)示例:Python 中的单元测试

假设有一个函数 add,用于计算两个数的和:

Python复制

def add(a, b):return a + b

使用 unittest 框架编写单元测试:

Python复制

import unittestclass TestAddFunction(unittest.TestCase):def test_add_positive_numbers(self):self.assertEqual(add(2, 3), 5)def test_add_negative_numbers(self):self.assertEqual(add(-1, -1), -2)def test_add_zero(self):self.assertEqual(add(0, 0), 0)def test_add_mixed_numbers(self):self.assertEqual(add(-1, 1), 0)def test_add_with_non_numeric_input(self):with self.assertRaises(TypeError):add("a", 1)if __name__ == '__main__':unittest.main()
2)示例:Java 中的单元测试

假设有一个类 Calculator,其中有一个方法 add

java复制

public class Calculator {public int add(int a, int b) {return a + b;}
}

使用 JUnit 框架编写单元测试:

java复制

import static org.junit.Assert.assertEquals;
import org.junit.Test;public class CalculatorTest {@Testpublic void testAddPositiveNumbers() {assertEquals(5, new Calculator().add(2, 3));}@Testpublic void testAddNegativeNumbers() {assertEquals(-2, new Calculator().add(-1, -1));}@Testpublic void testAddZero() {assertEquals(0, new Calculator().add(0, 0));}@Testpublic void testAddMixedNumbers() {assertEquals(0, new Calculator().add(-1, 1));}
}

三、运行单元测试

  • 运行测试:使用测试框架提供的工具运行测试。例如,在 Python 中可以运行 unittest.main(),在 Java 中可以使用 IDE 的测试运行功能。

  • 检查结果:确保所有测试用例都通过。如果有测试失败,需要检查代码并修复问题。

四、维护单元测试

  • 更新测试用例:当代码发生变化时,需要更新测试用例以确保测试的完整性。

  • 持续集成:将单元测试集成到持续集成(CI)流程中,确保每次代码提交都能自动运行测试。

五、最佳实践(单测的应用)

  1. 测试覆盖率尽量提高测试覆盖率,确保代码的每个分支和逻辑都被测试到。

  2. 独立性:每个测试用例应该是独立的,不依赖于其他测试用例。

  3. 可读性:测试代码应该清晰易懂,便于维护。

  4. 自动化将单元测试集成到自动化测试流程中,确保每次代码提交都能自动运行测试。

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

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

相关文章

机器学习——XGBoost

XGBoost(极度梯度提升树,eXtreme Gradient Boosting)是基于GBDT的优化模型,其最大特性在于对GBDT的损失函数展开到二阶导数,使得其梯度提升树模型更接近其真实损失 其XGBoost分类树拟合和预测方法的基本思路为: 遍历所有的树&…

响应“一机两用”政策 ,实现政务外网安全

在数字化办公的浪潮下,企业与政务机构面临着既要保障数据安全,又要高效访问互联网的双重需求。“一机两用”成为解决这一难题的关键。 政策驱动,需求迫切 随着《网络安全法》《数据安全法》等法律法规的相继出台,网络安全防护的要…

【后端】【Django】Django DRF API 单元测试完整方案(基于 `TestCase`)

Django DRF API 单元测试完整方案(基于 TestCase) 一、方案概述 使用 django.test.TestCase 和 rest_framework.test.APIClient 进行 API 单元测试,确保 API 正确性、权限控制、数据返回格式、业务逻辑 等。 二、基本步骤 使用 setUp() 初始…

文生图语义识别插件使用(controlnet)

1. 插件下载(github) https://github.com/Mikubill/sd-webui-controlnet https://github.com/lllyasviel/ControlNet2. 模型下载(hugging face) https://github.com/Mikubill/sd-webui-controlnet/wiki/Model-download https://huggingface.co/bdsqlsz/qinglong_controlnet-l…

学者观察 | web3.0产业发展与技术融合——北京大学研究员肖臻

导语 肖臻老师认为在未来很长一段时间内,Web 3.0将和现在的Web 2.0共存。Web 3.0和人工智能(AI)的融合发展前景非常广阔,Web 3.0致力于打造去中心化的互联网生态系统,赋予用户更大的数据所有权和控制权,而…

【模型压缩+推理加速】知识蒸馏综述解读

知识蒸馏综述解读 论文: https://arxiv.org/abs/2006.05525 最近Deepseek R1的技术报告中,训练部分提到使用了知识蒸馏,就像系统性的看看蒸馏算法的原理。看了很多的博客,很多都没有详细把知识蒸馏系统的讲清楚。我们还是读一下…

vivo 湖仓架构的性能提升之旅

作者:郭小龙 vivo互联网 大数据高级研发工程师 导读:本文整理自 vivo互联网 大数据高级研发工程师 郭小龙 在 StarRocks 年度峰会上的分享,聚焦 vivo 大数据多维分析面临的挑战、StarRocks 落地方案及应用收益。 在 即席分析 场景&#xff0c…

代码随想录算法训练营第十四天| 226.翻转二叉树、101. 对称二叉树、104.二叉树的最大深度、111.二叉树的最小深度

今日题目 226.翻转二叉树 题目链接:226. 翻转二叉树 - 力扣(LeetCode) 思考:翻转二叉树,就是对每一个根节点,都交换左右节点,左右节点进入递归继续交换它们的左右节点。 代码: # De…

Java设计模式--单例模式

单例模式(构造器私有) 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一,有以下特点: 单例类只能有一个实例。 单例类必须自己创建自己的唯一实例。 单例类必须给所有其他对象提供这一实例。 反射可以破坏单例模式…

2025年如何避免使用验证码求解器时被IP封禁

引言 2025年,验证码求解器已成为自动化网络抓取和其他在线流程的关键工具。然而,自动化用户面临的一个常见挑战是IP封禁。当网站检测到自动化活动时,通常会阻止发出请求的IP地址,导致验证码挑战无法解决。本文将探讨使用验证码求…

JVM详解(包括JVM内存模型与GC垃圾回收)

📖前言: 学会使用Java对于一个程序员是远远不够的。Java语法的掌握只是一部分,另一部分就是需要掌握Java内部的工作原理,从编译到运行,到底是谁在帮我们完成工作的? 接下来着重对Java虚拟机,也就…

【无标题】大亚湾文化体育场多美啊。

请推荐一些常用并且免费的,可直接在线运行【Python】代码的平台并列出对应网址 好的,用户想让我推荐一些常用且免费的、可以直接在线运行Python代码的平台,并且需要列出对应的网址。我需要先回想一下自己知道的在线Python运行环境&#xff0…

权限提升—Windows权限提升土豆家族溢出漏洞通杀全系

前言 OK,Java安全更新不下去了,实在是太难啦啊,想起来提权这一块没怎么更新过,接下来都主要是更新提权这一块的文章了,Java安全的话以后有耐心再搞了。 手动提权 今天主要是讲这个手动的提权,手动提权相…

Vue3 知识点总结

Vue3 知识点总结 1. 核心概念 1.1 Composition API 1.1.1 setup 函数 setup是Vue3中的新的配置项,是组件内使用Composition API的入口在setup中定义的变量和方法需要return才能在模板中使用setup执行时机在beforeCreate之前,this不可用 export defa…

python --face_recognition(人脸识别,检测,特征提取,绘制鼻子,眼睛,嘴巴,眉毛)/活体检测

dlib 安装方法 之前博文 https://blog.csdn.net/weixin_44634704/article/details/141332644 环境: python3.8 opencv-python4.11.0.86 face_recognition1.3.0 dlib19.24.6人脸检测 import cv2 import face_recognition# 读取人脸图片 img cv2.imread(r"C:\Users\123\…

【bug】[42000][1067] Invalid default value for ‘xxx_time‘

MySQL错误解决:Invalid default value for xxx_time’问题分析与修复方案 问题描述 在MySQL数据库操作中,当尝试创建或修改表结构时,可能会遇到以下错误信息: [bug] [42000][1067] Invalid default value for xxx_time这个错误…

Go环境相关理解

Linux上安装的环境变量 ## set go env export GOPATH$HOME/go_workspace export GOPATH/usr/local/go export PATH$PATH:$GOPATH/bin go.mod 和go.sum的理解 go.mod文件 ‌go.mod文件定义了模块的路径和依赖版本‌。它遵循 语义化版本2.0.0规范,记录了当前项目所依…

Next.js 深度解析:全栈React框架的架构哲学与实践精髓

Next.js 作为 React 生态中最流行的全栈框架,已经超越了简单的SSR工具,发展成为完整的Web开发解决方案。以下从八个维度进行深度剖析: 一、核心架构设计 双引擎驱动模型 页面路由系统:基于文件系统的约定式路由渲染引擎&#xff…

禾赛盈利了,但激光雷达没有胜利

还远没有到激光雷达党欢呼的时候。 3月,随着禾赛科技公布2024年报,全世界第一家也是唯一一家实现全年盈利的激光雷达上市公司诞生,为了这个盈利目标,禾赛科技奋斗了十年。 但极大的出货量和不高的盈利水平,让禾赛科技…

心房颤动新机制:ATM/p53通路早期抑制

急性心肌梗死(AMI)是心血管疾病中的“大魔头”,它悄无声息地侵蚀着心脏的肌肉,导致心脏功能受损,严重时甚至危及生命。而心房颤动(AF),这一常见的心律失常,往往在AMI后悄…