日常啰嗦

看到标题你可能会问为什么这一篇会谈到代码测试,不是说代码优化么?前两篇主要是讲了程序的输出及Log4j的使用,Log能够帮助我们进行bug的定位,优化开发流程,而代码测试有什么用呢?其实测试是为了验证自己所编写的代码,及时排除错误,减少bug,所以我认为,减少错误也是优化的一个方案体现,而且如果进行了合理的单元测试,也可以帮助优化开发流程,一旦出现问题,使得bug的定位过程更加迅速。

你愿意进行单元测试吗?

其实,像第一篇文章所说的,对于打印输出信息,我们更习惯于使用System.out命令,所以很多时候,习惯决定了我们的编码方式,那么你习惯于做单元测试吗?

我感觉很多人可能都不是很乐忠于在开发工作做这件事,因为主观意识中会觉得这是一件"麻烦"的事情,或者说效果不是很明显的一件事。

针对于此,我也粗略的整理了一下根由,对各个原因,也分别谈一下自己的想法,当然,都是个人看法,大家觉得有用就看,觉得无用忽略即可。

  • 开发项目时并没有明确的要求我去写单元测试。

因为没人要求,所以就不写单元测试。我认为作为一个技术人员,应该关注自我增值和技术上的提升,要求应该是自己提给自己的,并不是说项目没有要求或者没人督促我们就不去做一些事情了,这种装鸵鸟式的态度和钻空子的小聪明不值得提倡,我们不仅要对项目负责,其实更多的也是对自己负责,严格要求自己,多学习,才能更快的进步,不要随波逐流,不要进入其他人的节奏中。

  • 业务逻辑比较简单不值得编写单元测试。

这又是一个理由,而这个理由的深层次的原因,应该是来源于对自己的自信,自信是件好事,但是要掌握好其中的度。相对于机器来说,拥有主观意识的人类更容易犯一些错误,错误可能不大,或者是一些低级错误,比如忘记写一个分号、忘记判空、忘记类型转换...这些都是小错误,但是不注意的话就会出现bug,然后再去花时间修修补补。
所谓的业务逻辑比较简单,其实是相对的。当你对某一块业务逻辑很熟悉的时候,你自然会认为它很简单。然而,单元测试的必要性并不是仅仅在于测试代码的功能是否正确,还在于,当其他同事在了解你的业务的时候,能够很快的通过单元测试来熟悉代码的功能,甚至不用去读代码,就能够知道它做了哪些事情。因此,写单元测试不仅是解放了自己,更方便了别人。

  • 做了少量的单元测试。

这里可能有几方面的原因:
1、为了完成编码任务,没有足够的时间编写单元测试。
2、在项目的前期还是尽量去编写单元测试,但是越到项目的后期就越失控。
3、和上一个原因类似,对自己足够自信,于是只挑一小部分进行单元测试。

我们简单的梳理一下开发过程,开发过程:需求—>编码—>自测—>预发布—>测试—>回滚—>改bug—>发布—>发现bug—>改bug—>发布……我们可以观察到,整个过程中改bug出现了很多次,它与编码工作一样,都是开发过程中不可缺少的一部分,编码只是整个开发过程中的一部分,开发不仅仅是编码而已。
编码的完工≠项目的完工。
因为自测的不完备,导致预发布过程或者后期的冒烟测试难度加大,加长回滚和bug修复过程,这是一个自相矛盾的事情。

  • 测试人员会抓住所有的bug,用不着进行单元测试。

也会有人把锅丢给测试,可能存在这样一个观点,既然有测试了,干嘛还要我费那么多精力去写测试用例?
但是测试工程师往往不在意代码层面,其测试工作只是业务上的集成测试,也就是我们熟知的黑盒测试,更多的是进行功能测试,对代码中单个方法是没有办法进行测试的,因此,测试出的bug的范围也会很广,根本不能确定bug的范围及发生的原因,所以问题的定位及bug产生的原因,还得去花一些时间来确认,如果已经进行了自测,知道了哪部分代码是健康的,至少可以缩小检查的范围,减少定位bug所花的时间。而且,单元测试也就是顺手的一件事,虽然不能解决百分百的麻烦,但是给各方人员提供的便利也是很多的。

  • 不会写。

