菜鸟要做架构师(三)——单元测试的七种境界

软件开发离不开测试,而与开发人员关系最密切的当属单元测试了。别看单元测试只是整个软件测试学科的一部分,但是他里面的学问也不少,今天就跟大家分享一下,单元测试的七种境界。

1,以各种借口拒绝单元测试Unit Test,比较常用的是“你没有足够的时间(进行单元测试)”。

无论是对单元测试的老手还是新手编写单元测试还是有一定得工作量的,而且单元测试也需要掌握大量的测试框架和工具(光一个junit或testng你很难工作地很happy)。所以在这个阶段开发人员往往会觉得单元测试很难写、很费时,自然而然会使用没有足够的时间(进行单元测试)的借口,其实在这个阶段开发人员需要积极地学习和掌握测试框架和理解单元测试理念。

2,尝试单元测试并且立刻开始在自己的博客商鼓吹单元测试和测试驱动开发Test Driven Development的好处。

开发人员在这个阶段学习很掌握了一些单元测试的工具并在实际工作中加以的运用,并很好的解决了一些问题,意识到了单元测试的价值。我自己也向同事和同学介绍过相关的技术,希望大家对相关的技术能很好的学习和运用,现在回想那个时候对单元测试的技术的掌握和理解都是不完整的,只能说是初窥门径而已。

3,单元测试一切。为了能够完成单元测试,而将私有private的方法和属性修改为内部internal;为了达到单元测试覆盖率100%而测试getter() 和 setter() 属性(方法)。

这样的阶段很明显,特别是遇到private,static方法的测试时会感到很麻烦,所以往往采用了一些不优美的解决方式,目的是能够对相关的方法和类进行单元测试,但没有从根本上意识到是自己的设计有问题,从而导致可测试比较差(testability)。至于对getter和setter方法进行测试到是没有过,可能只自己所在的公司一直都没有片面的强调过测试100%覆盖率吧。

4,无法忍受脆弱的单元测试,在没有弄明白是什么的时候,就匆忙转向“集成测试"。

单元测试也是代码,只要是代码就会有设计、编码上共同的问题,比如设计模式的运用、重复代码的问题。在无法理解和单元测试中“单元”和“隔离”这两个名词的情况下,会想要通过集成测试来实现单元测试。我自己没有运用过集成测试的工具,但用dbunit直接模拟数据库的情况,从而将多个类“集成”起来测试是这个阶段最常用的单元测试方法。实际上用dbunit直接模拟数据库也是非常脆弱和繁琐的,mocking才是王道。

5,发现了一种模拟 mocking 框架,并且乐于使用强制语义(strict semantics)。

mocking是单元测试中不可缺少的重要组成,Java的单元测试方案中Easymock和Jmock是两个成熟的Mock框架。但Mocking的学习和理解可能是单元测试工具中最具有难度的地方了,通过运用Mocking你会发觉之前很多工作(比如数据库模拟)都是浪费时间、精力和无效的。

6,模拟mock所有可能模拟mocked的对象。

通过在单元测试中运用Mocking真正贯彻了单元测试的“单元”和“隔离”的原则,不过Mocking是在件繁琐和困难的事情,这时候就需要考虑什么是必须要mock的、什么可以不mock的。

7,开始真正有效单元测试。

恭喜你终于达到了这个阶段,你已经将面向对象设计、设计模式、单元测试、重构等一些技术都融汇到了一起,你终于可以根据自己的意愿编写真正有效的单元测试了。在这个阶段可能你掌握或有了一套测试框架,这套测试框架整合了junit、testng、jmock、easymock、dbunit、xumlunit、unitils等一系列你测试工具使你的编写单元测试效率是之前的3-4倍或者更多。

七种境界,层层递进、层层深入,从形式主义到将单元测试真正的应用到工作中,这也是我们从一开始接触单元测试,到慢慢熟悉、到深入理解、到灵活运用的一个自然过程。你们现在都处在哪个阶段呢?请自己找位置坐吧~~

时间: 2024-11-15 11:52:01

菜鸟要做架构师(三)——单元测试的七种境界的相关文章

菜鸟要做架构师(二)——java性能优化之for循环

完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的.今天就来说一下java代码优化的事情,今天主要聊一下对于for(while等同理)循环的优化. 作为三大结构之一的循环,在我们编写代码的时候会经常用到.循环结构让我们操作数组.集合和其他一些有规律的事物变得更加的方便,但是如果我们在实际开发当中运用不合理,可能会给程序的性能带来很大的影响.所以我们还是需要掌握一些技巧来优化我们的代码的. 嵌套循环 stratTime

直击架构本质:优秀架构师必须掌握的几种架构思维

介绍 架构的本质是管理复杂性,抽象.分层.分治和演化思维是我们工程师/架构师应对和管理复杂性的四种最基本武器. 最近团队来了一些新人,有些有一定工作经验,是以高级工程师/架构师身份进来的,但我发现他们大部分人思维偏应用和细节,抽象能力弱.所以作为团队技术培训的一部分,我整理了这篇文章,希望对他们树立正确的架构设计思维有帮助.我认为,对思维习惯和思考能力的培养,其重要性远远大于对实际技术工具的掌握. 由于文章内容较长,所以我把它分成两篇小文章,在第一篇<优秀架构师必须掌握的架构思维>中,我会先介

