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

news2025/2/13 20:06:31

摘要:在软件开发中,单元测试是一种重要的实践,通过验证代码的正确性,帮助开发者提高代码质量。本文将介绍如何在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()
        {
            // Arrange
            int a = 5;
            int b = 3;
            int expected = 8;
    
            // Act
            int result = Add(a, b);
    
            // Assert
            Assert.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 提供的强大工具,开发者可以轻松编写、运行和管理单元测试。希望本文能帮助您更好地理解和应用单元测试。

最后

您可以根据自己的理解和经验对以上内容进行修改和扩展。希望这篇博客能对其他开发者有所帮助!如果您有任何问题或需要进一步的帮助,请随时告诉我!
如果有帮助的话,能否给一个关注,谢谢🌹🌹🌹🌹

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

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

相关文章

Leetcode - 周赛435

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

算法之 数论

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

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等测试…

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 人物脸部光照细节和脚上的阴影…

Jenkins 部署 之 Mac 一

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

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

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

使用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、游戏类应用横屏开发 五、其他常…

基于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也升级…

排序合集之快排详解(二)

摘要&#xff1a;快速排序是一种在实践中广泛使用的高效排序算法。它基于分治策略&#xff0c;平均时间复杂度为O(n log n)&#xff0c;使其成为处理大型数据集的理想选择。本文将深入探讨快速排序的各种实现方式、优化技巧以及非递归实现&#xff0c;并通过C语言代码示例进行详…

前缀树算法篇:前缀信息的巧妙获取

前缀树算法篇&#xff1a;前缀信息的巧妙获取 那么前缀树算法是一个非常常用的算法&#xff0c;那么在介绍我们前缀树具体的原理以及实现上&#xff0c;我们先来说一下我们前缀树所应用的一个场景&#xff0c;那么在一个字符串的数据集合当中&#xff0c;那么我们查询我们某个字…

大数据系列 | 白话讲解大数据技术生态中Hadoop、Hive、Spark的关系介绍

大数据属于数据管理系统的范畴&#xff0c;数据管理系统无非就两个问题&#xff1a;数据怎么存、数据怎么算    现在的信息爆炸时代&#xff0c;一台服务器数据存不下&#xff0c;可以找10台服务器存储&#xff0c;10台存储不下&#xff0c;可以再找100台服务器存储。但是这1…

华为云函数计算FunctionGraph部署ollma+deepseek

1 概述 ollama和deepseek如果需要多实例&#xff0c;一种方式是部署在kubernetes集群中&#xff0c;一种是使用云厂商的云函数服务。云函数服务是按量付费&#xff0c;并且底层支持GPU&#xff0c;不需要维护kubernetes集群。本文介绍使用华为云函数计算FunctionGraph来部署ol…

尚硅谷爬虫note001

一、模板设置 file——setting——editor——code style——file and code template——python script # _*_ coding : utf-8 _*_ # Time : ${DATE} ${TIME} # Author : 20250206-里奥 # File : ${NAME} # Project : ${PROJECT_NAME} 二、数据类型 2-1. 数字 整型int 浮点型f…

35~37.ppt

目录 35.张秘书-《会计行业中长期人才发展规划》 题目​ 解析 36.颐和园公园&#xff08;25张PPT) 题目​ 解析 37.颐和园公园&#xff08;22张PPT) 题目 解析 35.张秘书-《会计行业中长期人才发展规划》 题目 解析 插入自定义的幻灯片&#xff1a;新建幻灯片→重用…

FPGA简介|结构、组成和应用

Field Programmable Gate Arrays&#xff08;FPGA&#xff0c;现场可编程逻辑门阵列&#xff09;&#xff0c;是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物&#xff0c; 是作为专用集成电路&#xff08;ASIC&#xff09;领域中的一种半定制电路而出现的&#xff0c…

4. React 中的 CSS

用例中的干净的脚手架的创建可以参考另一篇文章&#xff1a;3.React 组件化开发React官方并没有给出在React中统一的样式风格&#xff1a; 由此&#xff0c;从普通的css&#xff0c;到css modules&#xff0c;再到css in js&#xff0c;有几十种不同的解决方案&#xff0c;上百…