首页 > 编程语言 >【C#进阶】单元测试_2024-06-22

【C#进阶】单元测试_2024-06-22

时间:2024-06-22 22:56:10浏览次数:35  
标签:NUnit 06 进阶 22 重构 代码 单元测试 测试 编写

单元测试

什么是单元测试?

想象一下,你在做一道大菜,每种食材的准备就是一个个小任务。单元测试就像是在烹饪前检查每样食材是否新鲜、切割是否恰当。在编程中,一个“单元”通常指的是代码中的最小可测试部分,比如一个方法。单元测试就是编写一小段代码,专门用来检查这个方法是否按预期工作。

为什么要做单元测试?

  • 提高代码质量:帮助发现并修复bug,确保代码按预期工作。
  • 简化调试:当功能修改后,可以快速验证是否引入了新问题。
  • 文档作用:测试代码本身展示了如何使用被测试的功能。
  • 重构自信:有了全面的测试覆盖,你可以大胆重构代码,确保重构不会破坏原有功能。

使用NUnit进行单元测试

安装NUnit

首先,确保你的项目支持.NET Core或者.NET Framework,并且安装了NUnit的测试框架和测试适配器。在Visual Studio中,可以通过NuGet包管理器来安装:

// 安装NUnit框架
Install-Package NUnit

// 安装NUnit的测试适配器,以便在Visual Studio中运行测试
Install-Package NUnit3TestAdapter

编写一个简单示例

假设我们有一个计算类,里面有个加法方法需要测试:

public class Calculator
{
    public int Add(int a, int b)
    {
        return a + b;
    }
}

接下来,我们为这个Add方法编写单元测试:

using NUnit.Framework; // 引入NUnit框架

[TestFixture] // 标记这是一个测试类
public class CalculatorTests
{
    [Test] // 每个测试方法都要用[Test]标记
    public void Add_TwoPositiveNumbers_ReturnsSum()
    {
        // Arrange: 准备测试数据
        var calculator = new Calculator();
        int a = 5;
        int b = 3;

        // Act: 执行被测试的方法
        int result = calculator.Add(a, b);

        // Assert: 验证结果是否符合预期
        Assert.AreEqual(8, result); // 确保结果是8
    }
}

测试驱动开发(TDD)

TDD的基本原则

  1. 先写测试:在编写任何产品代码之前,先编写一个失败的单元测试。这个测试代表了你接下来要实现的功能。
  2. 编写最简代码使其通过:只写足够的代码让测试通过,不考虑其他情况或优化。
  3. 重构:一旦测试通过,重构代码以提升其质量和可维护性,同时保证所有测试仍然通过。

TDD实践步骤

以我们的Calculator.Add方法为例:

  1. 写测试前,确定我们要实现的功能是计算两个正数的和。
  2. 先写测试,如上所示,我们会先创建一个失败的测试,因为还没有实现Add方法。
  3. 实现最简代码,为了让测试通过,我们添加了最简单的实现:return a + b;
  4. 重构(如果需要),在这个简单的例子中,代码已经很直接,可能不需要重构。

通过TDD,我们确保了代码从一开始就被正确地测试覆盖,这有助于设计更清晰、更健壮的代码结构。

总结:

单元测试

  • 核心概念:单元测试是对软件中最小可测试单元(如函数、方法)进行检查和验证的过程,确保它们按预期工作。
  • 重要性:提高软件质量、简化调试过程、提供代码使用的示例、增强重构时的信心。
  • 编写要点:包括Arrange(准备测试环境)、Act(执行被测试代码)、Assert(验证结果)三个步骤。

NUnit/xUnit

  • NUnit与xUnit:都是流行的.NET平台上的单元测试框架,提供了丰富的断言方法和测试组织结构,便于自动化测试的编写和执行。
  • 安装与使用:通过NuGet包管理器安装对应框架及测试适配器到项目中,然后编写标记有特定属性(如[TestFixture], [Test])的测试类和方法。

测试驱动开发(TDD)

  • 基本原则:红(先写失败的测试)、绿(编写代码使测试通过)、重构(在保证测试通过的前提下优化代码)。
  • 流程:从定义需求开始,先编写测试案例并观察其失败,随后编写最小化的产品代码满足测试要求,最后进行代码重构以提升质量。
  • 优势:TDD鼓励编写测试先行,有助于发现需求的不明确之处,促进模块化设计,减少后期错误,加速开发迭代速度。

