异常处理与单元测试第四章回顾实体类在三层结构中主要作用是什么?using语句的主要作用是什么?预习检查1、在.NET平台下引发异常的原因有哪些?2、.NETFramework引发的异常有几类?3、单元测试中代码覆盖率的主要作用是什么?本章任务在业务逻辑层定制异常处理在业务逻辑层创建单元测试本章目标会使用异常处理会使用VSTS写单元测试trade(){sendquery();}…….…….为什么需要异常处理帐户姓名余额300123张三300124王五47,000311320李四网上银行张三转账25000到李四的账户上020,000数据库系统将查询发送到数据库中拒绝交易余额=20000-25000错误程序出现故障系统崩溃为了防止系统崩溃我们需要使用异常处理什么异常处理代码错误公共语言运行库遇到意外资源不可用异常程序执行异常处理恢复程序在.NET平台下我们如何使用异常处理?首先要了解Exception类Exception类System.ExceptionSystem.SystemExceptionSystem.ApplicationExceptionSystem.ArithmeticExceptionSystem.Data.DataExceptionSystem.ArgumentExceptionSystem.FormatExceptionSystem.IO.IOExceptionSystem.DivideByZeroExceptionSystem.OverflowExceptionSystem.Reflection.TargetExceptionSystem.IndexOutOfRangeExceptionSystem.ArgumentNullException.NETFramework公共语言运行时引发的异常用户程序引发的异常Exception类都有哪些属性使我们进一步了解它?Exception类属性名称说明Source此属性表示导致异常发生的应用程序或对象的名称Message提供引起异常的详细信息StackTrace此属性提供在堆栈上所调用方法的详细信息,并首先显示最近调用的方法InnerException对内部异常的引用,如果此异常基于前一个异常,则内部异常指最初发生的异常用Exception类如何捕获异常如何捕获异常回顾try和catch块的使用滤水器filter_water(){try{水;}catch{杂质;}}…….过滤水杂质//程序代码//错误处理代码try{//程序代码}catch(ExceptionE){//错误处理代码}使用异常处理:在C#程序中,如何使用异常处理使用throw再次引发异常2使用Try...Catch块捕获异常1如何使用throw得到更多的异常信息?使用异常处理publicIListStudentGetAllStudents(){IListStudentstudents=newListStudent();try{//调用数据访问层students=studentService.GetAllStudents();}catch(Exceptionex){thrownewException(ex.ToString());}returnstudents;}小结使用异常处理的主要目的是什么?.NETFramework引发的异常有哪两类?如何捕获异常?为什么需要单元测试单元测试是保证软件质量的具体操作方法什么是单元测试PDA在出厂之前,会对每一个零部件进行测试——单元测试什么是VSTS单元测试VisualStudion集成的单元测试框架如何用VSTS写单元测试1、创建测试2、编写测试3、运行测试4、代码覆盖创建测试:在业务逻辑层为学员账户创建方法创建单元测试1、右键单击“AddStudent”方法,然后选择“创建单元测试”创建测试2、在“创建单元测试”对话框中选择“输出项目”为“VisualC#”选择输出项目类型“VisualC#”测试项目名称3、单击“确定”,输入测试项目名称为“MySchoolTest”,单击“创建”创建测试新生成与单元测试相关的文件有:文件名目的AuthoringTest.txt提供关于创建测试的说明,包括向项目增加其他测试的说明StudentManagerTest.cs包含StudentManager类生成的测试,以及测试初始化和测试清除方法MySchoolPro.vsmdi测试管理文件localtestrun.testrunconfig本地测试运行设置文件如何在VSTS生成的测试框架基础上编写测试?[TestMethod()]publicvoidAddStudentTest(){global::MySchool.BLL.StudentManagertarget=newglobal::MySchool.BLL.StudentManager();//TODO:初始化为适当的值global::MySchool.Models.Studentstudent=null;stringexpected=null;stringactual;actual=target.AddStudent(student);Assert.AreEqual(expected,actual,MySchool.BLL.StudentManager.AddStudent未返回所需的值。);Assert.Inconclusive(验证此测试方法的正确性。);}编写测试VSTS生成的基本测试框架VSTS单元测试是基于断言(Assert)的测试测试指定的值是否相等,如果不等测试失败表明这是个未验证的单元测试编写测试断言说明AreEqual()测试指定的值是否相等,如果不等测试失败Inconclusive()表示一个未验证的测试IsTrue()测试指定的条件是否为true,如果为false测试失败IsNull()测试指定的对象是否为空引用,如果不为空,测试失败IsNotNull()测试指定的对象是否为非空,如果为空,测试失败IsFalse()测试指定条件是否为false,如果该条件为true,测试失败常用断言如下:如何修改断言(Assert)?得到正式的测试[TestMethod()]publicvoidAddStudentTest(){//TODO:初始化为适当的值global::MySchool.Models.Studentstudent=newglobal::MySchool.Models.Student();student.LoginId=test3;student.LingPwd=test3;student.UserStateId=1;student.StudentName=test3;student.StudentNO=test3;student.Sex=男;student.ClassID=1;stringexpected=“学员账户创建成功!stringactual;actual=MySchool.BLL.StudentManager.AddStudent(student);Assert.AreEqual(expected,actual,MySchool.BLL.StudentManager.AddStudent未返回所需的值。);}编写测试在测试项目中添加被测单元需要的配置文件运行测试测试运行的方式有两种测试运行的结果有两种如何查看测试失败的详细信息1用调试启动选定的测试项目2启动选定的测试项目(不调试)1通过2失败运行测试我们选定测试并双击显示AddStudentTest[Results]窗口单元测试的一个关键指标是:代码覆盖代码覆盖代码覆盖是度量单元测试运行时测试了多少代码未测试到的代码如何启用代码覆盖功能?代码覆盖1、双击“本地测试运行设置文件(localtestrun.testrunconfig)”2、在配置对话框中选择“代码覆盖率”,选中“要检测的项目”,单击应用如何查看代码覆盖率?代码覆盖3、点击“代码覆盖率结果”双击被测单元总结在异常处理中throw的主要作用是什么?如何获得更多的异常信息?为什么要使用单元测试?VSTS下生成的测试项目是否支持调试功能?