C#单元测试,MsTest的基本使用

这篇具有很好参考价值的文章主要介绍了C#单元测试,MsTest的基本使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

白盒测试
Visio Studio MsTest单元测试基本使用

1.前言

单元测试,顾名思义就是针对某个单元的测试,一般情况下是指最小单元。但是这个最小单元也是有区别的,因为单元测试应用在很多方面,比如电视机组装,他的最小单元就是一个电容元件,在C语言中指一个函数,在Java里指一个类,桌面软件中可以指一个窗口等。我们这次讲的,就是针对C#语言,而他的的最小单元,是一个函数(属性也可以是最小单元)。

2.MsTest测试原理

C#语言的方法怎么测试。大部分情况,我们的测试方法就是打断点,然后进入调试,这个方法要求的条件多,过程麻烦,费时间,而且这个叫调试而不是测试。
白盒测试的方法就是另起一个方法去测试已有的方法,白盒测试的这个性质,注定了是由开发人员来实现白盒测试。
目前比较常用的单元测试框架,有Nunit、vs内置的MSTest以及Xunit,大同小异,本文主要介绍MSTest测试框架。

3.实例操作

我们创建一个控制台项目
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

我们以一个公司制造电池为例进行单元测试的说明。
首先,命名一个A公司的类ACompany,及其制造电池的方法MakeBattery(string V, string shape,string type),如下
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

前言已经介绍单元测试的概念,是针对方法进行测试的,这也是我们创建一个方法进行测试的原因;
此时,我们在方法内,右键点击,然后选择创建单元测试
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试
弹出创建单元测试的对话框,如下图所示
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

这里简单说明一下
测试框架:选择MsTestv2。测试框架一共两个——MsTest和MsTestv2。MS TEST V1: V1在.net framework中自带,引用Microsoft.VisualStudio.QualityTools.UnitTestFramework即可MS TEST V2: V2的版本依赖于两个包: MSTest.TestFramework和MSTest.TestAdapter这两个版本使用起来还是大同小异的,MS TEST V2主要是为了.net core准备的,当然也可以在.net framework上运行,并且新加入了一些扩展。
测试项目:默认选择新测试项目。在这之后,mstest会自动帮开发者选择相应的测试项目。
测试项目的名称格式。自动化测试本质上也是一个项目,类似类库项目的一个无法自启动的项目。所有的测试方法集成在里面。默认的名称和被测试的项目名称有关联。
命名空间。类似测试项目的名称,和我们所需要测试的方法所在的命名空间有一定关联。
测试的类名称,方法名称如上。
我们可以发现,一个项目的mstest单元测试项目与其是一一对应的。
接下来点击确定,开始创建单元测试
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

如上,我们就创建了一个简单的单元测试。接下来打开测试资源管理器
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

点击运行,开始单元测试
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

测试会失败
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

因为我们的测试方法直接断言失败。这并不是我们想要的结果。我们的目的是为了测试方法,我们需要修改里面的测试方法。
如下图所示
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

我们这里模拟了一个创造电池的方法,我们要创造一个12V的、圆形的手机电池。看代码的最后一句:
Assert.AreEqual(“电压12V形状为圆形的手机电池”, res);
Assert是断言的意思,这里的目的是为了判断方法运行的结果是否和我们预期的结果一样,这是判断单元测试是否OK的关键。
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

被测试的方法不一定返回值,只要有输出就可以。

4.代码覆盖率

代码覆盖率指的是运行单元测试时,产品代码的覆盖情况,仅仅在企业版可用。这个是mstest的劣势之一,也是其优势。
在测试资源管理器中,对选中的单元测试或者全部单元测试的代码进行覆盖率检查。
如下图所示:
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

代码覆盖率结果给出了完整的代码测试的覆盖情况,有利于开发者对白盒测试的情况有总体的把握。
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

返回到测试的功能所在的地方,这里可以体现mstest的优点
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

方法头部会显示出本方法测自动测试详情,并且已经具备自动测试的模块会用颜色区分开来。
所有的公共方法要求测试,对于指定排除在覆盖率之外的代码,可使用[System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverage()]进行区分。

