当前位置: 首页 > news >正文

【单元测试】--编写单元测试

一、编写第一个单元测试

编写第一个单元测试通常包括以下步骤。以下示例以C#和NUnit为例:

  1. 创建测试项目
    • 在Visual Studio中,创建一个新的Class Library项目,这将是你的单元测试项目。
    • 在解决方案资源管理器中,右键点击项目,选择 “管理 NuGet 包”,然后搜索并安装NUnit框架(NuGet包名:NUnit)。
  2. 编写被测代码
    • 在同一解决方案中,创建或打开你的C#项目,这将是你的被测项目。
    • 在被测项目中,编写一个函数或方法,准备用于单元测试的代码。例如:
    public class Calculator
    {public int Add(int a, int b){return a + b;}
    }
    
  3. 编写第一个单元测试
    • 回到你的单元测试项目,在该项目中,创建一个新的测试类,以测试被测代码中的方法。
    • 在测试类中,使用 [Test] 特性标记你的测试方法,并使用断言来验证被测方法的行为。例如:
    using NUnit.Framework;[TestFixture]
    public class CalculatorTests
    {[Test]public void Add_TwoIntegers_ReturnsSum(){// ArrangeCalculator calculator = new Calculator();// Actint result = calculator.Add(2, 3);// AssertAssert.AreEqual(5, result);}
    }
    
  4. 运行单元测试
    • 在Visual Studio中,打开测试资源管理器(Test Explorer),它会自动发现你的NUnit测试。
    • 单击运行你的测试方法,或者使用Test Explorer中的运行按钮来执行所有测试。
  5. 检查测试结果
    • 在测试运行完成后,你将看到测试通过或失败的结果。
    • 你可以查看测试报告,了解哪些测试通过,哪些失败。

这是一个简单的NUnit单元测试的示例,展示了如何创建测试项目,编写测试用例,运行测试以及查看测试结果。随着你的项目复杂性的增加,你可以编写更多的测试用例来确保你的代码按预期工作。

二、常见的断言函数

NUnit 提供了多种常见的断言函数,用于验证测试的期望结果是否与实际结果一致。以下是一些常见的断言函数示例:

  1. Assert.AreEqual(expected, actual): 验证期望值与实际值相等。

    Assert.AreEqual(5, result); // 期望值为 5
    
  2. Assert.AreNotEqual(notExpected, actual): 验证期望值与实际值不相等。

    Assert.AreNotEqual(7, result); // 期望值不等于 7
    
  3. Assert.IsTrue(condition): 验证条件为真。

    Assert.IsTrue(result > 0); // 验证 result 大于 0
    
  4. Assert.IsFalse(condition): 验证条件为假。

    Assert.IsFalse(result < 0); // 验证 result 不小于 0
    
  5. Assert.IsNull(object): 验证对象为 null。

    Assert.IsNull(myObject); // 验证 myObject 为 null
    
  6. Assert.IsNotNull(object): 验证对象不为 null。

    Assert.IsNotNull(myObject); // 验证 myObject 不为 null
    
  7. Assert.Throws<ExceptionType>(delegate): 验证某个操作引发了特定类型的异常。

    Assert.Throws<DivideByZeroException>(() => calculator.Divide(5, 0));
    
  8. Assert.That(actual, constraint): 使用 NUnit 的约束条件(constraints)来验证实际值是否满足特定条件。这是一种非常灵活的断言方式。

    Assert.That(result, Is.GreaterThan(0)); // 验证 result 大于 0
    
  9. Assert.AreEqual(expected, actual, tolerance): 验证两个浮点数的相等性,允许一定的误差。

    Assert.AreEqual(0.1, 0.2, 0.1); // 验证 0.1 和 0.2 在误差范围内相等
    
  10. Assert.DoesNotThrow(delegate): 验证某个操作不引发任何异常。

    Assert.DoesNotThrow(() => calculator.Add(2, 3)); // 验证 Add 操作不引发异常
    

这些是一些常见的 NUnit 断言函数示例。根据测试需求,你可以选择合适的断言函数来验证代码的行为和结果。不同的断言函数提供了不同的验证方式,以确保代码的正确性。请根据你的测试场景选择适当的断言函数。

三、Arrange, Act, Assert

在单元测试中,遵循"Arrange, Act, Assert"(AAA)模式是一种良好的实践,它有助于组织和编写清晰、可维护的测试用例。这种模式将测试用例分为三个主要部分,分别是:

  1. Arrange(准备): 在这个阶段,你准备测试的前提条件,包括设置对象、模拟依赖、初始化变量等。你的目标是为测试用例创建一个干净的起点状态,以确保测试独立于其他因素。在NUnit中,通常在测试方法的开头执行这些准备操作。
    [Test]
    public void Test_AddTwoNumbers()
    {// ArrangeCalculator calculator = new Calculator();// Actint result = calculator.Add(2, 3);// AssertAssert.AreEqual(5, result);
    }
    
  2. Act(操作): 这一步中,你执行将要测试的操作或调用被测试的方法。在上述示例中,calculator.Add(2, 3) 是"操作"步骤。
  3. Assert(断言): 在这个阶段,你验证操作的结果是否与期望值一致。你使用NUnit的断言函数来断言测试的实际结果。如果断言失败,测试将失败。
    [Test]
    public void Test_AddTwoNumbers()
    {// ArrangeCalculator calculator = new Calculator();// Actint result = calculator.Add(2, 3);// AssertAssert.AreEqual(5, result);
    }
    

遵循AAA模式的优点包括:

  • 可读性:每个测试用例都有明确的结构,易于阅读和理解。
  • 易维护性:通过将准备、操作和断言步骤明确分开,更容易维护和修改测试用例。
  • 独立性:每个测试用例都应该是独立的,不受其他测试用例的影响。

总之,"Arrange, Act, Assert"是编写NUnit单元测试的一种良好实践,有助于确保测试用例的可读性、可维护性和可靠性。

四、总结

编写第一个单元测试通常包括创建测试项目,编写被测代码,编写第一个单元测试,运行单元测试,检查测试结果。NUnit提供了常见的断言函数,用于验证测试的期望结果。遵循"Arrange, Act, Assert"(AAA)模式是单元测试的良好实践,它将测试用例分为准备、操作和断言三个部分,以提高可读性和可维护性。

相关文章:

【单元测试】--编写单元测试

一、编写第一个单元测试 编写第一个单元测试通常包括以下步骤。以下示例以C#和NUnit为例&#xff1a; 创建测试项目&#xff1a; 在Visual Studio中&#xff0c;创建一个新的Class Library项目&#xff0c;这将是你的单元测试项目。在解决方案资源管理器中&#xff0c;右键点…...

ES(elasticsearch) - 三种姿势进行分页查询

1. from size 浅分页 "浅"分页可以理解为简单意义上的分页。它的原理很简单&#xff0c;就是查询前20条数据&#xff0c;然后截断前10条&#xff0c;只返回10-20的数据。这样其实白白浪费了前10条的查询。 GET test_dev/_search {"query": {"bool&…...

AQS是什么?AbstractQueuedSynchronizer之AQS原理及源码深度分析

文章目录 一、AQS概述1、什么是AQS2、技术解释3、基本原理4、AQS为什么这么重要 二、AQS数据结构1、AQS的结构2、ReentrantLock与AbstractQueuedSynchronizer3、AQS的state变量4、AQS的队列5、AQS的Node&#xff08;1&#xff09;Node的waitStatus&#xff08;2&#xff09;属性…...

【数据库】函数处理(文本处理函数、日期和时间处理函数、数值处理函数)

函数处理数据 算术运算函数文本处理函数日期和时间处理函数数值处理函数 算术运算 操作符说明加-减*乘/除 e . g . e.g. e.g. 列出 Orders 表中所有每项物品的 id&#xff0c;数量 quantity&#xff0c;单价 item_price&#xff0c;总价 expanded_price&#xff08;数量 * 单价…...

GEE案例——一个完整的火灾监测案例dNBR差异化归一化烧毁指数

差异化归一化烧毁指数 dNBR是"差异化归一化烧毁指数"的缩写。它是一种用于评估卫星图像中烧毁区域严重程度的遥感指数。dNBR值通过将火灾前的归一化烧毁指数(NBR)减去火灾后的NBR来计算得出。该指数常用于野火监测和评估。 dNBR(差异化归一化烧毁指数)是一种用…...

计算机算法分析与设计(20)---回溯法(0-1背包问题)

文章目录 1. 题目描述2. 算法思路3. 例题分析4. 代码编写 1. 题目描述 对于给定的 n n n 个物品&#xff0c;第 i i i 个物品的重量为 W i W_i Wi​&#xff0c;价值为 V i V_i Vi​&#xff0c;对于一个最多能装重量 c c c 的背包&#xff0c;应该如何选择放入包中的物品…...

什么是IO多路复用?Redis中对于IO多路复用的应用?

IO多路复用是一种高效的IO处理方式&#xff0c;它允许一个进程同时监控多个文件描述符&#xff08;包括套接字、管道等&#xff09;&#xff0c;并在有数据可读或可写时进行相应的处理。这种机制可以大大提高系统的并发处理能力&#xff0c;减少资源的占用和浪费。 在Redis中&…...

NanoPC-T4 RK3399:DTS之io-domain,FAN

前言: 之后所有改动均是基于rk3399-evb.dts修改以满足NanoPC-T4功能正常。 NanoPC-T4开发板上有一片散热风扇,本章将讲述使风扇正常工作起来的多种方法。 一:硬件分析 GPIO4_C6/PWM1:实际控制风扇引脚,GPIO与PWM复用 输入高电平1:FAN2pin电路导通,风扇转动 输入低电…...

vue3+vite+ts项目使用jQuery

1、安装jQuery npm install --save jquery 2、安装声明文件 npm install --save types/jquery 3、在需要的文件中引入 import $ from jquery...

一起学数据结构(10)——排序

从本文开始&#xff0c;通过若干篇文章展开对于数据结构中——排序的介绍。 1. 排序的概念&#xff1a; 将一堆杂乱无章的数据&#xff0c;通过一定的规律顺序排列起来。即将一个无序序列排列成一个有序序&#xff08;由小到大或者由大到小&#xff09;的运算。 在数据的排序中…...

php 数组基础/练习

数组 练习在最后 数组概述 概述与定义 数组中存储键值对 数组实际上是一个有序映射 key-value&#xff0c;可将其当成真正的数组、列表&#xff08;向量&#xff09;、散列表、字典、集合、栈、队列等 数组中的元素可以是任意类型的数据对象&#xff08;可以嵌套数组&#…...

Redbook Chapter 7: Query Optimization翻译批注

首先说明一下redbook上的几篇文章是做什么的。这几篇文章是通过几位作者对不同方面的论文进行阅读和筛选后&#xff0c;挑出其中具备代表性或者权威的论文来做分析&#xff0c;为读者提供阅读指导和建议&#xff0c;同时&#xff0c;也是对某个方面的论文进行高度的总结&#x…...

【分布式】大模型分布式训练入门与实践 - 04

大模型分布式训练 数据并行-Distributed Data Parallel1.1 背景1.2 PyTorch DDP1&#xff09; DDP训练流程2&#xff09;DistributedSampler3&#xff09;DataLoader: Parallelizing data loading4&#xff09;Data-parallel&#xff08;DP&#xff09;5&#xff09;DDP原理解析…...

欧拉图相关的生成与计数问题探究

最近学了一波国家集训队2018论文的最后一个专题。顺便带上了一些我的注解。 先放一波这个论文 1.基本概念 欧拉图问题是图论中的一类特殊的问题。在本文的介绍过程中&#xff0c;我们将会使用一些图 论术语。为了使本文叙述准确&#xff0c;本节将给出一些术语的定义。 定义…...

CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属性 渐变 前端开发入门笔记(七)

CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表&#xff08;Cascading Style Sheets&#xff09;。下面是一些常用的CSS3属性及其详细解释&#xff1a; border-radius&#xff1a;设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径&#xff0c;也可…...

小程序:如何合理规划分包使主包不超过2M

背景 做过小程序项目的同学应该都有这样的经历&#xff0c;项目做着做着&#xff0c;突然发现代码包的大小超过了 2M&#xff0c;小程序无法提审&#xff0c;然后痛苦的删文件改代码来减少包大小。 虽然我们也知道小程序给我们提供了分包的功能可以减少主包的大小&#xff0c…...

迭代器的封装与反向迭代器

一、反向迭代器 在list模拟实现的过程中&#xff0c;第一次接触了迭代器的封装&#xff0c;将list的指针封装成了一个新的类型&#xff0c;并且以迭代器的基本功能对其进行了运算符重载 反向迭代器是对正向迭代器的封装&#xff0c;并且体现了泛型编程的思想&#xff0c;任意…...

PHP项目学习笔记-萤火商城https://www.yiovo.com/doc

萤火商城学习笔记 注意事项关于建表增加页面流程前台页面的数据列表数据下拉列表的数据 关于时间的处理前台界面数据处理 多年没有碰过php代码了&#xff0c;这个项目不错&#xff0c;想好好学习下&#xff0c;持续更新 注意事项 打开APP_DEBUG有些时候改了前台页面后&#x…...

我国有多少个港口?

港口是什么&#xff1f; 港口是海洋运输中不可或缺的重要设施之一&#xff0c;是连接陆路和水路运输的重要节点。港口通常是指位于沿海地区的水陆交通枢纽&#xff0c;是船舶停靠、装卸货物、储存物资和维修船只的场所。港口一般由码头、泊位、仓库、货场、客运站等设施组成&a…...

uniapp实现登录组件之外区域置灰并引导登录

实现需求 每个页面需要根据用户是否登录决定是否显示登陆组件,登录组件半屏底部显示,登录组件之外区域置灰,功能按钮点击之后引导提示登录.页面效果如下: 实现思路说明 设置登录组件背景颜色为灰色,将页面分成登录区域(底部)和非登陆区域(上面灰色显示部分), 置灰区域添加…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

人机融合智能 | “人智交互”跨学科新领域

本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...