单元测试培训系列:(一)单元测试概念以及必要性挽星

说起单元测试,多数同学应该都知道或听过,可能不少同学认为自己也写过,甚至觉得单元测试很简单有什么好培训的?其实这个事情还真没想象的那么简单!我基本可以比较负责任的说,你若没深入对单元测试做过研究,不知道Mock对象为何物的话,那么可能你以前写过的单元测试压根就不是单元测试。

这个问题其实并不太容易一两句话说得特别清楚。先借用下百度百科的定义:

有人曾给我一段非常简单的代码片段:一个方法,里面只是调用若干个其他方法,甚至也都没有任何返回值,然后问我这种代码写单元测试有任何价值?!完全是浪费体力!!

其实提出这个疑问主要有两个原因导致:未能理解单元测试的目的是什么以及这段代码的可测试性并不高。(可测试性以及如何提高将在后面章节介绍)

单元测试的目的是用来确保程式的逻辑如你预期的方式执行,而并不是用来验证是否符合客户的需求的!通过单元测试来建立一道坚实的保障,防止代码在日后的修改中不会被破坏掉。

是不是很失望?单元测试并不是用来验证代码是否符合需求的。事实上,单元测试是白盒测试的一种,而且需要开发人员来完成,最好是谁开发的代码就该谁来编写单元测试代码,因为代码的编写者最熟悉该段代码的目的,进而编写出验证该目的是否达到的单元测试代码。单元测试并不能用来代替其他测试手段,不过是实践过程中确实会很有效的帮助开发人员自查代码,进而发现一些潜在的BUG。但这只是一个额外的收获,若不是采用TDD那样的测试先行开发方式,那么单元测试的根本目的不是用于也无法检验当前代码是否存在BUG的!

也许通过一个大家经常会碰到的实际场景能更好的说明:

一个项目开始,项目经理把需求拆解为若干个模块分发给不同的开发人员去完成。这样每个人可能只熟悉自己的那部分代码。当项目某个阶段开发完成并上线后,可能部分开发人员会离开项目进入别的新项目,留下个别人员继续维护;或者项目下阶段开发新进一大批人员并不熟悉当前项目;当然最常见的是,在修改BUG阶段是无法完全做到谁产生的BUG就安排谁去修改。那么这时候就会出现一种常见的情况:因为对当前代码要满足的各种目的不熟悉,在修改一个模块或者BUG的时候把原有正确的功能也影响到了!更要命的是,谁也不知道这个BUG出现了,等待测试人员需要去重新发现一遍。

于是项目经理会发现,每次只要做了代码修改,无论是重构还是功能新增修改,还是修改了BUG,都无法知道当前代码的健壮性,以前编写的东西是否依然正确可用?

然而如果这个项目在一开始就编写了单元测试的话,我们可以通过方便的自动化单元测试框架运行所有的单元测试,进而检查在此次修改前的所有被单元测试所覆盖的代码是否依然正常运行(符合以前编写的单元测试期望,如果验证通过,则认为原有代码未受到影响)

由上我们可以看出,单元测试虽然增加了相当大的开发工作量,但对于一个长期不断改进和维护的项目而言,单元测试反而是消减整体成本的一个有效手段,它能及时而准确的发现在代码修改之后,原来对代码要求的功能是否都依然正确满足。

但这里有个严重缺陷:单元测试无法检测到某个方法修改后是否对其他方法造成了影响,只能检测到被修改的方法本身的原有目的是否被影响(这个将在下面的与集成测试的区别中详解)

也因此,个人觉得单元测试最适合的场景是基于TDD开发。若需求发生改变,修改了一个方法,而多数情况下也会去修改单元测试代码,因为预期也发生了改变,这个时候又不能检测到对其他代码的影响,这时单元测试意义确实不大。单元测试与集成测试的区别是什么?

多数人其实一直不能很好的区分集成测试和单元测试,甚至不少人一直理解的单元测试只能算是集成测试,但其实两者的概念是完全不同的。单元测试测试的对象是每一个独立的方法,而且尽可能的隔离方法和其他方法以及其他外界依赖项;