5.特征分组

自动化测试的方法默认是根据项目分组,自定义分组可以通过TestCategory标记:
[TestClass,TestCategory(“MS TEST V2”)]
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

这个方法方便了开发对所有的测试进行整理
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

7参数化测试
7.1Datarow参数化
自动测试的基本方法已经基本上掌握,如果在测试的参数比较多的情况怎么处理,我们不可能一个一个方法去建立单元测试方法。
如下图所示
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

当我们想针对同一个方法再起一个单元测试的时候,会发现大部分的参数都已经帮我们填好。
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

系统会默认生成一个带尾号的测试方法,然后我们进行简单的修改。

虽然也可以实现测试,但是这个并不方便,我们这里可以使用参数化测试方法,老版本MS TEST最大缺点就是在参数化测试方面,metsetV2版本现在通过DataRowAttribute指定测试用例的参数,如下:
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

[DataTestMethod]
[DataRow(“10”, “圆形”, “手机”, “电压10V形状为圆形的手机电池”)]
[DataRow(“15”, “方形”, “汽车”, “电压15V形状为方形的汽车电池”)]
[DataRow(“9”, “菱形”, “笔记本”, “电压9V形状为菱形的笔记本电池”)]
public void MakeBattaryTest(string v,string shape,string ower,string res)
{
ACompany aCompany = new ACompany();
string actres = aCompany.MakeBattary(v, shape, ower);

        Assert.AreEqual(res, actres);
    }

DataTestMethod:注明这个方法是参数化测试方法;
DataRow:一组参数,参数可以是任何值;但是一定要和参数的测试方法匹配。
这里有一个要点,参数的个数设置多少个,因为测试的方法适合三个参数,所以大部分的人都认为是三个参数就够了,其实不是,应该是四个参数,还有一个是结果值。看上面的代码,我们最后断言的标准是期望值和实际值进行对比,而期望值是来自参数组:
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

运行测试,这个时候是三个测试而不是一个测试:
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

6.公用测试参数

测试过程中会遇见一种情况,就是参数复用,比如一组用户数据,既可以用于登录测试,也可以用于权限测试。做过开发的人员都应该了解,同样的代码尽可能的合并,以提高代码利用率,方便维护。这里就需要用到共享参数,首先我们先建立一个共享的方法,用于返回共享的参数,如图:
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

然后将之前方法中的datarow替换成共享的参数
运行测试,得到的结果是一样的
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

在MS TEST V2的版本中,还可以通过ITestDataSource接口实现自定义数据源。

7.初始化和结束设置

很多情况下测试时有条件的,比如需要测试数据库性能,需要百万级的数据。但是实际上你的数据库只有寥寥三四条,再比如数据库表有很多关联关系,但是目前这些表都没有数据,再比如软件的某些设置必须是特定的,种种情况给我们的白盒测试带来麻烦,但是我们也有解决办法,我们可以通过AssemblyInitialize和AssemblyCleanup属性来设置,如图
mstest,开发辅助工具,单元测试,c#,测试覆盖率,测试工具,功能测试

[AssemblyInitialize]
public static void Start(TestContext testContext)
{

}

mblyInitialize注释的方法start(),这里面可以随意的插入你想要的数据,或者改动配置,移动文件等等。
AssemblyCleanup注释的方法end(),可以将数据还原,保证测试环境清楚,不留尾巴。
通过上面的这种方式,可以实现测试隔离。以保证测试不会影响到正常的软件运行。

8.黑盒测试与白盒测试

通过上面的描述,可以看到白盒测试其实也是一种黑盒测试,是一种粒度更小的黑盒测试。测试的过程中他不管里面的方法怎么运行,只看结果。和黑盒测试有异曲同工之妙。
白盒测试
优点
(1)迫使测试人员去仔细思考软件的实现。 [3]
(2)可以检测代码中的每条分支和路径 [3]
(3)揭示隐藏在代码中的错误。 [3]
(4)对代码的测试比较彻底。 [3]
(5)让软件最优化。 [3]
缺点
(1)昂贵。 [3]
(2)无法检测代码中遗漏的路径和数据敏感性错误。 [3]
(3)不验证规格的正确性。 [3]文章来源地址https://www.toymoban.com/news/detail-535393.html

