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

山东做网站建设公司排名wordpress 主题路径

山东做网站建设公司排名,wordpress 主题路径,邯郸哪里制作网站,给小学生做家教的网站Photo #xff1a;Unit Test in Visual Studio文 | Edison Zhou2015年看了Roy Osherove的《单元测试的艺术》一书#xff0c;颇有收获。因此#xff0c;我在当时就将我的学习笔记过程记录了下来#xff0c;并分为四个部分分享成文#xff0c;与各位Share。本篇作为入门Unit Test in Visual Studio文 | Edison Zhou2015年看了Roy Osherove的《单元测试的艺术》一书颇有收获。因此我在当时就将我的学习笔记过程记录了下来并分为四个部分分享成文与各位Share。本篇作为入门介绍了单元测试的基础知识例如如何使用一个测试框架基本的自动化测试属性等等还有对应的三种测试类型。相信你可以对编写单元测试从一无所知到及格水平这也是原书作者的目标。1  单元测试基础   什么是单元测试一个单元测试是一段自动化的代码这段代码调用被测试的工作单元之后对这个单元的单个最终结果的某些假设进行检验。单元测试几乎都是用单元测试框架编写的。单元测试容易编写能够快速运行。单元测试可靠、可读并且可维护。只要产品代码不发生变化单元测试的结果是稳定的。与集成测试有何区别Note集成测试是对一个工作单元进行的测试这个测试对被测试的工作单元没有完全的控制并使用该单元的一个或多个真实依赖物例如时间、网络、数据库、线程或随机数产生器等。总的来说集成测试会使用真实依赖物而单元测试则把被测试单元和其依赖物隔离开以保证单元测试结果高度稳定还可以轻易控制和模拟被测试单元行为的任何方面。                                  2  测试驱动开发基础   传统的单元测试流程测试驱动开发流程概要如上图所示TDD和传统开发方式不同我们首先会编写一个会失败的测试然后创建产品代码并确保这个测试通过接下来就是重构代码或者创建另一个会失败的测试。在前年底2018加入X公司的时候我的老板曾经推行了TDD给我们我也弄了一些TDD的demo应用不过最终还是没有推行起来源自于项目的交付压力只保留了事后写单元测试的要求而且还是Service类的核心主流程业务代码的单元测试作为保护层在增加功能修复Bug时需要通过单元测试才能提交代码。3  第一个单元测试   NUnitNUnit 是从流行的Java单元测试框架JUnit直接移植过来的之后NUnit在设计和可用性上做了极大地改进和JUnit有了很大的区别给日新月异的测试框架生态系统注入了新的活力。作为一名.NET程序员如何在VS中安装NUnit并能够在VS中直接运行测试呢Step1.在NuGet中找到NUnit并安装Step2.在NuGet中找到NUnit Test Adapter并安装LogAn示例项目LogAn Log And Notificaition场景公司有很多内部产品用于在客户场地监控公司的应用程序。所有这些监控产品都会写日志文件日志文件存放在一个特定的目录中。日志文件的格式是你们公司自己制定的无法用现有的第三方软件进行解析。你的任务是实现一个产品对这些日志文件进行分析在其中搜索特定的情况和事件这个产品就是LogAn。找到特定的情况和事件后这个产品应该通知相关的人员。在本次的单元测试实践中我们会一步一步编写测试来验证LogAn的解析、事件识别以及通知功能。首先我们需要了解使用NUnit来编写单元测试当然你也可以使用MsTest也是可以的。编写第一个单元测试1我们的测试从以下这个LogAnalyzer类开始这个类暂时只有一个方法IsValidLogFileName public class LogAnalyzer{public bool IsValidLogFileName(string fileName){if (fileName.EndsWith(.SLF)){return false;}return true;}} 这个方法检查文件扩展名据此判断一个文件是不是有效的日志文件。这里在if中故意去掉了一个!运算符因此这个方法就包含了一个Bug-当文件名以.SLF结尾时会返回false而不是返回true。这样我们就能看到测试失败时在测试运行期中显示什么内容。2新建一个类库项目命名为Manulife.LogAn.UnitTests被测试项目项目名为Manulife.LogAn.Lib。添加一个类取名为LogAnalyzerTests.cs。3在LogAnalyzerTests类中新增一个测试方法取名为IsValidFileName_BadExtension_ReturnsFalse()。首先我们要明确如何编写测试代码一般来说一个单元测试通常包含三个行为因此根据以上三个行为我们可以编写出以下的测试方法其中断言部分使用了NUnit框架提供的Assert类 [TestFixture]public class LogAnalyzerTests{[Test]public void IsValidFileName_BadExtension_ReturnsFalse(){LogAnalyzer analyzer new LogAnalyzer();bool result analyzer.IsValidLogFileName(filewithbadextension.foo);Assert.AreEqual(false, result);}} 其中属性[TestFixture]和[Test]是NUnit的特有属性NUnit用属性机制来识别和加载测试。这些属性就像一本书里的书签帮助测试框架识别记载程序集里面的重要部分以及哪些部分是需要调用的测试。1.[TestFixture]加载一个类上标识这个类是一个包含自动化NUnit测试的类2.[Test]加在一个方法上标识这个方法是一个需要调用的自动化测试另外再说一下测试方法名称的规范一般包含三个部分[UnitOfWorkName]_[ScenarioUnderTest]_[ExpectedBehavior]1.UnitOfWorkName  被测试的方法、一组方法或者一组类2.Scenario  测试进行的假设条件例如“登入失败”“无效用户”或“密码正确”等3.ExpectedBehavior  在测试场景指定的条件下你对被测试方法行为的预期  奔跑吧第一个单元测试1编写好测试代码之后点击测试-运行-所有测试2然后点击测试-窗口-测试窗口管理器你会看到以下场景从上图可以看出我们得测试方法并没有通过我们期望Expected的结果是False而实际Actual的结果却是True。继续添加你的单元测试1通常在进行单元测试时我们会考虑到代码覆盖率点击测试-分析代码覆盖率-所有测试你可以看到以下结果80%2这时我们需要想出完善的测试策略来覆盖所有的情况因此我们添加一些测试方法来提高我们的代码覆盖率。这里我们添加两个方法一个测试大写文件扩展名一个测试小写文件扩展名 [Test]public void IsValidFileName_GoodExtensionLowercase_ReturnsTrue(){LogAnalyzer analyzer new LogAnalyzer();bool result analyzer.IsValidLogFileName(filewithgoodextension.slf);Assert.AreEqual(true, result);}[Test]public void IsValidFileName_GoodExtensionUppercase_ReturnsTrue(){LogAnalyzer analyzer new LogAnalyzer();bool result analyzer.IsValidLogFileName(filewithgoodextension.SLF);Assert.AreEqual(true, result);} 这时测试结果如下图所示这时再来看看代码覆盖率100%3为了让所有的测试都能通过这时我们需要修改源代码改用大小写不敏感的字符串匹配 public bool IsValidLogFileName(string fileName){if (!fileName.EndsWith(.SLF, StringComparison.CurrentCultureIgnoreCase)){return false;}return true;} 这时我们再来运行一下所有的测试也可以选择 运行未通过的测试来看下由红到绿的快感。单元测试的理念很简单只有所有的测试都通过继续前行的绿灯才会亮起。哪怕只有一个测试失败了进度条上都会亮起红灯显示你的系统或者测试出现了问题。4  More NUnit参数化重构单元测试NUnit中有个叫做 参数化测试Parameterized Tests的功能我们可以借助[TestCase]标签特性来重构我们的单元测试 [TestCase(filewithgoodextension.slf)][TestCase(filewithgoodextension.SLF)]public void IsValidFileName_ValidExtensions_ReturnsTrue(string fileName){LogAnalyzer analyzer new LogAnalyzer();bool result analyzer.IsValidLogFileName(fileName);Assert.AreEqual(true, result);} 可以看到借助TestCase特性测试数目没有改变但是测试代码却变得更易维护更加易读。SetUp与TearDownNUnit还有一些特别的标签特性可以很方便地控制测试前后的设置和清理状态工作他们就是[SetUp]和[TearDown]。1.[SetUp] 这个标签加在一个方法上NUnit每次在运行测试类里的任何一个测试时都会先运行这个setup方法2.[TearDown] 这个标签标识一个方法应该在测试类里的每个测试运行完成之后执行 [TestFixture]public class LogAnalyzerTests{private LogAnalyzer analyzer null;[SetUp]public void Setup(){analyzer new LogAnalyzer();}[Test]public void IsValidFileName_ValidFileLowerCased_ReturnsTrue(){bool result analyzer.IsValidLogFileName(whatever.slf);Assert.IsTrue(result, filename should be valid!);}[Test]public void IsValidFileName_ValidFileUpperCased_ReturnsTrue(){bool result analyzer.IsValidLogFileName(whatever.SLF);Assert.IsTrue(result, filename should be valid!);}[TearDown]public void TearDown(){analyzer null;}} 我们可以把setup和teardown方法想象成测试类中测试的构造函数和析构函数在每个测试类中只能有一个setup和teardown方法这两个方法对测试类中的每个方法只执行一次。不过使用[Setup]越多测试代码可读性就越差。原书作者推荐采用工厂方法Factory Method初始化被测试的实例。 /// summary/// 工厂方法初始化 LogAnalyzer/// 既节省编写代码的时间又使每个测试内的代码更简洁易读/// 同时保证 LogAnalyzer 总是用同样的方式初始化/// /summaryprivate static LogAnalyzer MakeAnalyzer(){return new LogAnalyzer();} 在测试方法中可以直接使用 [Test]public void IsValidFileName_BadExtension_ReturnsFalse(){LogAnalyzer analyzer MakeAnalyzer();bool result analyzer.IsValidLogFileName(filewithbadextension.foo);Assert.AreEqual(false, result);} 检验预期的异常很多时候我们的方法中会抛出一些异常这时如果我们的测试也应该做一些修改。在NUnit中提供了一个API : Assert.CatchT(delegate)首先我们修改一下被测试的方法增加一行判断文件名是否为空的代码 public bool IsValidLogFileName(string fileName){if(string.IsNullOrEmpty(fileName)){throw new ArgumentException(filename has to be provided);}if (!fileName.EndsWith(.SLF, StringComparison.CurrentCultureIgnoreCase)){return false;}return true;} 然后我们新增一个测试方法使用Assert.Catch来检测异常是否一致 [Test]public void IsValidFileName_EmptyName_Throws(){LogAnalyzer analyzer new LogAnalyzer();// 使用Assert.Catchvar ex Assert.CatchException(() analyzer.IsValidLogFileName(string.Empty));// 使用Assert.Catch返回的Exception对象StringAssert.Contains(filename has to be provided, ex.Message);} 忽略测试有时候测试代码有问题但是我们又需要把代码签入到主代码树中。在这种罕见的情况下虽然确实非常少可以给那些测试代码自身有问题的测试加一个[Ignore]标签特性。 [Test][Ignore(there is a problem with this test!)]public void IsValidFileName_ValidFile_ReturnsTrue(){// ...} 可以看到这个测试确实被忽略了设置测试的类别我们可以把测试按照指定的测试类别运行使用[Category]标签特性就可以实现这个功能 [Test][Category(Fast Tests)]public void IsValidFileName_BadExtension_ReturnsFalse(){LogAnalyzer analyzer new LogAnalyzer();bool result analyzer.IsValidLogFileName(filewithbadextension.foo);Assert.AreEqual(false, result);} 测试系统状态的改变此前我们得测试都有返回值而很多要测试的方法都没有返回值而只是改变对象中的某些状态我们又该如何测试呢首先我们修改IsValidLogFileName方法增加一个状态属性 public class LogAnalyzer{public bool WasLastFileNameValid { get; set; }public bool IsValidLogFileName(string fileName){// 改变系统状态WasLastFileNameValid false;if(string.IsNullOrEmpty(fileName)){throw new ArgumentException(filename has to be provided);}if (!fileName.EndsWith(.SLF, StringComparison.CurrentCultureIgnoreCase)){return false;}// 改变系统状态WasLastFileNameValid true;return true;}} 其次我们编写一个测试对系统状态进行断言 [TestCase(badfile.foo, false)][TestCase(goodfile.slf, true)]public void IsValidFileName_WhenCalled_ChangesWasLastFileNameValid(string fileName, bool expected){LogAnalyzer analyzer new LogAnalyzer();analyzer.IsValidLogFileName(fileName);Assert.AreEqual(expected, analyzer.WasLastFileNameValid);} 5  小结这一篇作为入门带领大家领略了一下单元测试的概念如何编写单元测试如何在VS中应用NUnit进行单元测试。相信大家以前都用过MSTest而我们这里却使用了NUnit。所以下面我们来总结一下MSTest与NUnit在特性标签上的一些区别MSTest AttributeNUnit Attribute用途[TestClass][TestFixture]定义一个测试类里面可以包含很多测试函数和初始化、销毁函数以下所有标签和其他断言。[TestMethod][Test]定义一个独立的测试函数。[ClassInitialize][TestFixtureSetUp]定义一个测试类初始化函数每当运行测试类中的一个或多个测试函数时这个函数将会在测试函数被调用前被调用一次在第一个测试函数运行前会被调用。[ClassCleanup][TestFixtureTearDown]定义一个测试类销毁函数每当测试类中的选中的测试函数全部运行结束后运行在最后一个测试函数运行结束后运行。[TestInitialize][SetUp]定义测试函数初始化函数每个测试函数运行前都会被调用一次。[TestCleanup][TearDown]定义测试函数销毁函数每个测试函数执行完后都会被调用一次。[AssemblyInitialize]--定义测试Assembly初始化函数每当这个Assembly中的有测试函数被运行前会被调用一次在Assembly中第一个测试函数运行前会被调用。[AssemblyCleanup]--定义测试Assembly销毁函数当Assembly中所有测试函数运行结束后运行一次。在Assembly中所有测试函数运行结束后被调用[DescriptionAttribute][Category]定义标识分组。参考资料1Roy Osherove 著金迎 译《单元测试的艺术第2版》2Aileer《对比MS Test与NUnit Test框架》2020后记虽然这是一篇发表于2015年的文章但我至今觉得仍有价值。因为我发现在.NET圈还是有很多童鞋不了解单元测试和不喜欢写单元测试不懂其价值就不会形成增强回路。所谓增强回路就是我单元测试写的越多以后修改代码增加功能就不容易出现Bug这里主要指集成测试阶段、UAT测试阶段乃至线上越不容易出现Bug我提交的代码质量就越高就会增强我写单元测试的愿望形成一个回路。在我现在的实践中是把单元测试加入了持续集成构建任务中的每次组员提交代码都会触发构建任务去编译项目去跑单元测试只要单元测试没有跑过就会邮件或者通知发出来告诉我我会知道是谁提交的代码居然没有跑单元测试就提交了我就会找他改Bug了呵呵。The End「 码字不易也希望各位看官看完觉得还行就在本文右下方顺手点个“在看”那就是对我最大的鼓励如果觉得很好也可以转发给你的朋友让更多人看到独乐乐不如众乐乐是吧」往期精彩回顾.NET Core on K8S学习与实践系列文章索引目录.NET Core 微服务学习与实践系列文章索引目录【资料】2019 .NET China Conf 大会资料下载【视频】2019 .NET China Conf 大会视频发布2019 .NET China Conf 路一直都在社区会更好基于Jenkins的开发测试全流程持续集成实践基于Jenkins Pipeline的.NET Core持续集成实践【导读】我读经典心旷神怡 - 经典书籍读后感汇总【导读】我的诗和远方 - 也读唐诗与旅游游记汇总点个【在看】如何?
http://www.ihoyoo.com/news/52129.html

