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 提供的强大工具,开发者可以轻松编写、运行和管理单元测试。希望本文能帮助您更好地理解和应用单元测试。

最后

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

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

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

相关文章

解决珠玑妙算游戏问题:C 语言实现

一、引言 珠玑妙算游戏&#xff08;the game of master mind&#xff09;是一个有趣的逻辑推理游戏。在编程领域&#xff0c;我们可以通过编写代码来模拟游戏中计算猜中与伪猜中次数的过程。本文将详细介绍如何使用 C 语言实现这一功能&#xff0c;并对核心代码进行解析。 二、…

查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串

您可以使用以下 SQL 查询语句来提取 detail 字段中包含 oss.kxlist.com 的 URL 里的 commodity/ 后面的数字串&#xff1a; <p><img style"max-width:100%;" src"https://oss.kxlist.com//8a989a0c55e4a7900155e7fd7971000b/commodity/20170925/20170…

NLP名词解释

序号 NLP层次 名词 解释 1 词法 分词/词性标注 一句话以词切分&#xff0c;NLP第一步&#xff0c;切分的词做词性标注&#xff0c;如动词、名词、谓词等。 实体识别 分词后的实体抽取识别&#xff0c;实体如地点、日期、人物等 实体链接 实体和实体组合链接的物理信…

2024BaseCTF_week4_web上

继续&#xff01;冲冲冲 目录 圣钥之战1.0 nodejs 原型 原型链 原型链污染 回到题目 flag直接读取不就行了&#xff1f; 圣钥之战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…

介绍下SpringBoot在分布式架构中,如何实现读写分离

在分布式架构中&#xff0c;Spring Boot 可以通过多种方式实现读写分离&#xff0c;以提升系统性能和扩展性。以下是常见的实现方法&#xff1a; 1. 使用多数据源 通过配置多个数据源&#xff0c;将读操作和写操作分别路由到不同的数据库实例。 实现步骤&#xff1a; 配置多…

摄像头动捕:摄像头+AI精准捕捉动作

在科技蓬勃发展的当下&#xff0c;动作捕捉技术已从最初的小众应用逐渐走进大众视野&#xff0c;广泛渗透到众多领域。其中&#xff0c;摄像头动捕&#xff0c;也就是无穿戴动作捕捉系统&#xff0c;以其独特的技术优势和创新应用&#xff0c;正悄然改变着人们对动作捕捉的认知…

Unity3D Shader 简析:变体与缓存详解

引言 在 Unity3D 中&#xff0c;Shader 是渲染管线的核心部分&#xff0c;负责控制物体的外观和材质表现。Shader 的变体&#xff08;Variants&#xff09;和缓存机制是优化渲染性能的关键。本文将深入探讨 Unity3D 中 Shader 变体的概念、缓存机制以及如何通过代码实现和管理…

机器学习 - 词袋模型(Bag of Words)实现文本情感分类的详细示例

为了简单直观的理解模型训练&#xff0c;我这里搜集了两个简单的实现文本情感分类的例子&#xff0c;第一个例子基于朴素贝叶斯分类器&#xff0c;第二个例子基于逻辑回归&#xff0c;通过这两个例子&#xff0c;掌握词袋模型&#xff08;Bag of Words&#xff09;实现文本情感…

Java JVM(Java Virtual Machine)解析

Java Virtual Machine&#xff08;JVM&#xff09;是Java平台的核心组成部分&#xff0c;它负责执行Java字节码&#xff0c;并提供了一个运行时环境。本文将深入探讨JVM的工作原理、组成部分以及其在Java开发中的重要性。 一、JVM的基本概念 JVM是一个虚拟的计算机&#xff0…

Miniforge —— 轻量化的 conda 解决方案

引言 在日常使用中&#xff0c;我们常常使用 Anaconda 或 Miniconda 来管理 Python 环境和包。但由于 Anaconda/Miniconda 属于商业产品&#xff0c;当企业规模超过一定人数时就会涉及付费问题。相比之下&#xff0c;Miniforge 是由社区主导维护的一个完全免费的替代方案&…