到了这里,关于C#单元测试,MsTest的基本使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# 使用xUnit进行单元测试

    目录 写在前面 操作步骤  执行结果 xUnit.net 是 NUnit 的作者Jim Newkirk搞的一个新的单元测试框架,目的是解决 NUnit 存在的一些问题和缺点,并在框架中加入一些最佳实践和扩展能力。 主要的改进点如下: 为每个测试方法产生一个对象实例 取消了 [SetUp] 和 [TearDown] 取消了 [Ex

    2024年02月04日
    浏览(30)
  • c#中使用METest单元测试

    METest是一个用于测试C#代码的单元测试框架。单元测试是一种软件测试方法,用于验证代码的各个单元(函数、方法、类等)是否按照预期工作。METest提供了一种简单而强大的方式来编写和运行单元测试。 TestMethod :这是一个特性,用于标记测试方法。 Assert :这是一个断言类

    2024年02月05日
    浏览(32)
  • Mockito单元测试基本使用

    本文参考: 【码农教程】手把手教你Mockito的使用 - 掘金 (juejin.cn) java - doReturn().when()与when().thenReturn() - 成长之路 - SegmentFault 思否 单元测试实践篇:Mock_阿里巴巴淘系技术团队官网博客的博客-CSDN博客 阿里是如何进行单元测试培训的?_Hollis Chuang的博客-CSDN博客 【Mockito】Mock

    2024年02月10日
    浏览(35)
  • 【一步步开发AI运动小程序】九、姿态辅助调试桌面工具的使用

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的“乐动力”、“天天跳绳”AI运动APP,让 云上运动会、线上运动会、健身打卡、AI体育指导 等概念空前火热。那么,能否将这些在APP成功应用的场景搬上小程序,分享这些概念的红利呢?本系列文章就带您一步一步从

    2024年02月07日
    浏览(40)
  • 【一步步开发AI运动小程序】九、姿态辅助调试桌面工具折使用

    随着人工智能技术的不断发展,阿里体育等IT大厂,推出的“乐动力”、“天天跳绳”AI运动APP,让 云上运动会、线上运动会、健身打卡、AI体育指导 等概念空前火热。那么,能否将这些在APP成功应用的场景搬上小程序,分享这些概念的红利呢?本系列文章就带您一步一步从

    2024年02月06日
    浏览(48)
  • 什么是 Jest ? Vue2 如何使用 Jest 进行单元测试?Vue2 使用 Jest 开发单元测试实例

    Jest 是一个流行的 JavaScript 测试框架,由 Facebook 开发并维护,专注于简单性和速度。它通常用于编写 JavaScript 和 TypeScript 应用程序的单元测试、集成测试和端到端测试。 特点: 简单易用: Jest 提供简洁的 API 和易于理解的语法,使得编写测试用例变得简单快捷。 零配置:

    2024年01月25日
    浏览(42)
  • 使用vscode进行python的单元测试,提高开发效率

    单元测试在我们的开发过程中非常有必要,它可以验证实现的一个函数是否达到预期。以前在学校写代码时,都是怼一堆代码,然后直接运行,如果报错再一步步调试,这样大部分时间都浪费在调试工作上。工作后发现大家都使用单元测试,这样做其实更规范,也提高了开发

    2024年02月03日
    浏览(47)
  • 实现 Rollup 插件alias 并使用单元测试提高开发效率

    本篇文章是对 实现 Rollup 插件 alias | 使用 TypeScript 实现库的基本流程 | 使用单元测试提高开发效率 的总结。其中涉及到开发一个组件库的诸多知识点。 首先执行 npm init 命令初始化一个 package.json 文件,由于插件使用了 typescript 作为类型校验,需要执行 tsc --init 命令去生成一

    2024年02月16日
    浏览(39)
  • Rider 中C#单元测试

    使用NUnit.Framework这个包,没有的话可以用nuget去搜索下载。简单的进行单元测试,想要单元测试好像还给需要static函数,慢慢学学C#

    2024年02月19日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包