Visual Studio 2010 单元测试之一---普通单元测试:http://blog.csdn.net/tjvictor/archive/2011/02/09/6175362.aspx...

本文以Visual Studio 2010为例,来介绍如何在Visual Studio里面进行单元测试.

     首先来介绍普通单元测试,这是进行顺序测试、压力测试的基础。如果在Visual Studio 2010(2008)里面没有发现下图中的Test菜单,请用Visual Studio安装光盘进行安装,因为Visual Studio单元测试插件安装时可能不是默认选项。

 

 

测试之前,我们要准备一些测试代码。或者从下面的链接下载完整的项目工程。

http://download.csdn.net/source/3014236

新建一个名为AppSample的Lib。里面有一个MathUtility文件,包含加减乘除四个方法。代码如下:

namespace TJVictor.UT.AppSample

{

    public class MathUtility

    {

        public MathUtility() { }

 

        public static int Add(int a, int b)

        {

            return a + b;

        }

 

        public static int Minus(int a, int b)

        {

            return a - b;

        }

 

        public static int Divide(int a, int b)

        {

            return a / b;

        }

 

        public static int Multiply(int a, int b)

        {

            return a * b;

        }

    }

}

 

创建单元测试项目有两种方法:

1.直接创建单元测试项目:File->New->Project->Test Project. 如下图:

 

 

2. 直接在需要创建单元测试的函数上创建:右击函数名->Create Unit Tests。 如下图

 

 

         这样就创建好了单元测试项目。Visual Studio 会自动生成一个单元测试工程。推荐使用第二种方法创建,因为第一种方法创建的只有单元测试工程,第二种方法会把单元测试函数也一起创建了出来。

 

本文以第二种创建的方式为例,继续下一步,讲解单元测试文件。

创建好的单元测试工程如下图:

 

其中MathUtilityTest.cs就是自动生成的单元测试文件,打开可以看到类似如下代码。

        [TestMethod()]

        public void AddTest()

        {

            int a = 0; // TODO: Initialize to an appropriate value

            int b = 0; // TODO: Initialize to an appropriate value

            int expected = 0; // TODO: Initialize to an appropriate value

            int actual;

            actual = MathUtility.Add(a, b);

            Assert.AreEqual(expected, actual);

            Assert.Inconclusive("Verify the correctness of this test method.");

        }

 

关于单元测试的各种断言,不在本文讨论范围之内。下表列出Visual Studio 2010支持的断言及相关解释。

断言

解释

AreEqual

验证值相等

AreNotEqual

验证值不相等

AreSame

验证引用相等

AreNotSame

验证引用不相等

Inconclusive

暗示条件还未被验证

IsTrue

验证条件为真

IsFalse

验证条件为假

IsInstanceOfType

验证实例匹配类型

IsNotInstanceOfType

验证实例不匹配类型

IsNotNull

验证条件为NULL

IsNull

验证条件不为NULL

Fail

验证失败

 

测试函数AddTest()的属性[TestMethod()]表示这个方法是个可运行单元测试方法,区别类中的其他方法(如一些测试辅助方法)。

需要特别注意的是:Assert.Inconclusive("Verify the correctness of this test method.");语句是默认添加的,意思是这个方法是Visual Studio自动创建,运行前自删除或注释此句,否则运行结果无法通过。

按上面的步骤,把MathUtility里面的所有方法都建立相应的单元测试,然后按F6进行编译。编译后,就可以在单元测试窗口中看到我们刚刚建立的测试方法了。

Test->Windows->Test List Editor如下图:

 

 

修改DivideTest代码如下:

        [TestMethod()]

        public void DivideTest()

        {

            int a = 100; // TODO: Initialize to an appropriate value

            int b = 2; // TODO: Initialize to an appropriate value

            int expected = 50; // TODO: Initialize to an appropriate value

            int actual;

           

            actual = MathUtility.Divide(a, b);

            Assert.AreEqual(expected, actual);

            //Assert.Inconclusive("Verify the correctness of this test method.");

        }

在Test List Editor选中DivideTest方法后,右击如下图

 

 

1.Run Checked Tests:直接运行此单元测试函数

2.Debug Checked Tests:以Debug模式运行。在此模式下运行单元测试函数,可以在单元测试函数(DivideTest)或是被测函数(MathUtility.Divide)中加断点,则程序会自动停留在断点处。

3.Open Test:打开此测试函数的方法,相当于双击。

4.Disable:把此测试方法置为无效。

 

 

左击Run Checked Tests后,运行结果如下图,证明测试通过:

 

重新修改DivideTest()程序如下:

        [TestMethod()]

        public void DivideTest()

        {

            int a = 100; // TODO: Initialize to an appropriate value

            int b = 2; // TODO: Initialize to an appropriate value

            int expected = 60; // TODO: Initialize to an appropriate value

            int actual;

           

            actual = MathUtility.Divide(a, b);

            Assert.AreEqual(expected, actual);

            //Assert.Inconclusive("Verify the correctness of this test method.");

        }