优秀架构师需要培养的四种架构思维

一个优秀架构师必须要培养四种架构思维:抽象.分层.分治.演化. 架构的本质是管理复杂性,抽象.分层.分治和演化思维是架构师征服复杂性的四种根本性武器. 掌握了抽象.分层.分治和演化这四种基本的武器,你可以设计小到一个类,一个模块,一个子系统,或者一个中型的系统,也可以大到一个公司的基础平台架构,微服务架构,技术体系架构,甚至是组织架构,业务架构等等. 架构设计不是静态的,而是动态演化的.只有能够不断应对环境变化的系统,才是有生命力的系统.所以即使你掌握了抽象.分层和分治这三种基本思维,仍然需要演

【分享】怎样做架构师?

认识架构最重要的事 你要知道你所面对的是一个系统而不是一件事. 你可能每天会面对一堆待处理的事,如果你看到的只是事的过程和结果,而非事情本身,你就仅仅是工程师,一位实施者.跳出这个框子,你面临的其实是一个系统,你看清楚这个系统之后,还要看清楚这个系统里面的关键要素. 举个例子 一个人在河的前面想过这条河,有一条船放在那里. 如果你认为过河是一件事,你的第一件事是跳到船上想办法把船划过去.你遇到的第一个问题可能是你没有划船的技能. 但是如果你是一个架构师,你的第一个问题是:这是什么东西?你可以定义

重读《从菜鸟到测试架构师》-- 职业生涯的考虑

都说万事开头难,小艾作为菜鸟测试工程师加入到测试项目团队,努力学习着关于测试入门的知识.有了基本的知识及对测试的领域有了一定的认识之后,小艾开始思考自己的职业生涯应该有什么样的前景?测试工程师是一个专注程度很高的技术背景职位,但小艾并不清楚自己未来无论是在技术还是管理上有哪些可以选择的发展方向,更别说如何选择方向了. 于是,热心的导师再次登场,为小艾深入剖析技术与管理道路的发展路线. 测试工程师的技术发展路线 在职业发展起步期,测试工程师可以先把自己定位为某种专门测试的专家,如功能测试专家.系统

重读《从菜鸟到测试架构师》-- 开发人员也需要做测试

小艾经过了安装测试的历练,明显对软件测试又有了更深刻的了解.而在进行测试过程中,小艾遇到一个导致他手里大部分case失败的bug,而这个bug的幼稚简直令小艾忍不住想骂开发人员. 而就在小艾质疑为什么开发人员没有发现这么简单的bug的时候,小艾作为支援人员被调进了开发组协助开发工作,忙碌的开发组也立刻给小艾下达了第一份任务,完成某user story的代码开发及单元测试. 可是小艾的编码能力有限,紧赶慢赶才在限定的时间里完成了开发任务,没时间做单元测试了,只是简单测了测,就提交了代码,于是出现了

重读《从菜鸟到测试架构师》-- 黑色的盒子里面有什么(上)

上一章提到,由于研发组工作繁忙,小艾被派遣过去协助做开发工作,在协助过程中,小艾明白了单元测试是怎么回事以及如何进行,也就是说,小艾接触到了白盒测试的相关知识.伴随着开发进度的有序进行,小艾回到了测试团队开启了新一轮的测试旅程. 可是在工作中,对着可执行的程序不知道从哪里入手,毕竟之前一边读代码,一边调试来找问题,十分得心应手,这下倒好,没有代码可以看可以调了-- 小艾的功能测试第一课--准备手电 功能测试,其实是很简单但是又不那么简单的一件事,简单到一句话可以描述其定义,难却也难在要做到这句话

重读《从菜鸟到测试架构师》-- 客户的圣经之用户手册验证

有朋友看出来了,最近几篇文章很短,一方面,是这几个章节写得内容相对较简单,所以内容比较简短,还有一方面是我这几天相对比较忙,这篇文章也依然保持其篇幅小的特征,不过在这里可以保证,文章尽管短,但依然一字不落地将值得阅读的文字搬了上来,方便大家阅读学习~ 上一回说到小艾明白了安装测试中安装与卸载的测试用例如何保证质量,兴致冲冲地小艾回到座位之后,依据自己学的内容再次投入到工作中,可是,小艾却犯了一个连自己完全没有意识到的错误,幸好,组长在检查小艾的测试报告时发现了,这个错误就是用户手册没有及时认真进

重读《从菜鸟到测试架构师》-- 对黑盒子的全方位照明

上回说到,小艾学会了分而治之的方式来将模块细化做功能测试,这样的好处是更容易找到bug,但尽管容易找bug,并不表示bug就能完全被找到,而不被交付到客户手里.也出于对客户发现的bug进行分析,组长告诉小艾,不仅仅需要分而治之,也需要合而治之. 上一章我们也提到一个名词:跨模块/解决方案的功能测试,即功能集成测试,其实这就是为了确保所有的功能特征,或者User Story在一个产品或应用的开发过程中能够被彻底测试,而对产品的各个模块或者解决方案,按照用户的使用方式,根据模块/解决方案间的逻辑关系