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

Visual Studio 进行单元测试【入门】

摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试,包括创建测试项目、编写测试代码、运行测试以及查看结果。

1. 什么是单元测试🤔?

  • 定义:单元测试是对软件中最小可测试单元的验证。通常,这些单元是函数或方法。
  • 目的:确保每个单元按预期工作,便于发现和修复错误。

2. 设置 Visual Studio 环境

  • 安装 Visual Studio:确保您安装了包含 .NET 开发工具的 Visual Studio 版本。
  • 创建测试项目
    1. 打开 Visual Studio,选择“创建新项目”。
    2. 选择“ MSTest Test Project”模板。
    3. 命名项目并选择存储位置。
    4. 进入项目设置需要引用的项目

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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.WriteLineTestContext.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 进行单元测试【入门】

摘要&#xff1a;在软件开发中&#xff0c;单元测试是一种重要的实践&#xff0c;通过验证代码的正确性&#xff0c;帮助开发者提高代码质量。本文将介绍如何在VisualStudio中进行单元测试&#xff0c;包括创建测试项目、编写测试代码、运行测试以及查看结果。 1. 什么是单元测…...

Leetcode - 周赛435

目录 一、3442. 奇偶频次间的最大差值 I二、3443. K 次修改后的最大曼哈顿距离三、3444. 使数组包含目标值倍数的最少增量四、3445. 奇偶频次间的最大差值 II 一、3442. 奇偶频次间的最大差值 I 题目链接 本题使用数组统计字符串 s s s 中每个字符的出现次数&#xff0c;然后…...

CentOS本机配置为时间源

CentOS本机配置为时间源 安装chrony&#xff0c;默认已安装修改配置文件 /etc/chrony.conf客户端配置 安装chrony&#xff0c;默认已安装 yum -y install chrony修改配置文件 /etc/chrony.conf # cat /etc/chrony.conf | grep -Ev "^$|#" server ceph00 iburst dri…...

算法之 数论

文章目录 质数判断质数3115.质数的最大距离 质数筛选204.计数质数2761.和等于目标值的质数对 2521.数组乘积中的不同质因数数目 质数 质数的定义&#xff1a;除了本身和1&#xff0c;不能被其他小于它的数整除&#xff0c;最小的质数是 2 求解质数的几种方法 法1&#xff0c;根…...

Android车机DIY开发之软件篇(十二) AOSP12下载编译

Android车机DIY开发之软件篇(十二) AOSP12下载编译 sudo apt-get update sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib gmultilib libc6-dev-i386 lib32ncurses5-dev libx11-dev lib32z-dev ccache libgl1-mesa-…...

docker 导出导入

1第一步骤docker save docker save -o database-export-4.1.0.tar database-export-4.1.0.jar:latest 2检查镜像ls -l, 注意&#xff1a;文件可能没有其他文件导出权限&#xff1a;chmod 644 database-export-4.1.0.tar 3在新的服务器导入&#xff1a; docker load -i databa…...

OSPF高级特性(3):安全特效

引言 OSPF的基础我们已经结束学习了&#xff0c;接下来我们继续学习OSPF的高级特性。为了方便大家阅读&#xff0c;我会将高级特性的几篇链接放在末尾&#xff0c;所有链接都是站内的&#xff0c;大家点击即可阅读&#xff1a; OSPF基础&#xff08;1&#xff09;&#xff1a;工…...

基于SSM的农产品供销小程序+LW示例参考

1.项目介绍 系统角色&#xff1a;管理员、农户功能模块&#xff1a;用户管理、农户管理、产品分类管理、农产品管理、咨询管理、订单管理、收藏管理、购物车、充值、下单等技术选型&#xff1a;SSM&#xff0c;Vue&#xff08;后端管理web&#xff09;&#xff0c;uniapp等测试…...

自然语言处理NLP入门 -- 第二节预处理文本数据

在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;数据的质量直接影响模型的表现。文本预处理的目标是清理和标准化文本数据&#xff0c;使其适合机器学习或深度学习模型处理。本章介绍几种常见的文本预处理方法&#xff0c;并通过 Python 代码进行示例。 2.1 文本清理…...

android launcher拖动图标释放错位

