当前位置: 首页 > news >正文

建设网站怎么赚钱旅游网站的建设的文献综述

建设网站怎么赚钱,旅游网站的建设的文献综述,电商网站建设的维护要多少钱,交易网站备案目录 1.单元测试概念2.单元测试的原则3.单元测试简单示例4.单元测试框架特性标签5.单元测试中的断言Assert6.单元测试中验证预期的异常7.单元测试中针对状态的间接测试8.单元测试在MVC模式中的实现8.单元测试相关参考9.示例源代码下载 志铭-2020年1月23日 11:49:41 1.单元测试…目录 1.单元测试概念2.单元测试的原则3.单元测试简单示例4.单元测试框架特性标签5.单元测试中的断言Assert6.单元测试中验证预期的异常7.单元测试中针对状态的间接测试8.单元测试在MVC模式中的实现8.单元测试相关参考9.示例源代码下载 志铭-2020年1月23日 11:49:41 1.单元测试概念 什么是单元测试 单元测试unit testing是一段自动化的代码用来调用被测试的方法或类而后验证基于该方法或类的逻辑行为的一些假设。 简而言之说单元测试是一段代码通常一个方法调用另外一段代码随后检验一些假设的正确性。 在过程化编程中一个单元就是单个程序、函数、过程等 对于面向对象编程最小单元就是方法包括基类超类、抽象类、或者派生类子类中的方法。 为什么要单元测试 单元测试的目标是隔离程序部件并证明这些单个部件是正确的。单元测试在软件开发过程的早期就能发现问题。 在代码重构或是修改的时候可以根据单元测试快速验证新修改的代码的正确性换句话说为了方便系统的后期维护升级 单元测试某种程度上相当于系统的文档。借助于查看单元测试提供的功能和单元测试中如何使用程序单元开发人员可以直观的理解程序单元的基础API即提高了代码的可读性 若是开发流程按照测试驱动开发则先行编写的单元测试案例就相当于软件工程瀑布模式中第二阶段——设计阶段的文档 使用测试驱动开发可以避免实际开发中编程人员不完全按照文档规范因为是基于单元测试设计方法开发人员不遵循设计要求的解决方案永远不会通过测试。 什么时候需要单元测试? “单元测试通常被认为是编码阶段的附属工作。可以在编码开始之前或源代码生成之后进行单元测试的设计。”——《软件工程实践者的研究方法》 对于需要长期维护的项目单元测试可以说是必须的 通常来说程序员每修改一次程序就会进行最少一次单元测试在编写程序的过程中前后很可能要进行多次单元测试以保证没有程序错误虽然单元测试不是必须的但也不坏这牵涉到项目管理的政策决定。 单元测试谁来编写 不需要专门的软件测试人员编写测试案例单元测试通常由软件开发人员编写。 也正式因为是开发人员自己写单元测试部分也可以让开发者仔细的思考自己方法和接口是否可以更加便于调用 单元测试局限性 不能发现集成错误、性能问题、或者其他系统级别的问题。单元测试结合其他软件测试活动更为有效。 单元测试框架 通常在没有特定框架支持下自行创建一个项目作为单元测试项目完全是可行的。 使用单元测试框架同时配合编辑器VS编写单元测试相对来说会简单许多。 .NET下的单元测试框架MSTest、NUnit 2.单元测试的原则 根本原则 Automatic(自动化) 单元测试应该是全自动执行的并且非交互式的Independent 单元测试方法的执行顺序无关紧要 单元测试的各个方法之间不应该相互依赖Repeatable 功能代码不改的前提下相同的测试代码多次运行应该得到相同的结果Self-validating 单元测试方法只有两个可能的运行结果通过或失败没有第三种情况。 其他一些规范 最理想的情况下应该尽量多写测试用例以保证代码功能的正确性符合预期具有良好的容错性。如果代码较复杂条件分支较多测试用例最好能覆盖所有的分支路径。 实际开发中没有必要对每一个函数都进行单元测试。但是若是一个比较独立的功能当然也可能这个功能就一个函数应该对这个功能进行比较详尽的测试。 单元测试的基本目标:语句覆盖率达到 70%;核心模块的语句覆盖率和分支覆盖率都要达到 100%。 注意一个类中可能有许多方法我们不是要把所有的方法的单元测试都写完在去实现代码而是写完一个单元测试就去实现一个方法是一种快速的迭代 不测试私有方法因为私有方法不被外部调用测试意义不大而且你非要测试那就要使用反射比较麻烦。 一个测试只测试一个功能 3.单元测试简单示例 3.1一个简单的手写单元测试实例 为了简洁明了的说明什么是单元测试首先不使用单元测试框架自行编写单元测试项目 比如说新建了一个类Calculator用于对数据的计算 如下只是随便的的写了个方法方便理解 public class Calculator {//求一个数的二倍public int DoubleValue(int i){return i * 2;} } 新建了Calculator类之后我们编写单元测试代码对该类中方法进行单元测试 首先新建一个项目对待测试的方法所在的项目添加引用, 编写代码测试ClassLib项目中Calculator类中的DoubleValue()方法 测试DoubleValue(int value),该函数是求一个数的二倍给其一个参数value2,则期望其得到的结果是4若是其他值则说明函数编写是错误的测试不通过。若是该函数的运行结果和期望的结果一样则运行通过 public static void CalculatorDoubleValueTest() { //生成一个测试对象的实例Calculator obj new Calculator();//设计测试案例int value 2;int expected 4;//与预期比较if (expected obj.DoubleValue(value)){Console.WriteLine(测试通过);}else{Console.WriteLine($测试未通过,测试的实际结果是{obj.DoubleValue(value)});}Console.ReadKey(); } 通过上面的示例简单的演示了单元测试是什么但是实际中一般都是使用已有的单元测试框架。而且测试一个方法为了完备性一般都要到所有的逻辑路径进行测试所以会对一个方法写多个测试方法。 3.2单元测试框架MSTest 单元测试一般都是使用现成的单元测试框架关于.net的单元测试框架有许多常见的有NUnit,MSTest等等。 这里使用VS自带的MStest框架做简单的演示一般推荐使用NUnit框架Undone 演示的案例继续对上述的Calculator类中的DoubleValue()进行单元测试 注意通常的做法是为每个被测项目建立一个测试项目为每个被测类建立一个测试类并且为每个被测方法至少建立一个测试方法。 新建项目---选择测试类项目中的单元测试项目命名为被测试项目名Tests 测试类的命名为“被测试的类Tests” 测试函数的命名按照 **[被测方法]_ [测试场景]_[预期行为]** 格式命名 方法名——被测试的方法测试场景——能产生预期行为的条件预期行为——在给定条件下期望被测试方法产生什么结果 当然在VS中也可以在想要测试的函数上右键创建单元测试弹出如下窗口直接点击确定即可,即可生成默认的单元测试代码模版 这里先使用默认自带的MSTest框架使用默认的命名格式会自动生成相应的测试项目和测试函数格式。 编写单元测试的代码一般按照以下四步编写: Arrange:配置测试对象 TestCase:准备测试案例 Act:操作测试对象 Assert:对操作断言 //注意 [TestClass]和[TestClass()][TestMethod()]和[TestMethod]写法等价 namespace ClassLib.Tests {[TestClass()]//通过标注该特性标签表明该类为测试类public class CalculatorTests{[TestMethod()]//通过标注该特性标签表明该函数为测试函数public void DoubleValueTest_DoubleValue_ReturnTrue(){//Arrange:准备实例化一个带测试的类Calculator obj new Calculator();//Test Case:设计测试案例int value 2;int expected 4;//Act执行int actual obj.DoubleValue(value);//Assert断言Assert.AreEqual(expected, actual);}} } 点击测试--运行--所有测试 或点击测试--窗口--测试资源管理器--运行所有测试 上面运行显示测试通过显示的是绿色的标志若是测试不通过则会则显示红色标志在单元测试中有一种“红绿灯”的概念你是使用其他的单元测试框架也是同样的红绿标志。 在测试驱动开发的流程中就是“红灯--修改--绿灯--重构--绿灯”的开发流程。 注意我是使用的不是VS Enterprise版本故无法直接查看代码的测试覆盖率可以使用插件OpenCover或NCover等其他工具查看单元测试的覆盖率。 上面只是演示了怎么进行一次单元测试但是实际中我们的测试案例不能仅仅一个所以要添加多个测试以提高到测试的完备性 若是对需要大量测试案例的可以把测试数据存放在专门的用于测试使用的数据库中在测试时通过连接数据库使用数据库中的数据进行测试 依旧是上面的示例把大量的测试案例存放在数据库 Id Input Expected -------------------- ----------- ----------- 1 2 4 2 6 12 3 13 26 4 0 0 5 -2 -4 单元测试的代码如下 public TestContext TestContext { get; set; }//注意为了获取数据库的数据我们要自定义一个TestContext属性 [TestMethod()] [DataSource(System.Data.SqlClient,server.;databasedb_Tome1;uidsa;pwdshanzhiming,//数据库连接字符串tb_szmUnitTestDemo,//测试数据存放的表DataAccessMethod.Sequential)]//对表中的数据测试的顺序可以是顺序的也可以是随机的这里是我们选择顺序 public void DoubleValueTest_DoubleValue_ReturnTrue() {//ArrangeCalculator target neCalculator();//TestCaseint value Convert.ToInt(TestContext.DataR[Input]);int expected Convert.ToInt(TestContext.DataR[Expected]);//Actint actual target.DoubleValu(value);//AssertAssert.AreEqual(expected, actual); } 说明 特性标签[TestClass] [TestMethod] MSTest框架通过标签识别并加载测试 [TestClass]用来标识包含一个MSTest自动好测试的类 [TestMethod]用来标识需要被调用的自动化测试的方法 特性标签[DataSource]标识用来测试的数据源其的参数如下 第一个参数是providername即使用的数据源的命名空间其实我们也是可是使用Excel表格的菜单“项目”--添加新的数据源……参考CSDN:vs2015数据驱动的单元测试 providername值参考 system.data.sqlclient ----说明使用的是mssqlserver数据库 system.data.sqllite ----说明使用的是sqllite数据库 system.data.oracleclient ----说明使用的是oracle数据库或 mysql.data.mysqlclient ----说明使用的是mysql数据库 第二个参数是connectionString我习惯是这样写 server.;database数据库;uid用户ID;pwd密码 但是推荐这样写 Data Sourcelocalhost;Initial Catalog数据库;User ID用户ID;Password密码 第三个参数是tablename,选择使用的数据库中的哪张表 第四个参数确定对表中的数据测试的顺序. 可以是顺序的DataAccessMethod.Sequential 可以是随机的:DataAccessMethod.Random 4.单元测试框架特性标签 在MSTest单元测试框架中主要有以下的一些特性标签 (参考) MS Test Attribute用途[TestClass]定义一个测试类里面可以包含很多测试函数和初始化、销毁函数以下所有标签和其他断言。[TestMethod]定义一个独立的测试函数。[ClassInitialize]定义一个测试类初始化函数每当运行测试类中的一个或多个测试函数时这个函数将会在测试函数被调用前被调用一次在第一个测试函数运行前会被调用。[ClassCleanup]定义一个测试类销毁函数每当测试类中的选中的测试函数全部运行结束后运行在最后一个测试函数运行结束后运行。[TestInitialize]定义测试函数初始化函数每个测试函数运行前都会被调用一次。[TestCleanup]定义测试函数销毁函数每个测试函数执行完后都会被调用一次。[AssemblyInitialize]定义测试Assembly初始化函数每当这个Assembly中的有测试函数被运行前会被调用一次在Assembly中第一个测试函数运行前会被调用。[AssemblyCleanup]定义测试Assembly销毁函数当Assembly中所有测试函数运行结束后运行一次。在Assembly中所有测试函数运行结束后被调用[Ignore]跳过忽略该测试函数[TestCategory(测试类别)]给测试自定义分类便于有选择的运行指定类别的单元测试 说明 使用[ClassInitialize]和[ClassCleanup]标签特性 可以在测试之前或之后方便地控制测试的初始化和清理从而确保所有的测试都是使用新的未更改的状态。 注意这是很有必要的可以有效的防止测试失败是因为测试之间的依赖性导致失败。 注意两个标签特性需要放在一个无返回值的静态方法上, 且标注[ClassInitialize]特性的方法的参数是TestContext testcontext 示例比如说在一个测试类初始化一个测试对象并在测试完成后释放代码如下 [TestClass()] public class CalculatorTests {//使用ClassInitialize标签初始化一个Calculator对象以供下面所有的测试([ClassCleanup]之前使用private static Calculator calc null;[ClassInitialize]public static void ClassInit(TestContext testcontext){calc new Calculator();}[TestMethod()]public void testMethod1(){//测试}[TestMethod()]public void testMethod2(){//测试}[TestMethod()]public void testMethod3(){//测试}[ClassCleanup]public static void Classup(){calc null;} }5.单元测试中的断言Assert 断言是什么可以从字面理解是“十分肯定的说”在编程中可以通过 不同的断言来测试方法实际运行的结果和你期望的结果是否一致。 断言是单元测试最基本的组成部分Assert类的静态方法提供了不同形式的多种断言。 MStest中Assert的常用静态方法(参考) MS Test Assert用途Assert.AreEqual()验证值相等Assert.AreNotEqual()验证值不相等Assert.AreSame()验证引用相等Assert.AreNotSame()验证引用不相等Assert.Inconclusive()暗示条件还未被验证Assert.IsTrue()验证条件为真Assert.IsFalse()验证条件为假Assert.IsInstanceOfType()验证实例匹配类型Assert.IsNotInstanceOfType()验证实例不匹配类型Assert.IsNotNull()验证条件为NULLAssert.IsNull()验证条件不为 NULLAssert.Fail()验证失败 针对字符串的断言使用StringAssert的静态方法 注意可以根据VS的只能提示自行查看StringAssert的所有静态方法或是查看StringAssert的定义可以查看其所有的静态方法 详细使用可参考 StringAssert用途StringAssert.AreEqualIgnoringCase(string expected,string actual)用于断言 两个字符串在不区分大小写情况下是否相等,需要提供两个参 数,第一个是期待的结果,第二个是实际结果.StringAssert.Contains()用于断言一个字符串是否包含另一字符串,其中第一个参数为被包含的字符串,第二个为实际字符串StringAssert.StartsWith()断言字符串是否以某(几)字符开始, 第一个参数为开头的字符串 ,第二个为实际字符串StringAssert.EndsWith()断言字符串是否以某(几)字符结束StringAssert.Matches()断言字符串是否符合特定的正则表达式 针对集合的断言使用CollectionAssert的静态方法 注意可以根据VS的只能提示自行查看CollectionAssert所有的静态方法或是查看CollectionAssert的定义可以查看其所有的静态方法 详细使用可参考 CollectiongAssert用途CollectionAssert.AllItemsAreNotNull断言集合里的元素全部不是Null,也即集合不包含null元素,这个方法只有一个参数,传入我们要判断的集合即可CollectionAssert.AllItemsAreUnique断言集合里面的元素全部是惟一的,即集合里没有重复元素.CollectionAssert.AreEqual用于断言两个集合是否相等CollectionAssert.AreEquivalent用来判断两个集合的元素是否等价,如果两个集合元素类型相同,个数也相同,即视为等价,与上面的AreEqual方法相比,它不关心顺序CollectionAssert.Contains断言集合是否包含某一元素CollectionAssert.IsEmpty断言某一集合是空集合,即元素个数为0CollectionAssert.IsSubsetOf判断一个集合是否为另一个集合的子集,这两个集合不必是同一类集合(可以一个是array,一个是list),只要一个集合的元素完全包含在另一个集合中,即认为它是另一个集合的子集6.单元测试中验证预期的异常 若是程序中在某种特定的条件下有异常抛出为了进行单元测试我们设计指定的测试案例期望在该测试案例程序抛出异常并检验其是否抛出异常。 简单示例 /// summary /// 计算从from到to的所有整数的和 /// /summary public int Sum(int from, int to) {if (from to){throw new ArgumentException(参数from必须小于to);}int sum 0;for (int i from; i to; i){sum i;}return sum; } 在程序中若是参数from to则抛出异常new ArgumentException(参数from必须小于to); 为了检验该程序在该条件下是否真的会抛出异常可以创造测试案例from100 to50 期望Sum()函数代码中执行throw new ArgumentException(参数from必须小于to);所以我们要测试期望抛出的异常ArgumentException。 使用标签[ExpectedException(typeof(“抛出的异常对象”))] 单元测试代码 //异常测试添加ExpectedException [TestMethod] [ExpectedException(type(ArgumentException))] public void SumTest_ArgumentException_TrowException() {Calculator bjCalcultor new Calculator();int from100,to50calc.Sum(from, to); } 因为程序抛出了我们期望的异常所以该测试通过。如若程序没有抛出该异常则测试失败。 7.单元测试中针对状态的间接测试 基于状态的测试也称状态验证是指在方法执行之后通过检查被测系统及其协作者依赖项的状态来检测该方法是否正确工作。 简单示例 下面的方法isLastFilenameValid(string filename)在运行后会改变类中属性wasLastFileNameValid的值 //用于存储状态的结果用于以后的验证 public bool wasLastFileNameValid { get; set; } //判断输入的字符串是否是.txt文件名 public bool isLastFilenameValid(string filename) {if (!(filename .ToLower()).EndsWith(txt)){wasLastFileNameValid false;return false ;}else{wasLastFileNameValid true;return true;} } 单元测试函数 该测试是测试isLastFilenameValid() 因为该函数是把结果赋值给类中属性wasLastFileNameValid 所以此处验证的是Calculator类中属性wasLastFileNameValid是否符合我们的期望 而不是简单的验证isLastFilenameValid(的返回值是否符合我们的期望。 [TestMethod()] public void isLastFilenameValid_ValidName_ReturnTrue() {Calculator calc new Calculator();string fileName test.txt;calc.isLastFilenameValid(fileName)Assert.IsTrue(calc.wasLastFileNameValid);}8.单元测试在MVC模式中的实现 参考 因为MVC模式中的Controller类中的Action的返回值是和普通类的方法不一样的 Action的返回值是ActionResult类型的其子类又有许多 具体怎么实现对MVC模式的单元测试呢请看一个简单的示例 代码背景在一个MVC项目中的HomeController控制器中有一个Action是Index() 首先先定义一个Person类其中有Id和Name两个属性 Action如下 public class HomeController : Controller{// GET: Homepublic ActionResult Index(){return View(Index,new Person { Id 001, Name shanzm });}}对上面的HomeController中的Index()进行一个简单的单元测试 新建一个单元测试项目或者在创建MVC项目的时候选中单元测试的按钮则自动生成一个单元测试项目 注意一定要先安装MVC的程序集NuGet:Install-Package Microsoft.AspNet.Mvc -Version 5.2.3 [TestMethod()]public void Index_Index_ReturnTrue(){//Arrage:准备测试对象HomeController hcont new HomeController();//Act:执行测试函数ViewResult result (ViewResult)hcont.Index();var viewName result.ViewName;Person model (Person)result.Model;//Assert:断言符合期望Assert.IsTrue(viewName Index model.Id 001 model.Name shanzm );} 说明 如果View()函数没指定视图而是使用默认的视图则视图名为空所以如果名称不写的时候我们可以断言ViewName是空。 注意在Action中的ViewBag传递的数据在单元测试中需要通过ViewData方式获取因为ViewBag是对ViewData的动态封装在同一个Action中二者数据相通此乃ASP.NET MVC的基础不详述 其实呀MVC模式作为UI层有许多东西其实是很难但不是不可以模拟对象去进行单元测试的一般其实不推荐做过多的单元测试。注意不是不做是不做过多过复杂的单元测试 8.单元测试相关参考 书籍.NET 单元测试的艺术 书籍单元测试之道C#版 微软dotnet文档 博客园对比MS Test与NUnit Test框架 博客园.net持续集成测试篇之Nunit文件断言、字符串断言及集合断言 博客园.netcore持续集成测试篇之MVC层单元测试
http://www.pierceye.com/news/781128/

相关文章:

  • 儿童网站模板微信网站下载
  • 建设网站的市场背景搭建本地网站做色流
  • 湖南岳阳网站建设公司黄页顺企网宾馆在什么网站做推广效果好
  • 做外贸网站 怎么收钱网站自适应手机怎么
  • wordpress分只显示标题网站内容优化关键词布局
  • 校园云网站建设怎么做网站自动响应
  • 怎么做扫码进入网站北京seo计费
  • 网站备案 2016如何找网站
  • 网站开发客户挖掘做网站没签合同
  • 适合大学生做的兼职网站中国企业网信息查询系统
  • 淘宝网站的建设与运营设计思路做网站商铺模板
  • 网站优秀设计方案中国网站制作企业排行榜
  • 南昌建设局网站查询塔吊证怎么查福州seo网站建设
  • 机关内网站建设方案书给人做传销网站
  • 厦门有什么网站制作公司邢台太行中学简介
  • 天合建设集团网站做一个网站得做多少个页面
  • 做衣服接订单的网站网站用哪些系统做的
  • 爱美刻在线制作网站罗村网站制作公司
  • 现在网站用什么软件做免费的会计做账系统
  • 国外的包装设计网站三明网站设计
  • 网站源码怎样弄成网站工商登记网站
  • 2016做砸了的小网站一键创建网站
  • 怎么制作网站域名六安网站制作人才招聘
  • 网站建设 启象科技上海公司排名100强
  • 户外旅游网站排名深圳seo专家
  • 娄底建设网站的公司深圳人才招聘网
  • 网站建设和制作网站名称设置
  • 温州外贸网站深圳工程建设交易服务中心网站
  • 网站导航网址大全网页设计模板代码免费
  • 卖机械设备什么网站做推广好做机械有什么兼职网站