• 青阳子
    2020-01-06
    半年前,因为团队项目太多太乱已经很难维护和协作开发(10人的开发团队,每人负责一些项目,水平参差不齐,各自独立开发),作为团队中的资深者,我被leader要求开发一套通用的底层框架。

    为保证代码质量,刚开始时对自己要求严格,每个方法都必须要有多种case的单元测试;然后发现有时候写出来的单元测试代码比被测试的方法的代码量多很多,在一定程度上影响了开发速度。另外leader还经常安排我去修复一些仍在艰难运行的旧系统的故障(大多是累积下来的技术债),导致框架开发进展一再拖延。同时团队其他人很少有写单元测试代码,测试工作完全依赖测试人员完成,对自己也就逐渐放松了要求,单元测试不再追求完备,只在核心的方法中加入常规的实现逻辑测试,其他代码写完多看两遍确认无bug就提交。

    争哥的这节课程我完全理解,单元测试的重要性毋庸置疑,可是在实际开发过程中完全落实存在一定的困难,遇到这种问题我还真没啥解决的办法除了让自己拼命的加班,真的太难了。。。
    展开
     7
     36
  • potato00fa
    2020-01-07
    单元测试很重要,但是为什么大多人都会放弃?我个人觉得最主要的原因并不是代码量大,难以编写等,而是跑单元测试的次数少。很多单元测试都是为了写而写,写完一次可能都不去运行或者只偶尔运行一两次。如果是每次改完代码,都跑一遍单元测试,单元测试的效果会越来越显现。如果只是为了运行一两次或者干脆为了写而写,很容易就会放弃继续写单元测试。

    作者回复: 可以集成到代码管理仓库git中,强制跑单元测试成功之后才能提交

    
     10
  • ちよくん
    2020-01-19
    我就比较喜欢写单元测试,所以基本上是无bug 。身边的同事测基本上都是写完往哪一扔,或者丢给测试,然后bug 一堆,慢慢的我就成了团队的核心负责人。😂
    
     9
  • yaomon
    2020-01-06
    程序员这一行业本该是智力密集型的,但现在很多公司把它搞成劳动密集型的,包括一些大厂,在开发过程中,既没有单元测试,也没有 Code Review 流程。即便有,做的也是差强人意。
    ----------------------------------------------------------------------------------------
    差强人意:指尚能使人满意。根据文章上文,明显是不能使人满意的意思。处理为语病。

    编辑回复: 差强人意是勉强使人满意,不是十分使人满意。所以这里没问题呢~

     4
     6
  • 见贤思齐
    2020-01-06
    之前公司要求新研的代码要达到百分之85的覆盖率,导致纯粹为了覆盖率堆砌了一堆单元用例。有没有单元测试写的比较好的开源框架推荐下?

    作者回复: 哈哈,那就看我的项目啊:https://github.com/wangzheng0822
    下面有个ratelimiter4j

     1
     6
  • leon
    2020-01-06
    坐标阿里,周边同事几乎没有写单元测试的习惯,就算写也只是为了测试当前版本的功能,而不是为了以后迭代和重构。
    很可悲
     4
     6
  • 李小四
    2020-01-06
    设计模式_28
    1. 有过一次失败的单元测试经验:好不容易申请到了2周的预研时间,我开开心心地研究怎么把JUnit引入项目,刚开始了两天,新的开发任务打断了我的计划,然后就再也没有继续了。。。

    2.
    代码:
    /**
     * 查找递增数组中第一个大于等于某个给定值的元素
     * @return -1: 未找到
     */
    public int findFirstEqualOrLargerIndex(int[] array, int num) {
        if (array == null || array.length == 0) return -1;

        int start = 0;
        int end = array.length - 1;

        while (start != end) {
            int middle = start + (end - start) / 2;

            if (array[middle] >= num) {
                if (start == middle) return middle;
                else
                    if (array[middle - 1] < num) return middle;
                    else end = middle -1;

            } else {
                start = middle + 1;
            }
        }
        //start == end
        if (array[start] >= num) {
            return start;
        } else {
            return -1;
        }
    }

    测试用例:
    findFirstEqualOrLargerIndex(null, 1)
    findFirstEqualOrLargerIndex(new int [0], 1)
    findFirstEqualOrLargerIndex(new int [] {0}, 1)
    findFirstEqualOrLargerIndex(new int [] {1}, 1)
    findFirstEqualOrLargerIndex(new int [] {0, 0}, 1)
    findFirstEqualOrLargerIndex(new int [] {0, 1}, 1)
    findFirstEqualOrLargerIndex(new int [] {1, 1}, 1)
    findFirstEqualOrLargerIndex(new int [] {0, 1, 2}, 1)
    findFirstEqualOrLargerIndex(new int [] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 1)
    findFirstEqualOrLargerIndex(new int [] {0, 1, 1, 1, 1, 1, 6, 7, 8, 9}, 1)
    findFirstEqualOrLargerIndex(new int [] {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, 10)

    我估计应该有漏洞,请老师和同学们指正~
    展开
     8
     5
  • 逍遥思
    2020-01-06
    独立开发者,项目代码量 10W 行以内,在可以预见的未来不会超过 20W 行
    以前试过 git 各种最佳实践,最后发现一个分支基本就够用了
    所以还是忍不住想问问老师,如果项目真没那么大,是否需要单元测试?

    作者回复: 需要的,这个跟项目大不大没太多关系的。单元测试还是为了保证代码少些低级bug

     7
     4
  • 拙言
    2020-01-06
    打卡~
    这里问下王争老师,如果到了具体的业务代码,该怎么写单元测试呢,单元测试正确标准是什么呢,以sql查询到的结果吗?

    作者回复: 涉及到数据库的项目,特别是重度依赖数据库的,确实比较难写单元测试。一种方式使用DBUNIT这样的测试框架来解耦合真正的数据库,另一种方式专门维护一个供单元测试用的数据库。

    
     4
  • 辣么大
    2020-01-06
    关于问题2,尝试写了一下单元测试:
    https://github.com/gdhucoder/Algorithms4/tree/master/designpattern/u28
    
     4
  • 再见孙悟空
    2020-01-06
    确实单元测试只在一开始才写过,后来发现拖慢了开发的进度,就渐渐放弃了,现在我们的开发团队里几乎没什么单元测试,除非一些涉及到优惠券,订单奖励计算等和钱挂钩的业务,我觉得一方面是因为消耗时间,另一方面业务代码没写好,很多时候很不利于进行单测,要造各种数据。我觉得单测最好是在开发一个方法或者函数之后就进行,且要在测试介入之前,否则测试介入以后再补充单元测试,有可能会改动到已写好的业务,那么就又需要回归测试一遍,对开发,测试都是很消耗的。
     2
     4
  • Frank
    2020-01-06
    以前在开发中,没有写单元测试的意识。开发完功能后,直接去测试一个完整的流程。即前端发请求,服务端处理,看数据库数据。如果功能正确就过。这是从一个功能宏观去考虑测试。而单元测试是更细粒度的测试,它在保证各个“单元”都测试通过的情况下整个功能模块就测试通过了。这样的方式对于我们自己来说对代码可控粒度更细。更能比较清楚的理解某个“单元”在整个功能模块调用链路上的位置,承担什么职责,以及有什么行为。而不是一开始就站在模块宏观角度来思考。通过一个个单元测试的编写,将整个功能模块串联起来,最终达到整个功能模块的全局认知。 这也体现了任务分解的思想。通过单元测试,可以从另外一方面实现对已编写的代码的CodeReview,重新梳理流程。也为以后有重构需求打下基础。
           目前参与的项目中有单元测试,但是不够完备。可能由于某些原因(开发人员意识问题,团队对单元测试的执行落地程度不够等)。在写单元测试的过程中,遇到单元测试依赖数据库查询问题,因为存在多套环境,如开发环境,仿真环境,线上环境。对于依赖数据查询的单元测试,只能自己造假数据来解决。不知道还有什么好的解决办法。
    展开

    作者回复: 涉及到数据库的确实比较难写单元测试,而且如果重度依赖数据库,业务逻辑又不复杂,单元测试确实没有太大意义。这个时候,集成测试可能更有意义些。

     2
     3
  • FIGNT
    2020-01-07
    争哥。马上过年了,过年期间不知道能否多发表几篇在过年期间学习?

    编辑回复: 春节期间正常发布,惊喜待定😂

    
     2
  • 张迪
    2020-01-07
    单元测试是测试应用层还是领域层?

    作者回复: 这个不分的,测试的对象是函数

    
     2
  • 刘大明
    2020-01-06
    说起来真的是难受。整个项目中就我一个人写单元测试。每次做的功能都有单元测试覆盖。而且项目中junit包都是我导入的。更加奇葩的是我的功能单元测试领导还不让我提交。说是你的测试代码为什么要提交,我瞬间无语了。

    作者回复: 😂 可以考虑跳槽了

     6
     2
  • 桂城老托尼
    2020-01-06
    感谢争哥分享,单元测试很重要,除此之外,集成用例和回归用例库同样重要,以及上线后的ab比对切流,这些在大厂其实都是落地了的常规武器。这里争哥没有提到。
    大厂之外,能落地的除了单测,还有简单的ab框架,集成平台自动化程度,否则一次重构下来非常耗费精力,而且还是冒着风险。
    另外,单测代码本身的质量也要有要求,tl要求单测代码和生产代码一样要遵守规范(视各厂情况定吧)。所以每次迭代开发测试时间比是1比2差不多了。 哭晕
     1
     2
  • Miaozhe
    2020-01-08
    项目是服务端项目中,使用的是Spring test,立足于能满足自测工具的诉求,能保证用例有资产继承,而不是使用postman。用例主要是以接口层(Cnotrol)为主,services层为补充。
    好处很多,特别是微重构时,老用例一通过,自己的心就踏实了一半。
    另外,有一个体会,如果认真写了单元测试,转测后,测试基本测试不出问题。一个月度版本,bug可以控制在1个以内。
     1
     1
  • 番茄炒西红柿
    2020-01-08
    问一下单元测试中的依赖问题只能用mock来模拟吗?这样不会导致对下层方法依赖太强,而且用mock模拟感觉代码量也很多,心里感觉也不一定对。如果加入依赖(先倒入测试数据),那不就变成集成测试了吗?

    作者回复: 解耦依赖目前来看就只能用mock的方式。这是跟集成测试最大的区别。

     1
     1
  • varotene
    2020-01-08
    单元测试是不是只对小型、中型重构有用?因为大型重构会导致内部结构变化。大型重构应该通过integration 测试,场景测试来保证正确性?

    作者回复: 是的,你说的大型重构,估计就是代码真的太烂的吧,差不多就是重写了,单元测试都要重新了估计。

    
     1
  • 张迪
    2020-01-07
    写单元测试就是不知道如何命名单元测试的方法名,有时候这个方法都不知道如何描述好,

    作者回复: 可以参看我的例子

    
     1
我们在线,来聊聊吧