基层测试的测试对象是被单元测试检测后的方法与方法之间的调用关系,以及调用执行过程是否符合预期。

2、根据需要的功能模块设计出单元测试场景用例,因为此时可以很清晰的知道能够提供什么样的数据,以及需要达到什么样的功能,这对设计单元测试用例已经完全足够了;

3、编写单元测试代码,这个时候可以专注于检验这个方法的是否满足设计的要求,此时甚至实际的代码还根本没开发,而.NET4.0的Dynamic关键字在这里可以得到充分的发挥:调用那些根本都还不存在的方法,却不会导致编译无法通过。

4、若在编写单元测试过程中,可以预期当前这个方法若需要调用一些其他类或方法的支持,可以通过编写MockObject来模拟,同样也是无需实现真正的代码,只需要有基本的代码框架或者接口即可。

5、在为这个方法编写好单元测试代码之后,就可以开始编写实际的代码实现了,因为在之前为了满足Testability的需要,代码已经是基于依赖倒置模式的了,无需再担心其他需要调用的类或方法是否已经实现或正确实现。在编写好本方法的实现之后就可以通过运行之前的单元测试进行验收了。

可以看到,若按照以上这种方式进行开发,首先代码的耦合性是非常低的,其次代码的质量也是很高的,最后还会因为代码之间的耦合度低从而降低在开发过程中,相互制约进度相互影响的可能性。在追查BUG的时候也很有优势:很容易查到BUG是否蔓延。

反之,对一个LegacySystem进行重构使之Testable,再编写单元测试其实工作量不小,实际的收益也不会特别大。