再次运行,结果如下:

 

测试失败,原因是:期待值为60,实际值为50,断言失败。

 

重新修改DivideTest()程序如下:

        public void DivideTest()

        {

            int a = 100; // TODO: Initialize to an appropriate value

            int b = 0; // TODO: Initialize to an appropriate value

            int expected = 60; // TODO: Initialize to an appropriate value

            int actual;

           

            actual = MathUtility.Divide(a, b);

            Assert.AreEqual(expected, actual);

            //Assert.Inconclusive("Verify the correctness of this test method.");

        }

这次以Debug模式运行,则程序会在return a / b;抛出异常,显示被除数不能为0.

 

至此,一个简单的单元测试已经从头到尾跑了一遍。细心的读者一定会发现在MathUtilityTest.cs测试文件里面还有四个被注释掉的方法,下表列出了这四个方法的解释和用法。

函数名

用法

[ClassInitialize()]

MyClassInitialize

这个方法会在每次调用测试方法前被自动调用。假设在调用AddTest(),DivideTest()等方法之前都需要初始化一些基本数据列表,则这个工作可以放在MyClassInitialize函数里面,不用分别写在每个测试方法里。

[ClassCleanup()]

MyClassCleanup

这个方法会在每次调用测试方法结束后被自动调用。

[TestInitialize()]

MyTestInitialize

这个方法会在每次启动一个测试过程前被自动调用。例如本次测试一共选择了AddTest(),DivideTest()两个测试方法,则在调用这两个方法前,MyTestInitialize会先被调用。与MyClassInitialize不同的是,MyClassInitialize是每次调用测试方法时都会被调用,相当于函数级的调用,MyTestInitialize则只在测试过程前会被调用一次,在测试过程结束前,不会再被调用,相当于过程级的调用。

[TestCleanup()]

MyTestCleanup

这个方法会在每次结束一个测试过程后被自动调用。

 

Visual Studio 之所谓把这四个函数注释掉,原因是这四个函数只是示意性函数(从名字中就可以看出)。关键是看这四个函数的方法属性[ClassInitialize()],[ClassCleanup()], [TestInitialize()], [TestCleanup()]只要把相关的属性加到相关的方法上,那么这个方法就具有的上面所描述的功能。

 

单元测试适用范围:

1.验证函数正确性。对于一个函数,只要我们把相关的测试数据都写全,然后run一下,就知道是否都能通过。以后修改此方法后,只要再次run一下,就知道此次修改是否影响到了以前的测试用例,大大节省时间和提高正确率。

2.Debug程序。我们一般写后台代码时,都要写一个console或是winform小程序要调试验证所写的类是否能run起来,那么单元测试中的Debug模式就可以胜任此工作。

 

 

下面介绍两个使用时的小技巧。

1.可以在Test Result窗口里面导出测试结果。导出的结果包括一份测试报告和测试程序。证明此程序已经通过了报告中的所有测试用例,相当于Release了一个版本。

2.设置测试数量。每运行一次测试过程,就会生成一次测试报告和程序。Visual Studio默认次数是25,即超过25后,就会提示超出测试数次。我们可以通过下面的设置来提高次数。

Tool->Options->Test Tools->Test Execution,把里面的25改成100即可。如下图

 

至此,普通单元测试已经完成。请继续关注顺序单元测试。

 

 

Visual Studio 2010单元测试系列已经全部完成,以方便大家阅读,请使用http://blog.csdn.net/tjvictor/archive/2011/02/09/6175358.aspx来查看这一系列的所有博文。

转载于:https://www.cnblogs.com/songtzu/archive/2012/10/22/2733456.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python调用数据库数据类型_Python使用Mysql官方驱动(取出dict类型的数据)

