关于测试的必要性什么的已经在 重构与测试 里扯过了。倒也没必要说,写的代码多了自然就明白这个东西重要性。

当时说了坐等被推动去学习单元测试来着,然而等着被人推动的结果就是根本就没人来推你。o(∩_∩)o

所以还是自己主动来学,主动来总结了。

可测试性设计基础理论知识

可测试性设计(Design for Testability, DFT)是一种集成电路技术,它将一些特殊结构在设计阶段植入电路,以便设计完成后进行测试。

后来这种玩法被应用到了软件之中。它关注的是在正确的、错误的、丢失的和不完整的输入下的输出是否符合预期。

具有可测试性的软件一般是采取松散设计,目的是为了方便测试软件去调用,那么低耦合就是它的原则了。(话说回来,就算不为了可测试性,低耦合也很重要啊)

比如基于接口来编程,就是众所周知的降耦合的方法之一,减少测试时的依赖性。

编写可测试性代码的时候,也是对代码结构的一个评审,因为一个在测试中无法轻松实例化的类,那么就必定会存在耦合问题。

测试的代码也应该保证效率,而低耦合也可以减少一些无用的测试环境的配置,那么测试代码的运行速度就会提升,这在大的项目中尤为重要。

如果不能使代码的结构低耦合,那么就不是单元测试了,而变为了集成测试。

虽然集成测试同样有必要,但是不论是运行速度上还是对于问题发生后定位问题的速度上而言,都不如单元测试方便。

关于单元测试

单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。

上面是单元测试的百度百科定义。

单元测试包括编写和运行一个小的程序,以自动的方法实例化测试类以及调用测试方法。

如果我们要手动去写代码去测试一个程序,虽然是可行的,但是毕竟耗时耗力,所以执行单元测试的最有效和最常见的方式是使用自动化的测试框架。

这个框架通常包括一个运行时引擎和一个类的框架,用于简化测试程序的创建。

常用的自动化测试框架有:MSTest、NUnit以及xUnit.net。

MSTest看这名字就直到来自微软,也就自动集成在VS中了,而为了懒得下别的资源的原因o(︶︿︶)o ,这里就用MSTest了。

单元测试中有测试固件这么个概念,实际上就是一个用于测试的类,这个类创建和结束的时候可能还会去设置测试环境和消除测试环境什么的。(所以我们后面还是就叫测试类吧)

测试方法的典型设计可以总结为:设置、作用和断言。(简单来讲,第一步设置测试环境,第二步将测试代码作用于需要测试的代码上,第三步将输出结果与预期的断言进行验证)

单元测试是由数据驱动的测试,用不同的数据(比如临界值,错误值什么的)去测试代码的可靠性。

虽然单元测试也是写代码,但是与平常的写代码还是有些区别的:

  • 测试范围尽可能小。就像单一职责原则一样,目的明确。这样做不仅有助于快速定位问题,有助于测试代码的可读性。
  • 隔离测试。即在测试一个方法时,摆脱该方法所有的依赖性,而专注于测试该方法本身。
  • 伪造和模拟。实际上这个东西就是为了配合隔离测试来的,当一个类确确实实只能依赖于另一个类时,那么就用伪造和模拟一个对象去替代被依赖的类的对象。
    • 伪造对象就是对一个对象的简单克隆,提供与原始对象相同的接口,但是返回硬编码的值。
    • 模拟对象比伪造对象更复杂,它涉及到要去模拟原始对象的一些交互
  • 一个断言。这个是一个争议点,就是为了保证测试范围尽可能小。然而在实际操作中,可能会存在很多相似的测试,所以也可以去在一个测试中运用多个断言。
  • 测试非公共成员。方法就是给所测试的类添加一个新类,然后这个新类有一些受保护的方法去调用那些要测试的非公共成员。
  • 代码覆盖率。用来计算被测试的系统中的代码有多少被测试代码测到了,以此来评估测试的可靠性。然而盲目地去提高代码覆盖率并不能说明测试的相关性和有效性,测试的关联性才是重要的。

MVC的单元测试实战

来吧,到了上点干货的时候了,实战永远比枯燥的理论有趣多了。

MVC的实现了控制器、视图、模型的分离,并且不像WebForm那样对Request和Session这些内部组件过于依赖,使得它成为了一个便于单元测试的框架。

首先创建单元测试项目。

被测试的代码就是VS2015下,不带帐号系统的MVC项目。以下为VS自动创建的单元测试项目。

可以看到默认的有一个Controller文件夹,下面为控制台测试文件。可以联想到,也可以加一个service或business文件夹去测试代码的业务逻辑。(通常而言更多的测试其实都是针对业务层,因为控制器的代码逻辑一般都比较简单)

那么看看默认的测试类HomeControllerTest中具体的代码:

用TestClass特性去标注测试类,TestMethod特性去标注测试方法。

而观察Index中的代码:

首先声明要测试的控制器类,也就是准备好测试环境,

然后用控制器实例去调用要测试的函数,

最后用断言去判断返回的结果是否符合预期。

让我们再加三个特性的用法

然后启动测试什么的也很简单:

测试的结果会显示在测试资源管理器中:

很明显看到被Ignore特性标注的被跳过了测试。还可以选择测试资源管理器中的测试然后进行单个测试,而不是像之前那样测试所有。

其实说穿了单元测试这个东西玩法很简单,需要去掌握的反而是之前的那些理论知识,保证测试的质量和高效。

说起来单元测试麻烦的地方可能也就是去解除依赖性了吧,主要是模拟交互,这个扯起来就麻烦了,百度了一下还有模拟交互的各种框架什么的,而且一些模拟Http上下文的要用到。

不过我想总会有简单的解决办法的,本质上模仿也只是伪造的交互版本而已,那么将伪造的返回结果丰富多样化,那么不就是模仿了吗?

一点拙见啦~

OK,虽然单元测试是个可以简单入门的东西,但是难度还是有的。

除了上面写到的解除依赖性,最重要的还是实施和坚持。

从明天开始慢慢来把它纳入项目中吧!

【MVC拾遗】MVC的单元测试简单学习总结的更多相关文章

  1. 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习

    嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...

  2. Asp.Net MVC+BootStrap+EF6.0实现简单的用户角色权限管理

    这是本人第一次写,写的不好的地方还忘包含.写这个的主要原因是想通过这个来学习下EF的CodeFirst模式,本来也想用AngularJs来玩玩的,但是自己只会普通的绑定,对指令这些不是很熟悉,所以就基 ...

  3. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  4. MVC系列——MVC源码学习:打造自己的MVC框架(三:自定义路由规则)

    前言:上篇介绍了下自己的MVC框架前两个版本,经过两天的整理,版本三基本已经完成,今天还是发出来供大家参考和学习.虽然微软的Routing功能已经非常强大,完全没有必要再“重复造轮子”了,但博主还是觉 ...

  5. MVC系列——MVC源码学习:打造自己的MVC框架(二:附源码)

    前言:上篇介绍了下 MVC5 的核心原理,整篇文章比较偏理论,所以相对比较枯燥.今天就来根据上篇的理论一步一步进行实践,通过自己写的一个简易MVC框架逐步理解,相信通过这一篇的实践,你会对MVC有一个 ...

  6. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  7. [转]MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    本文转自:http://www.cnblogs.com/landeanfen/p/5989092.html 阅读目录 一.MVC原理解析 1.MVC原理 二.HttpHandler 1.HttpHan ...

  8. ASP.NET MVC 4 插件化架构简单实现-思路篇

    用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC 4 来实现每个插件都可以完全从主站点剥离出来,即使只是一个插 ...

  9. ASP.NET MVC 4 插件化架构简单实现-实例篇

    先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...

随机推荐

  1. 自己动手写一个简单的MVC框架(第一版)

    一.MVC概念回顾 路由(Route).控制器(Controller).行为(Action).模型(Model).视图(View) 用一句简单地话来描述以上关键点: 路由(Route)就相当于一个公司 ...

  2. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  3. 《HiWind企业快速开发框架实战》(2)使用HiWind创建自己的项目

    <HiWind企业快速开发框架实战>(2)使用HiWind创建自己的项目 关于HiWind HiWind企业快速开发框架,是基于.NET+EasyUi(支持各种前端扩展,后面将扩展Boot ...

  4. Please Call Me NIO

    与其他语言相比,Java的IO功能显得异常复杂,各种流操作,通过程序员多次封装才可以达到操作文件的目的.自从jdk1.4之后,java提供了一个新的api完成IO操作,人称New IO(NIO),使用 ...

  5. 我所记录的git命令(非常实用)

    一.前言 记录一下工作中常用到的git命令,只是简单的笔记,欢迎大家交流... [ 顺便问下园友们,怎么感觉博客园发布的博客搜索有时都搜不到,后台编辑能填的都填写了,还是觉得搜索排名不高? 相同的标题 ...

  6. TODO:软件升级的那些事

    TODO:软件升级的那些事 软件升级,指软件从低版本向高版本的更新.由于高版本常常修复低版本的部分BUG,所以经历了软件升级,一般都会比原版本的性能更好,得到优化的效果,用户也能有更好的体验. 最近常 ...

  7. 获取bing.com的图片并在gnome3中设置自动切换

    发现 bing.com 上的图片很好看,因此打算每天把 bing.com 的图片下载下来,用作桌面. 需要做的是两个部分,爬取图片到目录和设置目录图片为桌面背景并可以自动切换. 第一部分,下载图片,使 ...

  8. iOS-数据持久化详细介绍

    1.iOS-数据解析XML解析的多种平台介绍 2.iOS-数据持久化基础-JSON与XML数据解析 3.iOS-数据持久化基础-沙盒机制 4.   数据持久化的几种方式: 1)plist(XML属性列 ...

  9. 在MacOS 10.12上安装Tomcat8.5

    在MacOS 10.12上安装Tomcat8.5 原文链接:https://wolfpaulus.com/journal/mac/tomcat8/ Context 已安装Java,使用java -ve ...

  10. 【Win10应用开发】相对布局(RelativePanel)

    外面的雨下得很大,老周就决定雨下漫笔了. 今天咱们说一个新控件——RelativePanel.本质上,它就是一个面板,面板干啥用的?面板就是一个容器,里面可以放其他对象,就像我们小时候玩的七巧板一样, ...