由于为了设备流畅把所有动画效果设置为0.5&#xff0c;不设置为0是因为锁屏在开机时会有闪黑屏的现象。在此背景下&#xff0c;测试发现在拖动桌面图标时&#xff0c;在图标动画过程中错位时释放图标&#xff0c;则图标会留在错位的位置&#xff0c;不会自动对齐。 原因就是动…...

小结:OSPF的网络类型,LSA

OSPF&#xff08;Open Shortest Path First&#xff09;是一个基于链路状态的内部网关协议&#xff08;IGP&#xff09;。以下是对OSPF网络类型、LSA类型、序列号与Age作用&#xff0c;以及相关配置指令的详细讲解。 一、OSPF的网络类型 OSPF支持多种网络类型&#xff0c;不同…...

Unity URP的2D光照简介

官网工程&#xff0c;包括2d光照&#xff0c;动画&#xff0c;动效介绍&#xff1a; https://unity.com/cn/blog/games/happy-harvest-demo-latest-2d-techniques https://docs.unity3d.com/6000.0/Documentation/Manual/urp/Lights-2D-intro.html 人物脸部光照细节和脚上的阴影…...

笔试题笔记#3

1 一道bfs&#xff0c;唯一不同的是要对单链表中后继节点的编号排序 #include<bits/stdc.h> using namespace std;const int N10000;vector<int> headofNode[N]; int n,m; int d; bool st[N]; int parent[N]; vector<int> ans;void PrintAns(int i){//cout…...

Jenkins 部署 之 Mac 一

Jenkins 部署 之 Mac 一 一.Jenkins 部署依赖 JDK 环境 查看 Mac JDK 环境&#xff0c;如果没有安装&#xff0c;先安装 打开终端输入命令:java -version Mac安装配置 JDK 二. 检查 HomeBrew 安装 检查 HomeBrew 是否安装&#xff0c;终端输入命令:brew -v Mac安装HomeB…...

iOS Swift算法之KDF2

后端用Java开发的&#xff0c;用到了org.bouncycastle.crypto.generators.KDF2BytesGenerator&#xff0c;一开始在网上各种搜&#xff0c;没找到相关的接口或第三方库&#xff0c;白白浪费了几天时间&#xff0c;后面才想到照着Java代码自己实现&#xff0c;于是乎参考BaseKDF…...

钉钉位置偏移解决,钉钉虚拟定位打卡

虚拟定位打卡工具 一&#xff0c;介绍免费获取工具 一&#xff0c;介绍 提到上班打卡&#xff0c;职场人的内心戏估计能拍成一部连续剧。打卡&#xff0c;这俩字仿佛自带“紧箍咒”&#xff0c;让无数打工人又爱又恨。想象一下&#xff0c;你气喘吁吁地冲进办公室&#xff0c;…...

windows基于cpu安装pytorch运行faster-whisper-large-v3实现语音转文字

1.创建虚拟环境 conda create -n faster-whisper python3.10 conda activate faster-whisper 2.安装cpu版本的pytorch pip3 install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple 3.验证pytorch安装结果 (faster-whisper) H:\big-model\faste…...

写一个鼠标拖尾特效

思路和逻辑 要实现鼠标拖尾特效&#xff0c;我们需要&#xff1a; 监听鼠标移动事件&#xff0c;获取鼠标的当前位置。在每次鼠标移动时&#xff0c;绘制一个小圆点或其他形状在鼠标的当前位置。将所有绘制的圆点连接起来&#xff0c;形成一条“尾巴”。使用动画效果让尾巴看…...

《深度LSTM vs 普通LSTM:训练与效果的深度剖析》

在深度学习领域&#xff0c;长短期记忆网络&#xff08;LSTM&#xff09;以其出色的处理序列数据能力而备受瞩目。而深度LSTM作为LSTM的扩展形式&#xff0c;与普通LSTM在训练和效果上存在着一些显著的不同。 训练方面 参数数量与计算量&#xff1a;普通LSTM通常只有一层或较少…...

【使用 rimraf 闪电删除 node_modules 目录】

