C# 软件开发之单元测试

简介: 在日常开发中,一般通过启动调试或运行程序来查看功能是否符合预期,如果不符合预期,则需要优化程序,再次运行,如此反复,直到程序的输出符合预期需求为止。随着程序的不断复杂化,某些功能的测试也变得越来越复杂,可能为了验证一个很小的改动项,就需要操作很多步骤,才能验证成功,如果验证不成功,则需要多次重复验证,这对于开发者来说,将大大的拖延了开发进度。如何才能将复杂的功能进行拆分,每一个都可以单独进行验证呢?如果其他的功能没有问题,则只需要验证修改的那部分内容即可,这就是本篇文章需要介绍的单元测试。通过创建和运行单元测试,检查代码是否按预期工作。

在日常开发中,一般通过启动调试或运行程序来查看功能是否符合预期,如果不符合预期,则需要优化程序,再次运行,如此反复,直到程序的输出符合预期需求为止。随着程序的不断复杂化,某些功能的测试也变得越来越复杂,可能为了验证一个很小的改动项,就需要操作很多步骤,才能验证成功,如果验证不成功,则需要多次重复验证,这对于开发者来说,将大大的拖延了开发进度。如何才能将复杂的功能进行拆分,每一个都可以单独进行验证呢?如果其他的功能没有问题,则只需要验证修改的那部分内容即可,这就是本篇文章需要介绍的单元测试。通过创建和运行单元测试,检查代码是否按预期工作。

 

什么是单元测试?

 

单元测试,是指对软件中的最小可测试单元进行检查和验证。至于如何裁定最小可测试单元,则需要根据实际情况进行分析,一般情况下,一个类,一个函数,一个页面,一个按钮事件,都可以作为一个测试单元。总的来说,单元就是人为规定的最小的被测功能模块。对这些模块进行的测试,就称之为单元测试。

 

单元测试的好处?

 

通过单元测试,可以尽早的发现程序的BUG,便于后期的开发及调试,维护。可以使得程序更加健壮,我们对自己的代码也更加有信心,也便于问题的排查与定位。

 

单元测试环境

 

本示例主要基于以下环境进行单元测试:

  1. 开发工具:Visual Studio 2022
  2. 开发目标平台:.NET 6.0

 

创建目标项目

 

首先创建一个控制台应用程序DemoOne,步骤如下所示:

项目模板选择控制台项目,然后进入配置新项目页面,输入项目名称,点击下一步,如下所示:

选择目标框架,.NET 6.0(长期支持),并勾选不使用顶级语句,然后点击创建,如下所示:

创建成功后,如下所示:

 

创建功能类

 

我们有如下一个功能类Calculator,实现两个整数的加,减,乘,除,如下所示:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceDemoOne{
/// <summary>/// 实现整数的加减乘除/// </summary>publicclassCalculator    {
publicintAdd(intx, inty)
        {
returnx+y;
        }
publicintSub(intx, inty)
        {
returnx-y;
        }
publicintMultiply(intx, inty)
        {
returnx*y;
        }
publicintDivide(intx, inty)
        {
returnx/y;
        }
    }
}

 

创建单元测试项目

 

在解决方案名称上,点击右键菜单,添加新建项目,然后选择NUnit测试项目,然后点击下一步,如下所示:

输入项目名称DemoOne.Test,如下所示:

选择目标测试框架.NET 6.0(长期支持),然后点击创建,如下所示:

创建成功后的项目,如下所示:

 

添加项目引用并创建测试类

 

在DemoOne.Test项目中,添加DemoOne项目引用,并创建CalculatorTest测试类,如下所示:

usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Threading.Tasks;
namespaceDemoOne.Test{
publicclassCalculatorTest    {
        [Test]
publicvoidTestAdd()
        {
varcalculator=newCalculator();
inta=10;
intb=8;
intc=calculator.Add(a, b);
Assert.AreEqual(c, 18);
        }
        [Test]
publicvoidTestSub()
        {
varcalculator=newCalculator();
inta=10;
intb=8;
intc=calculator.Sub(a, b);
Assert.AreEqual(c, 2);
        }
        [Test]
publicvoidTestMultipy()
        {
varcalculator=newCalculator();
inta=10;
intb=8;
intc=calculator.Multiply(a, b);
Assert.AreEqual(c, 80);  
        }
        [Test]
publicvoidTestDivide()
        {
varcalculator=newCalculator();
inta=10;
intb=8;
intc=calculator.Divide(a, b);
Assert.AreEqual(c, 1);
        }
    }
}

注意:其中方法上方添加[Test]表示此方法是一个单元测试方法。

 

测试资源管理器

 

在VisualStudio中,单击测试(S),选择测试资源管理器(Ctrl+E,T),打开测试资源管理器窗口,如下所示:

在资源管理器窗口,可看到刚刚创建的4个单元测试,且处于未运行状态。点击测试资源管理器中的运行按钮,即可运行单元测试,如下所示:

运行成功后,可以看到单元测试的运行结果。如下所示:

 

单元测试异常输出

 

通过修改单元测试中除法的代码,如下所示:

[Test]
publicvoidTestDivide()
{
varcalculator=newCalculator();
inta=10;
intb=0;
intc=calculator.Divide(a, b);
Assert.AreEqual(c, 0);
}

在上述代码中,被除数为0,会抛出异常,再次运行单元测试,则会运行不通过,并提示错误信息,如下所示:

经过单元测试后,发现被除数为0时抛出异常,则需要优化代码,经过优化后的代码,如下所示:

publicintDivide(intx, inty)
{
if (y==0)
    {
return0;
    }
else    {
returnx/y;
    }
}

优化成功后,再次运行单元测试,如下所示:

以上示例,也从另外一个方面说明了,通过单元测试,可以使我们的程序,更加健壮。

 

Assert断言

 

在上述代码示例中,使用到了Assert.AreEqual方法,判断两个数是否相等。常用的有:

  1. Assert.IsTrue 判断是否为真
  2. Assert.IsFalse 判断是否为假
  3. Assert.AreEqual 判断是否相等。

Assert还有很多方法,本文不再一一列举,具体可参考:

https://learn.microsoft.com/zh-cn/dotnet/api/microsoft.visualstudio.testtools.unittesting.assert?view=visualstudiosdk-2022

以上就是C#软件开发之单元测试的全部内容。希望可以抛砖引玉,一起学习,共同进步。

相关文章
|
11天前
|
IDE 测试技术 开发工具
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
在Python开发中,调试是提升效率的关键技能。本文总结了10个实用的调试方法,涵盖内置调试器pdb、breakpoint()函数、断言机制、logging模块、列表推导式优化、IPython调试、警告机制、IDE调试工具、inspect模块和单元测试框架的应用。通过这些技巧,开发者可以更高效地定位和解决问题,提高代码质量。
102 8
10个必备Python调试技巧:从pdb到单元测试的开发效率提升指南
|
5天前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
27 11
|
7天前
|
开发框架 .NET Java
C#集合数据去重的5种方式及其性能对比测试分析
C#集合数据去重的5种方式及其性能对比测试分析
37 10
|
3月前
|
测试技术 C# 数据库
C# 单元测试框架 NUnit 一分钟浅谈
【10月更文挑战第17天】单元测试是软件开发中重要的质量保证手段,NUnit 是一个广泛使用的 .NET 单元测试框架。本文从基础到进阶介绍了 NUnit 的使用方法,包括安装、基本用法、参数化测试、异步测试等,并探讨了常见问题和易错点,旨在帮助开发者有效利用单元测试提高代码质量和开发效率。
179 64
|
28天前
|
算法 Java 测试技术
Benchmark.NET:让 C# 测试程序性能变得既酷又简单
Benchmark.NET是一款专为 .NET 平台设计的性能基准测试框架,它可以帮助你测量代码的执行时间、内存使用情况等性能指标。它就像是你代码的 "健身教练",帮助你找到瓶颈,优化性能,让你的应用跑得更快、更稳!希望这个小教程能让你在追求高性能的路上越走越远,享受编程带来的无限乐趣!
86 13
|
2月前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
65 1
|
2月前
|
存储 算法 C语言
用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容
本文探讨了用C语言开发游戏的实践过程,包括选择游戏类型、设计游戏框架、实现图形界面、游戏逻辑、调整游戏难度、添加音效音乐、性能优化、测试调试等内容,旨在为开发者提供全面的指导和灵感。
52 2
|
2月前
|
缓存 监控 数据挖掘
C# 一分钟浅谈:性能测试与压力测试
【10月更文挑战第20天】本文介绍了性能测试和压力测试的基础概念、目的、方法及常见问题与解决策略。性能测试关注系统在正常条件下的响应时间和资源利用率,而压力测试则在超出正常条件的情况下测试系统的极限和潜在瓶颈。文章通过具体的C#代码示例,详细探讨了忽视预热阶段、不合理测试数据和缺乏详细监控等常见问题及其解决方案,并提供了如何避免这些问题的建议。
62 7
|
3月前
|
测试技术 网络安全
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
文章全面介绍了软件测试的基本概念、目的、岗位分类、与开发和调试的区别,并阐述了成为优秀测试人员应具备的素质和技能。
309 1
什么是软件测试? 软件测试都有什么岗位 ?软件测试和调试的区别? 软件测试和开发的区别? 一位优秀的测试人员应该具备哪些素质? 软件测试等相关概念入门篇
|
2月前
|
Kubernetes 测试技术 持续交付
C# 一分钟浅谈:集成测试与系统测试
【10月更文挑战第19天】本文详细介绍了集成测试和系统测试的概念、目的及其在软件开发中的重要性。通过分析常见问题和易错点,结合代码示例,探讨了如何通过代码规范、自动化测试和持续集成等方法提高测试效果,确保软件质量和可靠性。
117 1