关键词:
单元测试的重要性这里我就不多说了,以前大家一直使用NUnit来进行单元测试,其实早在Visual Studio 2005里面,微软就已经集成了一个叫Test的专门测试插件,经过几年的发展,这个工具现在已经比较强大了,下面我就以Visual Studio 2010以例,全面介绍一下如何在Visual Studio环境下面进行单元测试。
Visual Studio 2010 单元测试共分七个部分:
普通单元测试、顺序单元测试、压力测试,Generic测试、数据库测试、UI界面测试和Web性能测试。
这个系列的博客实例程序可以在下面的链接中下载到.
http://download.csdn.net/source/3014236
Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx
Visual Studio 2010 单元测试之二---顺序单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175472.aspx
Visual Studio 2010 单元测试之三---压力测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175477.aspx
Visual Studio 2010 单元测试之四---Generic测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175485.aspx
Visual Studio 2010 单元测试之五---数据库测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175491.aspx
Visual Studio 2010 单元测试之六---UI界面测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175499.aspx
出处:https://blog.csdn.net/tjvictor/article/details/6175358
================================================================================================
摘要:本教程不会介绍单元测试的基本理论知识,也不会和大家讨论在实际项目中是否需要写单元测试代码的问题。但是如果你此时想使用VS中的单元测试的工具来测试某个方法是否正确,可你又从来没真正实践过,那么本教程将带你一步一步使用VS2010集成的Unit Test进行断言(Assert)式验证数据的正确性,及代码覆盖率的查看。
关键词:Unit Test、单元测试、代码覆盖率、Assert、Twifly
正文:
在本入门教程中我们假设来测试一个简单的加法运算方法是否正确。该方法能够接受任意个参数,参数类型可以是整型、字符型、浮点型,对于其他复杂类型我们这里暂时忽略。既然作为入门教程,那么下面我们按照详细的步骤开始。
1、 先创建一个空白解决方案(文件—>新建—>项目—>已安装的模版—>其他项目类型—>Visual Studio解决方案-->空白解决方案)命名为TestUnit。
2、 在新创建的解决方案(TestUnit)鼠标右键,选择添加—>新建项目—>控制台应用程序。
如下图所示:
3、 在控制台应用程序中,我们添加一个Operation类。添加一个简单的Add方法,该方法能对一个dynamic类型的列表的各项求和,简单地,我们这里假设传入的类型只可能是int、double、string类型,所以不对其他类型做异常捕捉。代码如下:
public class Operation
{
public static dynamic Add(List<dynamic> numbers)
{
dynamic sum = 0;
foreach (var n in numbers)
{
var s = n;
if (s is string)
{
s = -Convert.ToDouble(n); //我们这里故意在转换前加了一个取反运算
}
sum += s;
}
return sum;
}
}
4、 现在我们来对Add方法做下单元测试。将光标放在Add方法名上,然后右键选择“创建单元测试(C)…”,如下图所示:
5、这时会弹出“创建单元测试”窗口,如下图所示,一般情况下直接点击确定即可。
6、如果直接点击确定按钮,系统将按照默认的命名规则(直接加Test后缀)生成测试文件。当然你也可以点击上图中的“设置…”按钮,在弹出的“测试生成设置”中进行规则修改。如下图所示:
7、因为这是我们第一次创建单元测试项目,所以在输出选项中,我们选择默认的“创建新的Visual C# 测试项目”。在单击“确定”按钮后,要求我们填写测试项目的名称,名称自己随便,这里我们就用默认的TestProject1。点击“创建”即可。如果我们以后还对另一个方法进行单元测试,我们就可以在输出项目中直接选择“TestProject1”了,而不比再创建新的测试项目。如下图所示:
8、 这时,在解决方案下面,系统自动为我们创建了TestProject1测试项目和Solution Items(解决方案项)文件夹。
9、双击TestProject1测试项目下的OperationTest.cs文件,我们看一下系统为我们自动生成的测试代码。会发现主要有一下几点:
? 在代码文件顶部增加了一个:using Microsoft.VisualStudio.TestTools.UnitTesting;
? 在生成的OperationTest类上标记了[TestClass()],即使用了TestClassAttribute
? 对测试类的方法AddTest标记了[TestMethod()]
? 在测试类OperationTest中,定义了一个类型为TestContext的变量testContextInstance。 详情可以参考MSDN的TestContext类。
? 对测试的类和方法附加了测试特性
10、我们现在要做的就是要对AddTest方法编写测试代码,一般情况下只需要简单地将TODO部分填写完整,将默认的代码:
改成如下测试代码进行第一组测试:
/// <summary>
///Add 的测试
///</summary>
[TestMethod()]
public void AddTest()
{
List<dynamic> numbers = new List<dynamic>() { 1, 2, 3, 4, 5 };
dynamic expected = 15;
dynamic actual;
actual = Operation.Add(numbers);
Assert.AreEqual(expected, actual);
}
这个方法就是对整型1、2、3、4、5累加进行测试,我们期望的结果是15。Assert类的AreEqual方法用于验证实际结果和期望值是否相等。Assert断言类包含很多方法用于比较,在测试方法中,可以调用任意数量的 Assert 类方法,如 Assert.AreEqual()。Assert 类有很多方法可供选择,其中许多方法具有若干重载。详情可以参考MSDN的Assert类。
默认生成的代码中Assert.Inconclusive 语句用于指示该测试尚未准备好,不能运行(不能确定结果是否正确),所以当我们写好测试代码后,Assert.Inconclusive语句就可以删除了。
11、运行单元测试。打开测试视图(测试-->窗口-->测试视图),测试视图中会以列表的方式显示测试方法。右键菜单选择“运行选定内容”即可执行对该方法的测试,如下图所示:
VS2010接到测试的指令后,在测试完成后会自动弹出“测试结果”窗口,结果显示通过,表示测试结果值和预期结果相同。
12、上面一组单元测试(整型)结果是通过,但是我们知道对字符串操作是故意留有错误,但是实际过程中,那段代码并没有执行。所以我们还要对字符格式的数字进行测试,当然还有浮点型、负数等等,这些可以都单独测试,也可以一起测试。把测试代码改成:
/// <summary>
///Add 的测试
///</summary>
[TestMethod()]
public void AddTest()
{
List<dynamic> numbers = new List<dynamic>() { 1, 2, 3, 4, 5 };
dynamic expected = 15;
dynamic actual;
actual = Operation.Add(numbers);
Assert.AreEqual(expected, actual);
List<dynamic> numbers2 = new List<dynamic>() { "1", "2", "3", "4" };
dynamic expected2 = 10;
dynamic actual2;
actual2 = Operation.Add(numbers2);
Assert.AreEqual(expected2, actual2);
List<dynamic> numbers3 = new List<dynamic>() { "1", 2.5, 3, "4.5", 5, 6 };
dynamic expected3 = 22;
dynamic actual3;
actual3 = Operation.Add(numbers3);
Assert.AreEqual(expected3, actual3);
}
我们再进行一次测试(第二组测试)。每次测试代码修改后,会提示我们刷新更新,直接点击刷新按钮即可。
看看测试结果如何:
这个时候我们发现测试显示未通过,右键菜单单击“查看测试结果详细信息”,如下图所示:
13、错误消息提示期望指为10,但实际结果为-10,我们很容易知道是下面组数据出了问题:
List<dynamic> numbers2 = new List<dynamic>() { "1", "2", "3", "4" };
找到代码:s = -Convert.ToDouble(n); //我们这里故意在转换前加了一个取反运算,把前面的取反运算符去掉,改成:s = Convert.ToDouble(n); 再进行一次测试,测试结果会按预期的方式显示为通过。
14、调试单元测试。上面能一下子就把错误修改,是因为错误是我们故意设置的。在实际开发中,找错误也许并不明显,通常是需要调试后才容易找到。调试单元测试和平时断点测试是一样的,在需要的地方设置断点后,在测试视图中右键选择“调试选定内容”,接下来就是大家所熟悉的断点调试步骤了。如下图所示:
15、查看代码覆盖率。单元测试的编写,涉及到很多要求,但是最基本的就是需要编写多组数据对各个分支代码都至少需要执行一遍。如我们前面第一组直接测试整型相加(1、2、3、4、5)测试结果15为通过,没找到潜在的错误,是因为有些代码没被执行。查看代码覆盖率就能帮助你检测测试数据是否会覆盖所有分支代码。
如下图所示,右键选择“覆盖率结果”,可以查看代码覆盖率。
第一组数据测试代码覆盖率:
第二组数据测试代码覆盖率:
16、代码覆盖率默认演示显示说明:
颜色代码 |
说明 |
浅蓝色 |
指示在测试运行过程中执行了整个代码行。 |
浅褐色 |
指示在测试运行过程中仅执行了代码行的部分代码块。 |
红棕色 |
指示在测试运行过程中未执行此行。 |
当然这些默认颜色可以在工具菜单下的选项中进行设置,如下图所示:
17、如果在查看代码覆盖率中出现如下提示,则我们需要简单配置一下
在“测试视图”中,找到Solution Items(解决方案项)文件夹下的Local.testsettings,双击打开“测试设置”窗口,选择“数据和诊断”,将代码覆盖率设置为启用,然后点击“配置”对代码覆盖率进行配置,如下图所示:
在我们的控制台应用程序前打勾,然后点击确定按钮
最后对“测试设置”点击“应用”按钮完成代码覆盖率的配置。重新运行测试,就可以查看代码覆盖率了。
到这里已经完成了如何简单使用VS2010自带的单元测试工具进行断言式Assert条件测试,当然以后我们还可能接触到CollectionAssert类来比较集合对象、StringAssert 类来对字符串进行比较等等,在后面的教程中我们将接触到。
最后如果对本入门教程仍有疑问,可以参考MSND官方的教程文章。
MSDN官方参考:
演练:创建并运行单元测试
http://msdn.microsoft.com/zh-cn/library/ms182532.aspx
如何:创建和运行单元测试
http://msdn.microsoft.com/zh-cn/library/dd286656.aspx
单元测试分析
http://msdn.microsoft.com/zh-cn/library/ms182517.aspx
使用 Assert 类
http://msdn.microsoft.com/zh-cn/library/ms182530(v=vs.100).aspx
演练:运行测试并查看代码覆盖率
出处:http://www.cnblogs.com/ruiati/archive/2013/01/15/2861541.html
vs2013:unittest单元测试入门
一、打开VS ,找到工具栏的“工具->扩展和更新”,添加图片内容650)this.width=650;"src="https://images0.cnblogs.com/blog2015/711762/201507/081151533148491.png"style="border:0px;margin:0px;padding:0px;"/> 二、新建控制台应 查看详情
第二次作业—单元测试的简单实践
...点击新建,新建一个C#的类库,然后写下代码:创建新的单元测试右键选中User,就可以看到创建单元测试选项:单击它,开始创建单元测试:选中新出现的文件,写入测试单元测试代码:开始测试,等待测试结束,出现了测试通... 查看详情
opencv入门教程之一opencv2.4.8+vs2010的开发环境配置
...专栏总结自己所学也分享知识给大家还是先放出待会儿的测试用图下载和安装OpenCV SDKsources里面是源代码想查看完整的源代码需要用cmake来解包如何解包大家百度一下就可以或者下次浅墨来专门讲一讲这里就先 查看详情
vs2010中测试驱动型开发
...项目模板统一管理数据库对象,VisualStudio也有一个数据库单元测试...ASP.NETMVC框架使得程序员更容易进行Web测试驱动型开发。对于数据库项目呢,使用VS2010的Database项目模板统一管理数据库对象,VisualStudio也有一个数据库... 查看详情
VS2010 中的 MSTest - 如何一步启动所有负载测试
...:37:59【问题描述】:在我工作的新团队中,我们使用大量单元测试,我们在VS2010中使用MSTest。我已经准备了大约10个负载测试来以各种方式使用这些单元测试。您如何启动所有负载测试(随机或按指定顺序)?我在如何获得标准V... 查看详情
VS内置单元测试
】VS内置单元测试【英文标题】:Builtinunit-testinginVS【发布时间】:2010-09-1017:16:54【问题描述】:我正在寻找有关VS08中提供的内置单元测试功能的建议。任何人都可以告诉我他们是否知道任何理由不使用此功能而不是任何其他可... 查看详情
docker入门教程与实践
...部选择。docker在安装的过程中会自动安装VirtualBox,自己测试的时候安 查看详情
VS 2017 不向 TFS 2010 报告测试结果
...务器。这在安装和执行构建的VS2015中运行良好,如果任何单元测试失败,我们会获得测试结果的链接。我们刚刚安装了VS2017来代替2015使用。现在,我们不再获得测试结果的链接;而是显示消息“无测试结果”。是设置 查看详情
针对不同浏览器的 JavaScript 中的通用单元测试概念/实践?
】针对不同浏览器的JavaScript中的通用单元测试概念/实践?【英文标题】:Generalunittestingconcepts/practicesinJavaScriptagainstdifferentbrowsers?【发布时间】:2010-11-2405:34:21【问题描述】:我一直在用强类型语言编写单元测试,对此我有相当... 查看详情
如何在VS2008中使用集成单元测试来测试抽象类
】如何在VS2008中使用集成单元测试来测试抽象类【英文标题】:HowtouseintegratedunittestinginVS2008totestabstractclass【发布时间】:2010-10-2707:42:01【问题描述】:我找不到任何关于它是否可以做到这一点的信息。我在抽象类中有几个受保... 查看详情
VS 2010 Test Runner 错误“测试运行时代理进程已停止。”
...011-02-1802:17:49【问题描述】:在VisualStudio2010中,我有许多单元测试。当我使用测试列表一次运行多个测试时,有时我会针对一项或多项测试收到以下错误: 查看详情
junit入门使用教程(代码片段)
1、Junit是什么?JUnit是一个Java语言的单元测试框架。它由KentBeck和ErichGamma建立,逐渐成为源于KentBeck的sUnit的xUnit家族中最为成功的一个JUnit有它自己的JUnit扩展生态圈。多数Java的开发环境都已经集成了JUnit作为单元测试的工具。... 查看详情
junit4单元测试入门教程
本文按以下顺序讲解JUnit4的使用下载jar包单元测试初体验自动生成测试类执行顺序@Test的属性下载jar包##下载地址在github上,把以下两个jar包都下载下来。 下载junit-4.12.jar,junit-4.12-javadoc.jar(文档),junit-4.12-sources.jar(... 查看详情
vs2010extension实践
在上一篇(VS2010Extension(1)实践)里,主要展示了如何使用MEF扩展VS2010,来扩展编辑控制和展现自己的UI;在实现QuickToolbar的时候,发现MEF仅仅提供了很基本的编辑控制,如果需要高级的操作,比如注释选择的代码,就捉襟见肘,... 查看详情
社区共读《python编程从入门到实践》第7,8,9天阅读建议(代码片段)
...码,本章节属于扩展知识,目的是为了让你了解单元测试相关流程(单元测试一般在公司是程序员自己做 查看详情
社区共读《python编程从入门到实践》第7,8,9天阅读建议(代码片段)
...码,本章节属于扩展知识,目的是为了让你了解单元测试相关流程(单元测试一般在公司是程序员自己做 查看详情
研效优化实践:python单测——从入门到起飞(代码片段)
...磨优化,都是影响企业研发效能工程的细节因素。而单元测试,是指针对软件中的最小可测试单元的检查验证,一个单元测试往往就是一小段代码。本文基于腾讯安全平 查看详情
从 VS6 移植到 VS2008 时在不寻常的架构中使用单元测试?
】从VS6移植到VS2008时在不寻常的架构中使用单元测试?【英文标题】:UseunittestsinunusualarchitecturewhenportingfromVS6toVS2008?【发布时间】:2010-09-2813:45:59【问题描述】:我们有一个主应用程序,它最多可以执行5个不同的exe。这些exe独... 查看详情