使用 rimraf 闪电删除 node_modules 目录 你是否还在为删除项目下庞大的 node_modules 苦苦挣扎。删除失败&#xff0c;权限不足&#xff0c;响应半天后&#xff0c;响应半天后的失败。快来试试 rimraf 闪电般删除吧&#xff01; 为什么需要专门工具删除 node_modules&#xff…...

使用DeepSeek和Kimi快速自动生成PPT

目录 步骤1&#xff1a;在DeepSeek中生成要制作的PPT主要大纲内容。 &#xff08;1&#xff09;在DeepSeek网页端生成 &#xff08;2&#xff09;在本地部署DeepSeek后&#xff0c;使用chatBox生成PPT内容 步骤2&#xff1a;将DeepSeek成的PPT内容复制到Kimi中 步骤3&…...

Webpack包

黑马程序员视频地址&#xff1a; Node.js与Webpack-16.Webpack简介以及体验 前言&#xff1a; 本篇中部分标题后标有数字&#xff0c;代表学习顺序 &#xff0c;同时也可以作为使用顺序参考 webpack包 基础认识 初步使用 下载webpack包和webpack-cli包 注意点&#xff1a; 1…...

鸿蒙HarmonyOS NEXT开发:横竖屏切换开发实践

文章目录 一、概述二、窗口旋转说明1、配置module.json5的orientation字段2、调用窗口的setPreferredOrientation方法 四、性能优化1、使用自定义组件冻结2、对图片使用autoResize3、排查一些耗时操作 四、常见场景示例1、视频类应用横竖屏开发2、游戏类应用横屏开发 五、其他常…...

flink判断两个事件之间有没有超时(不使用CEP)

1.为啥不使用cep呢&#xff0c;cep的超时时间设置不好配置化&#xff0c;无法满足扩展要求 2.超时怎么界定。A事件发生后&#xff0c;过了N时间&#xff0c;还没有收到B事件&#xff0c;算超时。 代码如下&#xff1a; import com.alibaba.fastjson.JSONObject; import lombo…...

数学建模与MATLAB实现:稳定状态模型与资源管理策略

引言 在实际问题中&#xff0c;动态过程的瞬时性态往往难以直接分析&#xff0c;而研究其稳定状态的特征则更具实际意义。本章介绍如何通过微分方程稳定性理论&#xff0c;结合再生资源管理、种群竞争等案例&#xff0c;分析系统的平衡点及稳定性&#xff0c;为实际决策提供数…...

爬虫代码中如何设置请求间隔?

在爬虫代码中设置请求间隔是确保爬虫稳定运行并避免对目标服务器造成过大压力的重要措施。合理设置请求间隔可以有效降低被目标网站封禁IP的风险&#xff0c;同时也有助于爬虫程序的稳定运行。以下是几种常见的方法来设置请求间隔&#xff1a; 一、使用time.sleep() time.sle…...

基于Spring Security 6的OAuth2 系列之十五 - 高级特性--客户端认证方式

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…...

bug-ant下拉框解决下拉框跟随表单容器(指定下拉框挂载容器):getPopupContainer=“p=>p.parentNode“

1.前言 getPopupContainer是Ant Design Vue&#xff08;简称Antd&#xff09;的<a-select>组件的一个属性&#xff0c;用于指定下拉框的挂载容器。默认情况下&#xff0c;下拉框会挂载到body元素上&#xff0c;但有时你可能需要将下拉框挂载到其他元素上&#xff0c;例如…...

驱动开发系列35 - Linux Graphics GEM Buffer Object 介绍

一:概述 在 Linux 内核中,DRM(Direct Rendering Manager)模块 是用于管理显示硬件和图形渲染的核心框架。它负责协调用户空间应用程序(例如 X Server、Wayland Compositors、Mesa 等)和 GPU 硬件之间的通信,是 Linux 图形子系统的重要组成部分。 GEM (Graphics Executio…...

网络安全检测思路

对于主机的安全检测&#xff0c;我们通常直接采用nmap或者类似软件进行扫描&#xff0c;然后针对主机操作系统及其 开放端口判断主机的安全程度&#xff0c;这当然是一种方法&#xff0c;但这种方法往往失之粗糙&#xff0c;我仔细考虑了一下&#xff0c;觉 得按下面的流程进行…...