想当初刚进入这个行业,我压根儿不知道这个事情,也根本没有单元测试的概念,因为那时候我连开发工作都做的不是很好,更不要提过程优化了,直到一段时间后,熟悉了开发流程,可以把开发做好的时候,才开始慢慢接触流程优化,但是一开始碰到的问题就是,我不会。
其实网上教程也是很多的,下一篇会进行简单的介绍和教程,代码也会放到github中,不会可以学,但是不做的话就有些不负责任了。

代码测试的重要性及必要性

测试常常是程序员十分厌倦的一个事情。测试能给我们带来什么?了解这些是非常重要的,测试不可能保证一个程序是完全正确的,但是测试却可以增强我们对程序完整的信心,测试可以让我们相信程序做了我们期望它做的事情。测试能够使我们尽早的发现程序的bug和不足。
当然,我们主要讨论的是单元测试。单元测试是一个方法层面上的测试,也是最细粒度的测试。用于测试一个类的每一个方法都已经满足了方法的功能要求。在开发中,对于自己开发的模块,只有在通过单元测试之后,才能提交到SVN库或者Git 库。
再一次强调,你不是一个人,你的代码有问题,同事pull下来的代码也是有问题的,浪费大家的时间。对于这件事情,我是深有感触的,在去年的一次项目开发过程中,由于我没有做好代码审查和单元测试匆匆上传到代码库,导致其他开发人员也无法正常开展工作,还要帮着我去修改bug,这件事导致我有些自责,也在后续的开发工作中更认真,更专注,虽然偶尔也会犯错,但是在态度上不再吊儿郎当、无关痛痒,代码测试有时候也能体现出一个人的态度问题。
知道测试的重要性最好,只要写就是对项目和编码认真的体现,虽然一开始可能写的不是很好很完善,迈出第一步就是正确的,随着测试编码的增多,测试用例也会逐渐完善,关键是要明确和认识到单元测试的重要性。

最终目的

前面论述了一下单元测试难以推进的原因以及单元测试的重要性,当我们开始认真的去做这件事了,我们也要做好这件事,我们想要追求的是完美,即使无法十全十美,也要尽自己的全力去争取写出漂亮的代码,漂亮指得是易读、简洁、健壮,为了达到这个目的,我们就需要做覆盖率高以及更完善的单元测试。
测试的覆盖率和完备性越高对于项目来说就越是一个利好的信号,即使做了单元测试,但是较为懒散,随随便便写了几个测试用例,这不能算得上单元测试,这种行为不仅是对项目不负责任,也是对自己不负责任。
不能和不为区别是很大的,不能代表的就是你没有能力去做到一件事,而不为则是明明能做到却不做。对于不能,那么首先要做的,就是通过自己的努力和学习将不能变为能,可能现在项目中并没有做单元测试,原因是因为不会,那就要学习如何去进行单元测试,掌握这个技能。

结语

认真些,端正自己的态度,做好自己的单元测试。

