• 0
  • 0
分享

  一、写在前面的话

  作为编程从业人员,单元测试早已不是生僻的、不为人知、不受重视的概念。

  但是与此同时,实际情况下,除了开源SDK基本上会标配单元测试外,在真正的项目开发中,单元测试的实践程度低之又低。

  这里面的原因非常非常多,笔者听到的最多的不写单元测试的原因就是 —— 没时间!

  但是没时间是否能和'可有可无'画等号?是否能和'不重要'画等号?

  也就是说,假设给到足够充足的时间,是否单元测试就能够顺利实施?覆盖率就能达到100%?

  笔者后面会针对这些问题阐述笔者自己的理解。

  二、不考虑时间的情况下,到底有没有必要搞单元测试?

  假设有这样一个场景,你编写了一个"支付时金额计算"的函数,里面牵扯有一些打折、金额抹零的计算。

  此时在正常的逻辑中你已跑通无误,但真实场景较为复杂,此时便自身简单功能验证(或不验证)便直接给测试人员进行验收。

  此时基于以下2个现状 外加 无单元测试 的情况下:

  ①、测试人员只是软件的另一层保障,而不是唯一的保障;
  ②、绝大多数测试人员均停留在‘点点点’的层面(没有贬低测试人员的意思,但现状确实是)

  我们最终上线的软件存在隐患的概率非常大。

  假设真正上线后,出现了实际的金额计算bug,导致运维事故、甚至顾客投诉的出现,此时假设公司层面将责任100%划分给了测试人员,那笔者也就不多评价了。

  绝大多数情况下,只要公司是明智的,其实编写者本身负有绝大多数的责任。

  就好比,如果食品出了食安事故,此时质监部门确有责任,但食品加工厂负有更多的责任。

  也就是说,出于自身技术工作素养,我们应该对软件质量应有足够的把控,不能依托于 测试人员来发现问题,更不能依托于上线后侥幸不出问题。

  此时幻想下这个场景:你告诉领导,我2天可以做完,但是3天可以最大程度保质保量完成。

  相信只要是有些产品意识的领导,相信都愿意等那一天。或者说,不等的话难道等着上线后试试看吗?

  此时,单元测试就是 开发人员 的一项利器。

  三、明确了必要性后,单元测试实践真正的阻力是什么?

  都说没时间,那么给你时间,你真的能写好单元测试吗?覆盖率能够达到100%吗?

  根据笔者听到的同行业朋友们的答复,以及应聘者们的答复,基本都是否定的答复。

  也就是说,在笔者的认知里:没时间 = 找借口。

  或者说单元测试函数的编写,以及被测函数的编写,是存在一定技术难度的。

  笔者在这里重点分享一个概念:可测函数

  笔者听到很多想尝试写单元测试的朋友的疑问都是,看着官方Demo挺简单(比如计算个加法、减法),都能看懂会写。

  但是回到自己项目里发现,完全无从下手,例如以下Demo:

  const sdk = require("三方依赖");
  const db = require("数据库连接或Model");
  const otherServices=require("其他函数或业务文件");
  module.exports = function(){
      //do sth.
      return;
  }

  此时,一旦想对这个函数进行测试,会发现单元测试的脚本一旦引入这个被测文件,立即报错。

  一方面数据库的连接信息报错,另一方面未知的其他业务js的引入报错。

  也就是说,这个函数无法被测试,原因为 —— 外部依赖太多。

  这里笔者引入一个老生常谈的概念 —— 反转依赖。

  依赖反转/依赖倒置

  百度百科:在面向对象编程领域中,依赖反转原则(Dependency inversion principle,DIP)是指一种特定的解耦(传统的依赖关系创建在高层次上,而具体的策略设置则应用在低层次的模块上)形式,使得高层次的模块不依赖于低层次的模块的实现细节,依赖关系被颠倒(反转),从而使得低层次模块依赖于高层次模块的需求抽象。

  例如以下简单的Demo程序:

  const SuccessBusiness=require("成功回调的处理");
  const ErrorBusiness=require("失败的回调处理");
  module.exports = function(){
      // ★ 此处为主逻辑,经过某些计算/处理后,最终执行以下2个逻辑中的一个 ★
      SuccessBusiness(); //或 ErrorBusiness();
      return;
  }

  也就是说,针对上述Demo程序最需要被测试的核心逻辑是 ★部分的逻辑,但是却不得不引入2个主逻辑无关的依赖函数,而2个依赖函数在这个函数中的作用仅仅是: ——在正确的时间点被触发 

  因此正向的依赖会导致测试用例寸步难行,改变就只能通过依赖反转,这并不是过于高深的理论,大家日常开发一定见过,例如以下Demo:

  module.exports = function({onSuccess,onError}}){
      // ★ 此处为主逻辑,经过某些计算/处理后,最终执行以下2个逻辑中的一个。
      onSuccess(); //或 onError();
      return;
  }

  改造到此,已经是测试用例非常喜欢的函数形式了。

  ·通过传入不同的参数,来验证★号部分的主逻辑

  · Mock入参中的onSuccess和onError函数

  · 通过判断2个Mock函数被执行的次数,来验证执行成功与否。

  也就是说:单元测试的顺利推进,可能更多的是对原始主逻辑编码的高标准要求。

  四、最后再说两句

  其实,如果说单元测试是为了不出错,也过于狭义了,单元测试还有很多更深远的意义,例如:

  需求完成度:代码层面是否覆盖了全部的需求。

  重构:"优化代码的时候产生了降级问题"这个是非常常见的现象,而有了单元测试,简直是重构的福音,开发者可随意改,只要原始N条单元测试依然可跑通。

  否则永远是在试探,谁也不知道误碰了哪里。这里笔者也推荐一番TDD测试驱动开发,感兴趣的朋友们可以自行学习。

  最后,笔者想再次强调下代码测试对于开发人员的重要性,如果开发人员对自己的产出无法有硬性的质量保障,而是依靠感觉和经验,其实是不合格的。

  至于测试工作对于研发而言,有哪些可以做的工作,笔者后续会持续分享,例如大中小测试、自动化测试、压力测试等概念。



