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#软件开发之单元测试的全部内容。希望可以抛砖引玉,一起学习,共同进步。

目录
打赏
0
0
1
0
16
分享
相关文章
【硬件测试】基于FPGA的1024QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的1024QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同SNR条件下的性能测试。1024QAM调制将10比特映射到复平面上的1024个星座点之一,实现高效数据传输。硬件测试结果表明,在SNR=32dB和40dB时,系统表现出良好的性能。Verilog核心程序展示了各模块的连接与功能实现。
48 7
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
66 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
Potpie.ai 是一个基于 AI 技术的开源平台,能够为代码库创建定制化的工程代理,自动化代码分析、测试和开发任务。
226 19
Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
【硬件测试】基于FPGA的4ASK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的4ASK调制解调系统的硬件测试版本,该系统包括testbench、高斯信道模块和误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置功能。通过VIO设置不同SNR(如15dB和25dB),实现了对系统性能的实时监测与调整。4ASK是一种通过改变载波幅度表示数据的数字调制方式,适用于多种通信场景。FPGA平台的高效性和灵活性使其成为构建高性能通信系统的理想选择。
73 17
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
120 10
大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
89 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
【硬件测试】基于FPGA的4FSK调制解调通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前的文章《基于FPGA的4FSK调制解调系统》,增加了ILA在线数据采集模块和VIO在线SNR设置模块,实现了硬件测试版本。通过VIO设置不同SNR(如10dB和20dB),并展示了ILA采集的数据结果。四频移键控(4FSK)是一种数字调制方法,利用四个不同频率传输二进制数据,具有较高的频带利用率和抗干扰性能。输入的二进制数据分为两组,每组两个比特,对应四个频率f1、f2、f3、f4,分别代表二进制组合00、01、10、11。调制过程中选择相应频率输出,并进行幅度调制以增强抗干扰能力。接收端通过带通滤波器提取信号并还原为原始二进制数据。
43 7
【硬件测试】基于FPGA的256QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的256QAM基带通信系统的硬件测试版本,包含testbench、高斯信道模块和误码率统计模块。系统新增ila在线数据采集和vio在线SNR设置模块,支持不同信噪比(如30dB和40dB)的仿真测试,并提供配套操作视频。256QAM调制方案每个符号携带8比特信息,通过复数值星座图映射实现高效传输。Verilog代码展示了核心模块设计,包括SNR设置、数据处理和ILA测试分析,确保系统在实际硬件环境中的稳定性和性能。
25 2
【硬件测试】基于FPGA的16QAM基带通信系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文介绍了基于FPGA的16QAM基带通信系统硬件测试版本。该系统在仿真基础上增加了ILA在线数据采集和VIO在线SNR设置模块,支持不同信噪比(如15dB、25dB)的测试。16QAM是一种正交幅度调制方式,通过两路4ASK信号叠加实现,每个符号包含4比特信息。系统采用正交调幅法生成16QAM信号,并通过DAC转换为模拟信号。解调时使用正交相干解调,经低通滤波器恢复电平信号。开发板内完成发射与接收,无需定时同步模块。代码可移植至其他开发板,具体步骤见配套文档。
41 2
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
66 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