相关文章:

  • 推荐上海网站建站品牌推广网站企业
  • 济南建站公司价格销售系统的整个流程
  • 营销类网站如何优化网站开发商
  • 百度服务电话四川seo推广
  • 医院网站建设的目的国内的电商平台
  • 网站开发页面大小适应屏幕wordpress哪个好用
  • 网站建设与制作软件成都网站关键词排名
  • 微信网站如何做网站的流量是怎么回事
  • 展馆设计收费标准防控政策优化
  • 石家庄网站建设套免费html5中文网站素材
  • 信息免费建站网站有哪些免费企业网站如何建设
  • 深圳网站建设有没有市场腾讯有做淘宝客网站吗
  • 微信网站是多少钱html网页设计作品代码编写
  • 网站seo关键词优化排名vs2015网站开发教程
  • 专门做投票的网站有哪些专业网站建设的价格
  • 网站及网页设计费用下载别人的wordpress模板
  • 网站和新媒体建设审批制度微信商城平台
  • 网站的ftp怎么登陆免费做公司电子画册的网站
  • 泉州最好的网站建设公司wordpress 红包广告
  • 网站建设计划设计方案网站导入
  • 合肥建站企业wordpress 博主
  • 塘沽做网站比较好的行业内做网站的公司排名
  • 企业门户网站 php字体版权登记网站
  • phpmysql网站模板wordpress 多用户
  • 网站seo新手网站优化推广是什么
  • 海外微网站建设上海做电缆桥架的公司网站
  • 学网站建设需要用哪几个软件wordpress调用文章列表
  • 单页网站制作视频教程网店代运营
  • 旅游建设投资公司网站中职网页设计与制作教材
  • 网站建设模板删不掉引擎搜索大全