【CS61A 2024秋】Python入门课,全过程记录P7(Week13 Macros至完结)【完结撒花!】

文章目录 关于新的问题更好的解决方案Week13Mon Macros阅读材料Lab 11: Programs as Data, MacrosQ1: WWSD: QuasiquoteQ2: If ProgramQ3: Exponential PowersQ4: Repeat Wed SQL阅读材料Disc 11: MacrosQ1: Mystery MacroQ2: Multiple AssignmentQ3: Switch Optional Contest:…

《Python百炼成仙》11-20章(不定时跟新)

第十一章 条件渡劫if-else问心 武当金顶的云海翻涌着二进制雪暴&#xff0c;七十二峰化作擎天而立的布尔冰柱。叶军踩着《周易》残页跃上紫霄宫檐角&#xff0c;看见薛香被冰封在水晶般的条件表达式中心&#xff1a; if 道心澄澈:破妄剑意 100else:心魔熵值 * 2楔子三元寒渊 …

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中&#xff0c;可以通过Tomcat安装目录中“\bin\service.bat”来完成&#xff0c;如果目录中没有service.bat&#xff0c;则需要使用其它方法。 打到CMD命令行窗口&#xff0c;通过cd命令跳转到Tomcat安装目录的“\bin\”目录&#xff0c;然后执…

WPS接入DeepSeek模型

1.wps 下载安装 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 &#xff08;最好是安装最新的wps&#xff09; 2.offieceAi工具下载安装 软件下载 | OfficeAI助手 下载后安装下载下来的两个工具。安装路径可以自行修改 3.打开WPS,点击文件-》 选项-》信任中心 勾…

数据结构与算法之数组: LeetCode 905. 按奇偶排序数组 (Ts版)

按奇偶排序数组 https://leetcode.cn/problems/sort-array-by-parity/description/ 描述 给你一个整数数组 nums&#xff0c;将 nums 中的的所有偶数元素移动到数组的前面&#xff0c;后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 示例 1 输入&#xff1a;n…

Qt简单使用正则表达式

正则表达式 用于数据处理&#xff0c;数据查询&#xff0c;数据格式验证&#xff0c;替换文本&#xff0c;提取字串&#xff0c;相比str函数正则技术&#xff0c;开销小 在Qt简单使用正则表达式 在qt中使用类QRegExp类使用正则表达式 需要使用头文件 #include <QRegExp>…

LabVIEW 用户界面设计基础原则

在设计LabVIEW VI的用户界面时&#xff0c;前面板的外观和布局至关重要。良好的设计不仅提升用户体验&#xff0c;还能提升界面的易用性和可操作性。以下是设计用户界面时的一些关键要点&#xff1a; 1. 前面板设计原则 交互性&#xff1a;组合相关的输入控件和显示控件&#x…

使用开源项目xxl-cache构建多级缓存

xxl-cache简介 官网地址&#xff1a;https://www.xuxueli.com/xxl-cache/ 概述 XXL-CACHE 是一个 多级缓存框架&#xff0c;高效组合本地缓存和分布式缓存(RedisCaffeine)&#xff0c;支持“多级缓存、一致性保障、TTL、Category隔离、防穿透”等能力&#xff1b;拥有“高性…

C++ 设计模式-适配器模式

适配器模式示例,包括多电压支持、类适配器实现、安全校验等功能: #include <iostream> #include <memory> #include <stdexcept>// 抽象目标接口:通用电源接口 class PowerOutlet {public:virtual ~PowerOutlet() = default;virtual int outputPower() c…

【Java八股文】02-Java集合面试篇

【Java八股文】02-Java集合面试篇 概念数组与集合区别常用集合Java中的线程安全的集合是什么&#xff1f;Collections和Collection的区别 Listjava中list的几种实现把ArrayList变成线程安全的有哪些方法&#xff1f;CopyOnWriteArrayList是如何保证线程安全的&#xff1f; Mapj…