【单元测试】--编写单元测试
一、编写第一个单元测试
编写第一个单元测试通常包括以下步骤。以下示例以C#和NUnit为例:
- 创建测试项目:
- 在Visual Studio中,创建一个新的Class Library项目,这将是你的单元测试项目。
- 在解决方案资源管理器中,右键点击项目,选择 “管理 NuGet 包”,然后搜索并安装NUnit框架(NuGet包名:NUnit)。
- 编写被测代码:
- 在同一解决方案中,创建或打开你的C#项目,这将是你的被测项目。
- 在被测项目中,编写一个函数或方法,准备用于单元测试的代码。例如:
public class Calculator {public int Add(int a, int b){return a + b;} } - 编写第一个单元测试:
- 回到你的单元测试项目,在该项目中,创建一个新的测试类,以测试被测代码中的方法。
- 在测试类中,使用
[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);} } - 运行单元测试:
- 在Visual Studio中,打开测试资源管理器(Test Explorer),它会自动发现你的NUnit测试。
- 单击运行你的测试方法,或者使用Test Explorer中的运行按钮来执行所有测试。
- 检查测试结果:
- 在测试运行完成后,你将看到测试通过或失败的结果。
- 你可以查看测试报告,了解哪些测试通过,哪些失败。
这是一个简单的NUnit单元测试的示例,展示了如何创建测试项目,编写测试用例,运行测试以及查看测试结果。随着你的项目复杂性的增加,你可以编写更多的测试用例来确保你的代码按预期工作。
二、常见的断言函数
NUnit 提供了多种常见的断言函数,用于验证测试的期望结果是否与实际结果一致。以下是一些常见的断言函数示例:
-
Assert.AreEqual(expected, actual): 验证期望值与实际值相等。
Assert.AreEqual(5, result); // 期望值为 5 -
Assert.AreNotEqual(notExpected, actual): 验证期望值与实际值不相等。
Assert.AreNotEqual(7, result); // 期望值不等于 7 -
Assert.IsTrue(condition): 验证条件为真。
Assert.IsTrue(result > 0); // 验证 result 大于 0 -
Assert.IsFalse(condition): 验证条件为假。
Assert.IsFalse(result < 0); // 验证 result 不小于 0 -
Assert.IsNull(object): 验证对象为 null。
Assert.IsNull(myObject); // 验证 myObject 为 null -
Assert.IsNotNull(object): 验证对象不为 null。
Assert.IsNotNull(myObject); // 验证 myObject 不为 null -
Assert.Throws<ExceptionType>(delegate): 验证某个操作引发了特定类型的异常。
Assert.Throws<DivideByZeroException>(() => calculator.Divide(5, 0)); -
Assert.That(actual, constraint): 使用 NUnit 的约束条件(constraints)来验证实际值是否满足特定条件。这是一种非常灵活的断言方式。
Assert.That(result, Is.GreaterThan(0)); // 验证 result 大于 0 -
Assert.AreEqual(expected, actual, tolerance): 验证两个浮点数的相等性,允许一定的误差。
Assert.AreEqual(0.1, 0.2, 0.1); // 验证 0.1 和 0.2 在误差范围内相等 -
Assert.DoesNotThrow(delegate): 验证某个操作不引发任何异常。
Assert.DoesNotThrow(() => calculator.Add(2, 3)); // 验证 Add 操作不引发异常
这些是一些常见的 NUnit 断言函数示例。根据测试需求,你可以选择合适的断言函数来验证代码的行为和结果。不同的断言函数提供了不同的验证方式,以确保代码的正确性。请根据你的测试场景选择适当的断言函数。
三、Arrange, Act, Assert
在单元测试中,遵循"Arrange, Act, Assert"(AAA)模式是一种良好的实践,它有助于组织和编写清晰、可维护的测试用例。这种模式将测试用例分为三个主要部分,分别是:
- Arrange(准备): 在这个阶段,你准备测试的前提条件,包括设置对象、模拟依赖、初始化变量等。你的目标是为测试用例创建一个干净的起点状态,以确保测试独立于其他因素。在NUnit中,通常在测试方法的开头执行这些准备操作。
[Test] public void Test_AddTwoNumbers() {// ArrangeCalculator calculator = new Calculator();// Actint result = calculator.Add(2, 3);// AssertAssert.AreEqual(5, result); } - Act(操作): 这一步中,你执行将要测试的操作或调用被测试的方法。在上述示例中,
calculator.Add(2, 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为例: 创建测试项目: 在Visual Studio中,创建一个新的Class Library项目,这将是你的单元测试项目。在解决方案资源管理器中,右键点…...
ES(elasticsearch) - 三种姿势进行分页查询
1. from size 浅分页 "浅"分页可以理解为简单意义上的分页。它的原理很简单,就是查询前20条数据,然后截断前10条,只返回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(1)Node的waitStatus(2)属性…...
【数据库】函数处理(文本处理函数、日期和时间处理函数、数值处理函数)
函数处理数据 算术运算函数文本处理函数日期和时间处理函数数值处理函数 算术运算 操作符说明加-减*乘/除 e . g . e.g. e.g. 列出 Orders 表中所有每项物品的 id,数量 quantity,单价 item_price,总价 expanded_price(数量 * 单价…...
GEE案例——一个完整的火灾监测案例dNBR差异化归一化烧毁指数
差异化归一化烧毁指数 dNBR是"差异化归一化烧毁指数"的缩写。它是一种用于评估卫星图像中烧毁区域严重程度的遥感指数。dNBR值通过将火灾前的归一化烧毁指数(NBR)减去火灾后的NBR来计算得出。该指数常用于野火监测和评估。 dNBR(差异化归一化烧毁指数)是一种用…...
计算机算法分析与设计(20)---回溯法(0-1背包问题)
文章目录 1. 题目描述2. 算法思路3. 例题分析4. 代码编写 1. 题目描述 对于给定的 n n n 个物品,第 i i i 个物品的重量为 W i W_i Wi,价值为 V i V_i Vi,对于一个最多能装重量 c c c 的背包,应该如何选择放入包中的物品…...
什么是IO多路复用?Redis中对于IO多路复用的应用?
IO多路复用是一种高效的IO处理方式,它允许一个进程同时监控多个文件描述符(包括套接字、管道等),并在有数据可读或可写时进行相应的处理。这种机制可以大大提高系统的并发处理能力,减少资源的占用和浪费。 在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)——排序
从本文开始,通过若干篇文章展开对于数据结构中——排序的介绍。 1. 排序的概念: 将一堆杂乱无章的数据,通过一定的规律顺序排列起来。即将一个无序序列排列成一个有序序(由小到大或者由大到小)的运算。 在数据的排序中…...
php 数组基础/练习
数组 练习在最后 数组概述 概述与定义 数组中存储键值对 数组实际上是一个有序映射 key-value,可将其当成真正的数组、列表(向量)、散列表、字典、集合、栈、队列等 数组中的元素可以是任意类型的数据对象(可以嵌套数组&#…...
Redbook Chapter 7: Query Optimization翻译批注
首先说明一下redbook上的几篇文章是做什么的。这几篇文章是通过几位作者对不同方面的论文进行阅读和筛选后,挑出其中具备代表性或者权威的论文来做分析,为读者提供阅读指导和建议,同时,也是对某个方面的论文进行高度的总结&#x…...
【分布式】大模型分布式训练入门与实践 - 04
大模型分布式训练 数据并行-Distributed Data Parallel1.1 背景1.2 PyTorch DDP1) DDP训练流程2)DistributedSampler3)DataLoader: Parallelizing data loading4)Data-parallel(DP)5)DDP原理解析…...
欧拉图相关的生成与计数问题探究
最近学了一波国家集训队2018论文的最后一个专题。顺便带上了一些我的注解。 先放一波这个论文 1.基本概念 欧拉图问题是图论中的一类特殊的问题。在本文的介绍过程中,我们将会使用一些图 论术语。为了使本文叙述准确,本节将给出一些术语的定义。 定义…...
CSS3属性详解(一)文本 盒模型中的 box-ssize 属性 处理兼容性问题:私有前缀 边框 背景属性 渐变 前端开发入门笔记(七)
CSS3是用于为HTML文档添加样式和布局的最新版本的层叠样式表(Cascading Style Sheets)。下面是一些常用的CSS3属性及其详细解释: border-radius:设置元素的边框圆角的半径。可以使用四个值设置四个不同的圆角半径,也可…...
小程序:如何合理规划分包使主包不超过2M
背景 做过小程序项目的同学应该都有这样的经历,项目做着做着,突然发现代码包的大小超过了 2M,小程序无法提审,然后痛苦的删文件改代码来减少包大小。 虽然我们也知道小程序给我们提供了分包的功能可以减少主包的大小,…...
迭代器的封装与反向迭代器
一、反向迭代器 在list模拟实现的过程中,第一次接触了迭代器的封装,将list的指针封装成了一个新的类型,并且以迭代器的基本功能对其进行了运算符重载 反向迭代器是对正向迭代器的封装,并且体现了泛型编程的思想,任意…...
PHP项目学习笔记-萤火商城https://www.yiovo.com/doc
萤火商城学习笔记 注意事项关于建表增加页面流程前台页面的数据列表数据下拉列表的数据 关于时间的处理前台界面数据处理 多年没有碰过php代码了,这个项目不错,想好好学习下,持续更新 注意事项 打开APP_DEBUG有些时候改了前台页面后&#x…...
我国有多少个港口?
港口是什么? 港口是海洋运输中不可或缺的重要设施之一,是连接陆路和水路运输的重要节点。港口通常是指位于沿海地区的水陆交通枢纽,是船舶停靠、装卸货物、储存物资和维修船只的场所。港口一般由码头、泊位、仓库、货场、客运站等设施组成&a…...
uniapp实现登录组件之外区域置灰并引导登录
实现需求 每个页面需要根据用户是否登录决定是否显示登陆组件,登录组件半屏底部显示,登录组件之外区域置灰,功能按钮点击之后引导提示登录.页面效果如下: 实现思路说明 设置登录组件背景颜色为灰色,将页面分成登录区域(底部)和非登陆区域(上面灰色显示部分), 置灰区域添加…...
DuckDuckGo AI本地代理服务:开源工具部署与API调用指南
1. 项目概述:一个为DuckDuckGo AI聊天功能提供本地化服务的开源工具如果你和我一样,是个重度搜索用户,同时又对AI聊天功能有高频需求,那你肯定对DuckDuckGo不陌生。作为一个主打隐私保护的搜索引擎,它最近也跟上了潮流…...
告别繁琐:Windows平台I2C总线高效调试实战
1. Windows平台I2C调试痛点解析 第一次在Windows下调试I2C设备时,我对着示波器抓到的杂乱波形发呆了整整两小时。与Linux系统自带i2c-tools的便利性相比,Windows环境确实像个"二等公民"——直到我发现CH341A这个神器。这个售价不到20元的USB转…...
Claude Code安装+配置国产大模型+CC Switch
Claude Code 是一个运行在终端(Terminal)里的 AI 程序员。 它不仅仅是一个聊天框,它拥有操作你电脑文件的权限 https://code.claude.com/docs/en/setup 安装 前提条件 需要 Node.js 18 或更新版本 macOS 用户推荐使用 nvm 或 Homebrew 安装…...
终极Windows 11优化指南:使用Win11Debloat开源工具提升系统性能的完整方案
终极Windows 11优化指南:使用Win11Debloat开源工具提升系统性能的完整方案 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes …...
Ubuntu 20.04远程桌面翻车记:手把手教你从LightDM救回默认GNOME桌面
Ubuntu 20.04桌面环境救援指南:从LightDM回归GNOME的完整方案 那天下午,实验室的Ubuntu服务器突然变得陌生——熟悉的GNOME桌面消失了,取而代之的是一个简陋的登录界面。前一天还能流畅运行的深度学习模型,现在连Jupyter Noteboo…...
一个经典嵌入式问题:如何安全读取 64 位计时器
在一个嵌入式系统中,需要读取一个持续自增的 64-bit 硬件计时器。由于系统只能通过 32-bit MMIO register 访问该计时器,所以硬件把它拆成两个 32-bit 寄存器:#define TIMER_LOW_ADDR 0x40001000 #define TIMER_HIGH_ADDR 0x40001010其中&…...
如何在DS918+上免费开启Synology Photos人脸识别功能:完整补丁指南
如何在DS918上免费开启Synology Photos人脸识别功能:完整补丁指南 【免费下载链接】Synology_Photos_Face_Patch Synology Photos Facial Recognition Patch 项目地址: https://gitcode.com/gh_mirrors/sy/Synology_Photos_Face_Patch 你是否曾经在群晖DS918…...
如何让GBFR-Logs成为你的碧蓝幻想Relink战斗分析利器
如何让GBFR-Logs成为你的碧蓝幻想Relink战斗分析利器 【免费下载链接】gbfr-logs GBFR Logs lets you track damage statistics with a nice overlay DPS meter for Granblue Fantasy: Relink. 项目地址: https://gitcode.com/gh_mirrors/gb/gbfr-logs 你是否在《碧蓝幻…...
3分钟掌握:U校园智能刷课自动化终极实战指南
3分钟掌握:U校园智能刷课自动化终极实战指南 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 还在为重复的网课练习消耗宝贵时间而烦恼吗?AutoUnipus智能刷…...
Translumo:Windows平台实时屏幕翻译神器,打破语言障碍的终极解决方案
Translumo:Windows平台实时屏幕翻译神器,打破语言障碍的终极解决方案 【免费下载链接】Translumo Advanced real-time screen translator for games, hardcoded subtitles in videos, static text and etc. 项目地址: https://gitcode.com/gh_mirrors/…...