通过理解这些概念并实践,开发者能够编写出更加可靠、易于维护的代码,并在软件开发过程中持续提升效率和质量。

标签:NUnit,06,进阶,22,重构,代码,单元测试,测试,编写
From: https://www.cnblogs.com/Jason54/p/18262832

相关文章

  • 20240622-PowerShell5和PowerShell7在windows terminal中无法切换
    今天安装powertoys小工具commandNotFound的时候,提示要求powershell版本是7,而当前powershell版本是5,如下。但是powertoys中显示powershell7已经安装,如下图。主要问题在于powershell5的程序名是powershell.exe,而powershell7的程序名是pwsh.exe.windowsterminal每个选项卡默......
  • 【C++进阶学习】第三弹——菱形继承和虚拟继承——菱形继承的二义性和数据冗余问题
    继承(上):【C++进阶学习】第一弹——继承(上)——探索代码复用的乐趣-CSDN博客继承(下):【C++进阶学习】第二弹——继承(下)——挖掘继承深处的奥秘-CSDN博客前言:在前面,我们已经讲过继承的相关知识,今天我们来将一个由继承拓展出来的很重要的知识,那就是——菱形继承和虚拟继承及相关知......
  • 【C#进阶】多线程和异步编程_2024-06-22
    关于多线程和异步编程简单来说,就是多线程并行执行任务提速,异步编程等待不浪费资源,并发集合确保数据访问安全,三者合力提升程序效率与反应能力。1.理解线程想象一下,你在厨房做饭,同时需要洗菜、切菜、炒菜。如果你一个人来做,就需要在这些任务之间来回切换,这很慢。但如果请几个朋友......
  • 2024-06-22:用go语言,给定一个起始下标为 0 的长度为3的整数数组 nums,根据这些数字构建
    2024-06-22:用go语言,给定一个起始下标为0的长度为3的整数数组nums,根据这些数字构建三角形。如果无法构成三角形,则返回"none";否则根据三角形的边长关系返回对应类型的字符串:equilateral(等边三角形)、isosceles(等腰三角形)或scalene(不等边三角形)。输入:nums=[3,3,3]。输出:"e......
  • 【办公类-50-01】20240620自主游戏观察记录表19周内容打乱
    背景需求:又到了期末,各种班级资料需要提交。有一份自主游戏观察记录需要写19周(每周2次)的观察记录,并根据参考书填写一级、三级、五级的评价指标。去年中六班的时候,我很认真的手写了21周的户外游戏活动内容,主动成为2个需要提交文本资料的班级。今年组长选了中二和中五提交......
  • 学习Ange记录--06~10
    06.changesymbolicinheap再来复习一下流程1.建立项目p=angr.Project(path)2.设置入口state=p.factory.blank_state(0xffffffff)3.设置符号对象pw=claripy.BVS('pw',64)4.这次是把符号放到堆上,于是可以自己创个新的堆就好了(1).给新的堆一个地址(2).给新的指向堆的指针一......
  • YC307A [ 20240622 CQYC省选模拟赛 T1 ] 划船(boat)
    题意给定一个有向图\(G\),以及将所有边反向重连的无向图\(T\)。你最多可以在\(T\)上连续走\(k\)条边,走过每条边的代价都为\(1\),然后必须在\(G\)的对应点上走一条边以恢复体力。若当前对应点没有出边,则停留在该点\(1\)代价。求每个点到\(n\)的最小代价。Sol考......
  • 2024.06.22【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第一部分)【AI
    第一部分:人类基因组概述与测序历史(详细版)摘要:第十七章深入探讨了人类基因组的复杂性、测序历程以及其对现代科学的意义。人类基因组由约30,000至40,000个蛋白质编码基因组成,这些基因的表达和变异构成了我们生物学特征和疾病倾向的基础。本章节详细回顾了人类基因组计划的......
  • Zookeeper-06
    Zookeeper的java客户端   Zookeeper的Java客户端主要有以下几种:ZooKeeperJavaClient:这是官方提供的Java客户端,包含在ZooKeeper的发布版本中。它提供了一组简单的API,用于连接ZooKeeper服务器,并对节点进行操作。Curator:Curator是Netflix公司开发的一......
  • kedaOJ#P0609. 质因分解加强版
    题目P0609.质因分解加强版思路代码#include<iostream>#include<vector>#include<string>std::stringprimeFactorization(intn){std::vector<int>factors;std::vector<int>counts;for(inti=2;i*i<=n;++i)......