简介虽然Python有很多连接mysql的库,比如mysqldb, pymysql~这些都很方便,现在就教大家使用mysql的官方库来操作mysql.安装windows: 下载链接image.png选择自己的windows版本和Python版本,下载msi文件后双击安装即可。(如果在网站没找到msi版本…

docker构建oracle集群,docker 构建 oracle数据库 镜像-Go语言中文社区

前言之前docker 部署的 oracle 镜像,突然从 dockerhub 下架了。所以没办法,只能自己打包一个oracle 数据库的镜像。找来找去,其实oracle 自身就提供了oracle 的产品 docker 构建脚本。所以直接按照oracle 官方的docker 构建仓库的说明打包。o…

oracle opatch那个回退,下面是我在打OPatch时使用的一般步骤,供大家参考

下面是我在打OPatch时使用的一般步骤,供大家参考:1、停止crs_stat -t## running as oraclesrvctl stop instance -d -isrvctl stop instance -d -isrvctl stop nodeapps -nsrvctl stop nodeapps -n## running as root(分别在2个节点执行)$CRS_HOME/bin…

Linq动态查询与模糊查询

IList<Department> mDepartmentLst new List<Department>();IList<Employee> mEmployeeLst new List<Employee>();mDepartmentLst.Add(new Department() { Id 1, DeptNo "001", DeptName "开发部", IsBusiness false });mDe…

python如何使用字典中的值并进行比较_python嵌套字典比较值与取值的实现示例

前言本文通过示例给大家介绍了python嵌套字典比较值&#xff0c;取值&#xff0c;分享出来供大家参考学习&#xff0c;下面话不多说了&#xff0c;来一起看看详细的介绍吧。示例代码#取值import typesallGuests {Alice: {apples: 5, pretzels: {12:{beijing:456}}},Bob: {ham …

用命令创建表空间、用户,并为用户授权、收回权限。

oracle中如何删除用户&#xff1f; Oracle中使用DROP USER来删除用户&#xff0c;如果使用DROP USER CASCADE那么用户的对象也同时被删除掉。为了达到删除用户的效果而又不影响对用户下的对象的使用可以使用alter user username account lock将用户锁定。 用命令创建表空间、用…

oracle pdb 表空间,Oracle 12c CDB 和 PDB 表空间管理和配置 说明

注&#xff1a;本文谢绝转载。1 管理CDB中的表空间CDB表空间的管理和non-CDB 表空间的管理一样&#xff0c;CDB 也有一个实例&#xff0c;在安装的时候指定。--查看表空间&#xff1a;SQL> select instance_name fromv$instance;INSTANCE_NAME----------------CndbaSQL>…

微软企业库连接access,web.config相对路径配置

web.config配置 配置中需要注意的一个地方就是Access数据库要存放在App_Data文件夹下&#xff0c;这样就可以通过相对路径调用Access数据库。 <add name"AccessConnectionString" connectionString"ProviderMicrosoft.Jet.OLEDB.4.0;Data Source|DataDirecto…

python画蜡烛致敬烈士_「」matplotlib 股票-用python绘制蜡烛线型k线图是用代码还是绘图工具-TOP金融网...

用python绘制蜡烛线型k线图是用代码还是绘图工具import matplotlib.pyplot as pltfrom matplotlib.dates import DateFormatter, WeekdayLocator, DayLocator, MONDAY,YEARLYfrom matplotlib.finance import quotes_historical_yahoo_ohlc, candlestick_ohlcplt.rcParams[font.…

[html] 后缀.html和.htm有什么区别?

[html] 后缀.html和.htm有什么区别&#xff1f; 历史遗留问题&#xff0c;原来的结尾只能由三个字母&#xff0c;是一摸一样的。个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通…

oracle数据同步异常,案例:DataGuard同步异常问题处理记录

本帖最后由 yuanqk 于 2018-8-11 20:28 编辑真实案例&#xff0c;记录一下&#xff0c;都是小白&#xff0c;非常理解小白在遇到问题时的无奈&#xff0c;希望能帮助到一些人。过程非常简单&#xff0c;主要是处理问题的思路。1、早上收到告警&#xff0c;说备库有15个归档没有…

获取图片倒影效果

获取图片倒影效果 View Code 1 /**2 * 获取传入图片的倒影3 * 4 * param originalImage 原始图片5 * param reflectionGap 原始图片与倒影图片的间距6 * param percentage 倒影是原图的高度的百分比 . 0< percentage < 1 7 * param o…

三星关闭shell提示_啄木鸟家庭维修|三星滚筒洗衣机4c故障代码

三星滚动洗衣机是很多用户都会安装的一种洗衣机&#xff0c;不管什么牌子的洗衣机&#xff0c;使用一段时间都可能出现一些故障&#xff0c;需要维修洗衣机。三星滚筒洗衣机4c就是一个常见洗衣机故障。下面介绍三星滚筒洗衣机4c故障代码。三星滚筒洗衣机4c故障代码表示进水故障…

[html] html6即将到来,你最期待的是什么特性呢?

[html] html6即将到来&#xff0c;你最期待的是什么特性呢&#xff1f; 模块化个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

oracle 细粒审核,oracle10g 细粒审计

oracle10g 细粒审计oracle10g 细粒审计自己试验成功的例子&#xff1a;sqlplus /nologconn /as sysdbabegindbms_fga.add_policy (object_schema>system, ####方案名object_name>nbstutb, ####表名policy_name>nbstu, ####自定义的策略名statement_types> SELECT,D…

懒惰了

少玩游戏&#xff0c;这不是韩国&#xff0c;你打不出房子车子还有资本。可以有爱好&#xff0c;但要把握尺度&#xff0c;少玩农场&#xff0c;牧场&#xff0c;斗地主等一些高度吸引人思想的晋级游戏&#xff0c;也许你的级别很高&#xff0c;但不代表你有多么成功&#xff0…