(怎么感觉说出这些话的我这么正气凛然,我不像是个刚正不阿的五道杠青年啊,哈哈哈哈哈。)

Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试的更多相关文章

  1. Spring+SpringMVC+MyBatis+easyUI整合优化篇(二)Log4j讲解与整合

    日常啰嗦 上一篇文章主要讲述了一下syso和Log间的一些区别与比较,重点是在项目的日志功能上,因此,承接前文<Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)Sy ...

  2. Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(三)代码测试>讲了不为和不能两个状态,针对不为,只能自己调整心态了,而对于不能,本文会结合一 ...

  3. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十三)数据层优化-表规范、索引优化

    本文提要 最近写的几篇文章都是关于数据层优化方面的,这几天也在想还有哪些地方可以优化改进,结合日志和项目代码发现,关于数据层的优化,还是有几个方面可以继续修改的,代码方面,整合了druid数据源也开启 ...

  4. Spring+SpringMVC+MyBatis+easyUI整合优化篇

    优化篇 Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log Spring+SpringMVC+MyBatis+easyUI整合优化篇 ...

  5. Spring+SpringMVC+MyBatis+easyUI整合优化篇(五)结合MockMvc进行服务端的单元测试

    日常啰嗦 承接前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(四)单元测试实例>,已经讲解了dao层和service层的单元测试,还有控制器这层也不能 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合优化篇(七)图片上传功能

    日常啰嗦 前一篇文章<Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合>讲了富文本编辑器UEditor的整合与使用 ...

  7. Spring+SpringMVC+MyBatis+easyUI整合优化篇(十四)谈谈写博客的原因和项目优化

    阶段总结 又到了优化篇的收尾阶段了,这其实是一篇阶段总结性的文章,今天是4月29号,距离第一次发布博客已经两个月零5天,这两个多月的时间,完成了第一个项目ssm-demo的更新,过程中也写了33篇博客 ...

  8. Spring+SpringMVC+MyBatis+easyUI整合优化篇(六)easyUI与富文本编辑器UEditor整合

    日常啰嗦 本来这一篇和接下来的几篇是打算讲一下JDBC和数据库优化的,但是最近很多朋友加我好友也讨论了一些问题,我发现大家似乎都是拿这个项目作为练手项目,作为脚手架来用的,因此呢,改变了一下思路,JD ...

  9. Spring+SpringMVC+MyBatis+easyUI整合优化篇(一)System.out.print与Log

    日常啰嗦 距离上一次更新博客有一段时间了,主要是因为最近有开发任务,另外,这段时间也在学习docker的相关知识,所以博客就没有继续写了,推荐一本书<Docker技术入门与实战>(第二版) ...

随机推荐

  1. Android Studio --“Cannot resolve symbol” 解决办法

    鼠标放上去后显示 “Cannot resolve symbol XXX”,重启 Android Studio,重新 sync gradle,Clean build 都没有用. 多半是因为 Androi ...

  2. 11 Python+selenium对下拉框(select)进行处理

    [环境信息] Python3.4+IE+windows2008 [Select下拉框处理] 1.对于如图1的下拉框,可以用selenium自带的Select类进行选择. 2.定位示例: from se ...

  3. 【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换

    最近因为项目需要在做两个项目间数据同步的需求,具体是项目1的数据通过消息队列同步到项目2中,因为这个更新操作还涉及到更新多个库的数据,所以就需要多数据源切换的操作.下面就讲讲在Spring中如何进行数 ...

  4. Ionicons的使用

    安装 参考Ionicons npm install react-native-vector-icons --save 这时候可能会报错:npm WARN deprcated lodash@4.2.0: ...

  5. 康复计划#4 快速构造支配树的Lengauer-Tarjan算法

    本篇口胡写给我自己这样的老是证错东西的口胡选手 以及那些想学支配树,又不想啃论文原文的人- 大概会讲的东西是求支配树时需要用到的一些性质,以及构造支配树的算法实现- 最后讲一下把只有路径压缩的并查集卡 ...

  6. 【转】jqGrid学习之参数

    jqGrid参数 名称 类型 描述 默认值 可修改 url string 获取数据的地址 datatype string 从服务器端返回的数据类型,默认xml.可选类型:xml,local,json, ...

  7. 在Azure上部署带有GPU的深度学习虚拟机

    1. 登录https://portal.azure.com 2. 点击"+创建",在弹出的页面搜索"deep learning toolkit for the DSVM& ...

  8. 自定义view(二)

    这里是自定义view(二),上一篇关于自定义view的一些基本知识,比如说自定义view的步骤.会涉及到哪些函数以及如何实现自定义属性,同时实现了一个很基础的自定义控件,一个自定义的计时器,需要看的人 ...

  9. GPU渲染管线概述

    1.顶点着色器 顶点着色器是流水线的第一个阶段,它的输入来自于CPU.顶点着色器的处理单位是顶点,也就是说输入进来的每个顶点都会调用一次顶点着色器. 顶点着色器需要完成的工作主要有:坐标变换和逐顶点光 ...

  10. Eclipse打JAR包的使用

    编译Java代码你当然可以直接使用Javac,但对于大多同学还是使用Eclipse编辑器来得快捷.这篇文章来说说我使用Eclipse编译后的执行之路,走路许多弯路,看我一一道来. 演示系统的架构 首先 ...