THE END
1.意义和作用一样吗两者是什么意思作用和意义这两个词在文学作品中也有不同的出处。孙犁在《秀露集·文学和生活的路》中提到,作家应忠诚于时代和人民,以求作品的艺术性,进而作用于时代。而鲁迅在《花边文学·“此生或彼生”》中讨论了文言文与白话文的意义差异,指出文言文的意义相对含混。 https://www.xuebaike.net/new/521f181732955910.html
2.法律的意义和价值行业资讯强制作用:法律以国家强制力为后盾,对违法犯罪行为进行制裁,确保法律的权威性和有效性。 教育作用:法律通过规定权利义务、制裁违法犯罪等方式,对人们进行教育引导,提高人们的法律意识和道德水平。 综上所述,法律的意义和价值在于维护社会秩序、保障个人自由、实现社会正义、提高效率以及平衡社会利益。同时,法律还通过其指引http://www.anlihk.com/detail/id/103/cid/44
3.迎接“意义危机”的挑战如果是社会性的“意义危机”后果会如何?社会运转出问题,大量的健康问题要出现等。如何处理现在生活的无意义感?许多人把按部就班上班,一成不变的重复劳动,忍气吞声地守住工作岗位,一个月就拿点干工资养家糊口,不敢有任何闪失的人生,看得没有意义。这不是没有意义,而是自己的人生意义标准已经高于自己的生活http://baijiahao.baidu.com/s?id=1678158894655620132&wfr=spider&for=pc
4.必要性和意义的区别.pdf必要性和意义的区别 我们在考试时常常会遇到要回答做某件事的必要性和意义,这时候有的?就犯难了。必要性和意义 是?个意思吗?要怎么回答才能拿到?分?其实,?编在以前考试也遇到这个问题,所以在这?给?家分享? 下经验。 其实,只要记住?句话,就能很好的区别必要性和意义。必要性是属于意义?https://max.book118.com/html/2022/0422/7100044033004114.shtm
5.充分条件和必要条件的区别,以及充分性与必要性的区别,以及=>与相似问题 证明充要条件 充分性,必要性如何区分 意义和必要性有何区别 意义和重要性,必要性有什么区别 特别推荐 热点考点 2022年高考真题试卷汇总 2022年高中期中试卷汇总 2022年高中期末试卷汇总 2022年高中月考试卷汇总 二维码 回顶部?2021 作业帮?联系方式:service@zuoyebang.com?作业帮协议https://www.zybang.com/question/a30050a0dd39d6c7776200b22eac0b57.html
6.项目意义必要性分析及需求分析的区别3)需求分析。需求分析是面向具体用户的。需求分析必须建立在对系统建设现状分析的基础之上。需求分析涉及具体要建的内容,更具体化。需求分析是与系统架构衔接的关键内容。 如果项目方案是个坡,项目意义在至高点,必要性分析在脖子位置,需求分析处于胸部,架构图则到了腰部。https://blog.csdn.net/weixin_42450461/article/details/89317505
7.羁押必要性审查与取保候审有什么区别羁押必要性审查与取保候审的区别是:1、性质不同,取保候审是一种刑事侦查期间的强制措施;羁押必要性审查是指人民检察院依据《刑事诉讼法》第九十五条规定,对被逮捕的犯罪嫌疑人、被告人有无继续羁押的必要性进行审查,对不需要继续羁押的,建议办案机关予以释放或者变更强制措施的监督活动。2、法律依据不同:取保候审主要https://mip.66law.cn/question/answer/16000013.html
8.政治学中必要性和重要性怎样区别?根本原因是必要性吗?重要性是说他的好处 比如某某 可以··· 能够···而必要性是说没有他的坏处 如 如果不··https://www.ximalaya.com/ask/q3893437
9.盗窃与诈骗的区分诈骗罪意义上的处分行为不仅要求被害人(或受骗人)将财产处分给行为人或者其他第三人,还应当要求其有意识地进行了处分。然而,对于处分意识的必要性及其内容,学界均存在一定争议。 1.处分意识与自我损害型犯罪 在刑法教义学上,处分意识作为处分行为的必要前提并不是不言自明的。众所周知,诈骗行为的基本特征是行为人对http://www.110.com/ziliao/article-546967.html
10.重要性和意义一样吗语文教案意义、重要性大致相同,除了在概念上略有区别,其余地方的使用没有多大的区别。一般讲述某件事的意义,一般都是从重要性、必要性上进行回答。 1、表达内容不一样 意义是一个汉语词语,一指人或事物所包含的思想和道理;二指内容,三指美名、声誉;四指作用,价值;五指价值。事物存在的原因、作用及其价值。 https://www.027art.com/fanwen/yuwenjiaoan/8972813.html
11.研究价值和研究意义的区别爱问知识人针对论文而言,研究的意义主要是从作用的角度上写,就的价值主要是从研究的必要性角度上写。https://iask.sina.com.cn/b/new2Gw4JZDgiCT.html
12.运用分类指导法提升高中生英语概要写作能力的实证研究为达到更有效地提升学生的概要写作能力,下一步要做的工作,积极引导学生有意识地强化词汇积累的重要性,并引导学生加强同义词与反义词的辨析,同时还要注重语法结构多样性的讲解,还要鼓励学生对教材中的语段进行概要写作训练。 六、讨论: (一)分类指导的必要性及其意义:https://tpd.xhedu.sh.cn/cms/app/info/doc/index.php/91279
13.论文选题的目的和意义有什么区别呢在明确两部分的区别之后可以对选题的相关领域进行搜索,明确当下该选题有哪些研究成果,还有哪些部分是你的选题需要补吵盯充和完善的。对蚂枝选题的价值有一个综合性的判断。 答:看百度上,大多数裂宏是说“选题依据包括选题目的意义、国内外研究现状”,但是我们是要分开写啊,第一部分写目的意义,第二部分写“选题的https://www.52fabiao.com/article/fa87df2d23eea47f93e57025.html
14.玖富贷款保险公司已经代偿了为什么还要继续还款,为何玖富贷款保险3:还款的答案必要性和意义 4:还款的表示法律依据和合同约好 5:还款的第三方法律结果和作用 文章正文: 1:代偿与还款的客户区别及背景介绍 在借贷业务中,代偿和还款是两个不同的这时候概念。代偿是指借款人无法履行借款合同义务时,由保险公司代为偿还剩余贷款的还清情况。而还款则是指依据借款合同约好,准时按量偿还https://www.hezegd.com/lawnews/zixun/402913.html