作者:Tian923405    

来源:http://www.51testing.com/html/29/n-5099529.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          •   2022年度软件测试行业的趋势预测:如果你也想了解更多发展趋势,那就点击下方链接填写调查问卷吧!助力测试行业发展,还能获得精美礼包哦~链接:http://vote.51testing.com/  百度一下“软件测试前景”,前几个点进去都是某某培训机构的广告,后面的点进去间接的介绍一下然后又是各种机构的广告。所以,对于很多测试人员,尤其是职场小白,完全不知道自己进入这个行业的前景,至于后面有什么规划,走上什么道路更是一片迷茫。那么软件测试的前景和发展方向在哪呢?  测试前景  其实,目前的国内市场,很多软件企业都存在着重开发、轻测试的现象,甚至有很多互联网和软件企业都没有测试,上线纯靠开发和...
            0 0 806
            分享
          •   保持怀疑  对产品的质量持有一颗敢于怀疑的心,质量不是开发人员说"我做完了而且也测过了"就可以保证的。直到你测完最后一轮,最后一个用例之前,你都应该对产品的质量持怀疑态度。这个态度是混口饭吃的最基本技能。  永不妥协  1、不要对产品质量妥协,哪怕开发口口声声说这个问题不好改,改不了,一改就要延期之类的话。  2、妥协意味着你成功的把质量不好这口黑锅华丽的背在了自己的身上。  让用户满意  产品或项目成功的标志之一是能够让用户满意,很显然用户是不会对一个bug频出的系统/产品满意的。  从用户角度思考  1、很多测试同学不知道测试用例应该怎么去写,不知道怎么写才能写得出...
            0 0 1189
            分享
          • (一)Monkey简介Monkey意指猴子,顽皮淘气。所以Monkey测试,顾名思义也就像猴子一样在软件上乱敲按键,猴子什么都不懂,就爱捣乱。Monkey原理也是类似,通过向系统发送伪随机的用户事件流(如按键输入、触摸屏输入、滑动Trackball、手势输入等操作),来对设备上的程序进行压力测试,检测程序多久的时间会发生异常,在功能测试完成后进行monkey测试。Monkey包括许多选项,它们大致分为四大类:(1)基本配置选项,如设置尝试的事件数量;(2)运行约束选项,如设置只对单独的一个包进行测试;(3)事件类型和频率;(4)调试选项;总结:Monkey测试用于发现App测试中的问题(如AN...
            15 15 1903
            分享
          •   一、前言  众所周知,市面上有很多出名的抓包工具,比如Fiddler、Charles、wireshark、mitmproxy;这些抓包软件都各有各的好处,不过今天小编不介绍这几种抓包软件,今天小编要为大家带来的是阿里开源的一款抓包软件-------LightProxy,翻译过来就是光代理,听名字就很牛X的样子,下面我们一起来感受下光代理的魅力。  二、说明  很多人好奇,LightProxy是什么语言写的,其实它是用前端的Elctron来进行打包并生成的,而且他的部分代理是基于Whistle,Whistle也是和Fiddler一样的抓包工具,只不过他是可以运行在nodejs上的抓包工具,设...
            0 0 5333
            分享
          •   据报道,马斯克上周五向美国法官提出请求,希望法院驳回索赔2580亿美元的“狗狗币”诉讼案。在此案中马斯克被控以传销欺骗的形式推销加密货币狗狗币。  马斯克代表律师认为狗狗币投资者发起诉讼如同“幻想的虚构作品”,马斯克只是就狗狗币发了一些无伤大雅甚至有些愚蠢的推文而已。  到底马斯克想欺骗谁?他隐藏了什么风险?投资者从未清楚解释过。马斯克的确曾发布一些相关推文,比如宣称“Dogecoinrulz”,并且附带一张Dogememe图;还说过“没有高点,没有低点,只有Doge”,但不能凭借这些模糊的内容就指责马斯克欺诈。  马斯克律师辩解称:“狗狗币是合法加密货币,市值接近100亿美元,发送一些支...
            0 0 680
            分享
      • 51testing软件测试圈微信