Visual Studio 进行单元测试【入门】
摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试,包括创建测试项目、编写测试代码、运行测试以及查看结果。
1. 什么是单元测试🤔?
- 定义:单元测试是对软件中最小可测试单元的验证。通常,这些单元是函数或方法。
- 目的:确保每个单元按预期工作,便于发现和修复错误。
2. 设置 Visual Studio 环境
- 安装 Visual Studio:确保您安装了包含 .NET 开发工具的 Visual Studio 版本。
- 创建测试项目:
- 打开 Visual Studio,选择“创建新项目”。
- 选择“ MSTest Test Project”模板。
- 命名项目并选择存储位置。
- 进入项目设置需要引用的项目





3. 编写测试代码
- 进入对应的测试项目 ,创建测试类:
[TestClass] public class ExampleTests {[TestMethod]public void TestAddition(){// Arrangeint a = 5;int b = 3;int expected = 8;// Actint result = Add(a, b);// AssertAssert.AreEqual(expected, result);}private int Add(int x, int y){return x + y;} }
4. 运行测试
-
打开“测试资源管理器”窗口(
测试->测试资源管理器)。
-
点击“运行所有”按钮,查看测试结果。
-
在测试资源管理器中,您可以看到每个测试的状态(通过、失败、跳过)。
-
点击失败的测试可以查看详细的错误信息和堆栈跟踪。

6. 常见问题及解决方案
- BadImageFormatException:确保项目的目标框架和平台一致。
- 测试输出不显示:使用
Debug.WriteLine或TestContext.WriteLine记录日志。
7.常用的单元测试语句
- 单元测试框架中集成了一些验证条件的语句,能够方便我们开发者对于测试结果进行判断,以下是一些常用的语句和关键概念。
7.1. Assert
Assert 是单元测试框架中用于验证条件的重要部分。它的主要作用是检查测试中的假设是否成立。如果假设不成立,测试将失败,并提供相关的错误信息。这有助于开发者快速识别和修复代码中的问题。
基本用法
在 C# 的 MSTest 框架中,Assert 类提供了多个静态方法来验证条件。以下是一些常用的 Assert 方法:
-
Assert.AreEqual(expected, actual):- 用于检查两个值是否相等。
- 示例:
Assert.AreEqual(5, Add(2, 3), "The addition result is incorrect.");
-
Assert.IsTrue(condition):- 用于检查条件是否为
true。 - 示例:
Assert.IsTrue(result > 0, "The result should be positive.");
- 用于检查条件是否为
-
Assert.IsFalse(condition):- 用于检查条件是否为
false。 - 示例:
Assert.IsFalse(result < 0, "The result should not be negative.");
- 用于检查条件是否为
-
Assert.IsNull(object):- 用于检查对象是否为
null。 - 示例:
Assert.IsNull(myObject, "The object should be null.");
- 用于检查对象是否为
-
Assert.IsNotNull(object):- 用于检查对象是否不为
null。 - 示例:
Assert.IsNotNull(myObject, "The object should not be null.");
- 用于检查对象是否不为
错误信息
在使用 Assert 方法时,您可以提供一个自定义错误信息,帮助您快速识别问题。例如:
Assert.AreEqual(expected, actual, "The addition result is incorrect.");
如果测试失败,输出的信息将会包含您提供的错误信息,使得调试更加方便。
7.2. Setup 和 Teardown
[TestInitialize]: 在每个测试方法运行之前执行的代码。[TestCleanup]: 在每个测试方法运行之后执行的代码。
[TestClass]
public class ExampleTests
{[TestInitialize]public void Setup(){// 初始化代码,例如创建共享对象或设置状态}[TestCleanup]public void Cleanup(){// 清理代码,例如释放资源}
}
7.3. 分类和特性
[TestClass]: 指示一个类包含测试方法。[TestMethod]: 指示一个方法是测试方法。[Ignore]: 暂时忽略某个测试方法。
[TestMethod]
[Ignore("This test is currently ignored.")]
public void TestIgnored()
{// 测试代码
}
7.4. 数据驱动测试
使用 [DataRow] 特性来创建数据驱动测试,可以使用不同的数据集多次运行同一测试方法。
[TestMethod]
[DataRow(2, 3, 5)]
[DataRow(5, 7, 12)]
public void TestAddition(int a, int b, int expected)
{int actual = Add(a, b);Assert.AreEqual(expected, actual);
}
7.5. 异常测试
使用 Assert.ThrowsException<T> 来验证是否抛出特定类型的异常。
[TestMethod]
public void TestException()
{Assert.ThrowsException<ArgumentException>(() =>{// 调用会抛出异常的方法MethodThatThrowsException();});
}
7.6. Mocking
在测试中使用 Mock 对象来模拟依赖项的行为,通常使用像 Moq 这样的库。
var mockService = new Mock<IMyService>();
mockService.Setup(s => s.GetData()).Returns("Mocked Data");var result = myClassUnderTest.MethodUsingService(mockService.Object);
7.7. 测试分类
使用 [TestCategory] 特性将测试分组,以便于管理和运行特定类别的测试。
[TestMethod]
[TestCategory("Integration")]
public void TestIntegration()
{// 测试代码
}
结论
单元测试是提高代码质量和可靠性的有效方法。通过 Visual Studio 提供的强大工具,开发者可以轻松编写、运行和管理单元测试。希望本文能帮助您更好地理解和应用单元测试。
最后
您可以根据自己的理解和经验对以上内容进行修改和扩展。希望这篇博客能对其他开发者有所帮助!如果您有任何问题或需要进一步的帮助,请随时告诉我!
如果有帮助的话,能否给一个关注,谢谢🌹🌹🌹🌹
相关文章:
Visual Studio 进行单元测试【入门】
摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试,包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...
【经验分享】Linux 系统安装后内核参数优化
在 Linux 系统安装后,进行内核优化有助于提升系统的性能、稳定性和安全性。以下是一些常见的内核优化操作: 修改/etc/sysctl.conf 文件 执行sysctl -p使配置生效。 kernel.shmmax 135185569792 kernel.shmall 4294967296 fs.aio-max-nr 3145728 fs.fi…...
linux统计文件夹下有多少个.rst文件行数小于4行
您可以使用 find 命令结合 wc 命令来统计文件夹下 .rst 文件行数小于 4 行的文件数量。以下是一个具体的命令示例: find /path/to/directory -name "*.rst" -type f -exec wc -l {} | awk $1 < 4 | wc -l解释: find /path/to/directory …...
使用开源项目xxl-cache构建多级缓存
xxl-cache简介 官网地址:https://www.xuxueli.com/xxl-cache/ 概述 XXL-CACHE 是一个 多级缓存框架,高效组合本地缓存和分布式缓存(RedisCaffeine),支持“多级缓存、一致性保障、TTL、Category隔离、防穿透”等能力;拥有“高性…...
LVDS接口总结--(5)IDELAY3仿真
仿真参考资料如下: https://zhuanlan.zhihu.com/p/386057087 timescale 1 ns/1 ps module tb_idelay3_ctrl();parameter REF_CLK 2.5 ; // 400MHzparameter DIN_CLK 3.3 ; // 300MHzreg ref_clk ;reg …...
Vue3(1)
一.create-vue // new Vue() 创建一个应用实例 > createApp() // createRouter() createStore() // 将创建实例进行了封装,保证每个实例的独立封闭性import { createApp } from vue import App from ./App.vue// mount 设置挂载点 #app (id为app的盒子) createA…...
玩转适配器模式
文章目录 解决方案现实的举例适用场景实现方式适配器模式优缺点优点:缺点:适配器模式可比上一篇的工厂模式好理解多了,工厂模式要具有抽象的思维。这个适配器模式,正如字面意思,就是要去适配某一件物品。 假如你正在开发一款股票市场监测程序, 它会从不同来源下载 XML 格…...
2.11寒假作业
web:[SWPUCTF 2022 新生赛]js_sign 打开环境是这样的,随便输入进行看看 提示错误,看源码其中的js代码 这个代码很容易理解,要让输入的内容等于对应的字符串,显然直接复制粘贴是错的 这串字符看起来像是base64加密&…...
untiy 冰面与地面,物理材质的影响
效果 WeChat_20250211165601...
视频编解码标准中的 Profile 和 Level
视频编解码标准中的 Profile 和 Level 在视频编码标准(如 H.264/AVC、HEVC/H.265、H.266/VVC、AV1)中,Profile(配置文件) 和 Level(级别) 是两个重要的概念,它们用于定义编码器和解码器支持的特性、功能以及视频质量与编码效率之间的权衡。 Profile(配置文件) Pro…...
通用的将jar制作成docker镜像sh脚本
通用的将jar制作成docker镜像sh脚本 为了在将 JAR 制作成 Docker 镜像的过程中创建日志目录,可以对之前的脚本进行扩展。以下是改进后的脚本,会在镜像构建时在容器内创建日志目录,并将日志文件挂载到该目录下。 在生成的 Dockerfile 中添加…...
AUTOGPT:基于GPT模型开发的实验性开源应用程序; 目标设定与分解 ;;自主思考与决策 ;;信息交互与执行
目录 AUTOGPT是一款基于GPT模型开发的实验性开源应用程序目标设定与分解自主思考与决策信息交互与执行AUTOGPT是一款基于GPT模型开发的实验性开源应用程序 目标设定与分解 自主思考与决策 信息交互与执行 AUTOGPT是一款基于GPT模型开发的实验性开源应用程序,它能让大语言模…...
异步线程中使用RestTemplate注入空指针解决
在某种情况下,调用第三方或者jar文件中封装的httpClient时,上层调用采用异步线程调用,导致底层的RestTemplate注入为空,无法正常调用,需要强制将spring的上下文绑定到异步线程中。 强制传递 Spring 上下文到异步线程 …...
2024BaseCTF_week4_web上
继续!冲冲冲 目录 圣钥之战1.0 nodejs 原型 原型链 原型链污染 回到题目 flag直接读取不就行了? 圣钥之战1.0 from flask import Flask,request import jsonapp Flask(__name__)def merge(src, dst):for k, v in src.items():if hasattr(dst, __geti…...
说一下 jvm 有哪些垃圾回收器?
JVM 垃圾回收器对比表 垃圾回收器类型工作方式回收方式停顿时间适用场景优点缺点常见问题常见配置Serial GC串行单线程,STW年轻代:复制算法 老年代:标记-整理长小内存、单核CPU,如桌面应用或嵌入式设备简单高效,适用于…...
react国际化配置react-i18next详解
react PC端项目构建TS,react18.2.0antdviteaxiosreduxsassts 完整版代码下载: https://download.csdn.net/download/randy521520/88922625 react PC端项目构建,react18.2.0antdviteaxiosreduxsass完整版代码下载: https://downloa…...
Java并发编程——上下文切换、死锁、资源限制
文章目录 1.1上下文切换(1)上下文切换的概念(2)多线程一定比单线程快吗?(3)测量上下文切换如何减少上下文切换 1.2 死锁(1)死锁的定义(2)死锁产生…...
MS08067练武场--WP
免责声明:本文仅用于学习和研究目的,不鼓励或支持任何非法活动。所有技术内容仅供个人技术提升使用,未经授权不得用于攻击、侵犯或破坏他人系统。我们不对因使用本文内容而引起的任何法律责任或损失承担责任。 注:此文章为快速通关…...
ubuntu文件同步
1. 使用 rsync 同步文件 rsync 是一个常用的文件同步工具,可以在本地或远程系统之间同步文件和目录。 基本用法: rsync -avz /源目录/ 目标目录/-a:归档模式,保留文件属性。-v:显示详细输出。-z:压缩传输…...
C++23 新特性解析
引言:C的持续进化 在ISO C标准委员会的不懈努力下,C23作为继C20后的又一重要迭代版本,带来了十余项核心语言特性改进和数十项标准库增强。本文将深入解析最具实用价值的五大新特性,介绍std::expected到模块化革命。 编译器支持 …...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
STM32---外部32.768K晶振(LSE)无法起振问题
晶振是否起振主要就检查两个1、晶振与MCU是否兼容;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容(CL)与匹配电容(CL1、CL2)的关系 2. 如何选择 CL1 和 CL…...
