zoukankan      html  css  js  c++  java
  • 写单元测试,我不认为是件容易的事

    这是一个40多岁还在编码的老程序员对单元测试的理解和实践。里面没有废话,希望每句话能说到你心坎里。

    原则:只测自己

    自己的含义:方法边界内的主体逻辑。一切下游方法、框架依赖、外部IO等都不是自己。如spring、 外部数据库都视为外部逻辑。

    这一原则的动机

    便于定位

    每个方法有自己独立的单元测试,这有利于IDE在单元测试与逻辑代码间跳跃,便于定位,并降低代码结构调整的影响范围。

    不重复,降低复杂度

    因每个方法有自己的单元测试,所以当前测试不要涵盖下游方法的功能测试。以避免逻辑改动造成不必要的影响范围扩大。

    实践与建议

    要想单元测试更易于维护,良好的设计是前提

    分层开发

    开发也是可以分层的,先进行框架开发后进行具体开发。如先定义好所有的接口和要传递的数据,并组织好控制层,然后测试和具体开发便可同时展开。这样便可提前发现结构性问题,提前对设计进行验证,减少后期结构性调整对单元测试的影响。

    单一职责

    尽量应用单一职责设计模式,使逻辑模块化,并使用老板原则将这些模块串起来。这对于类的内部实现尤其重要,因为这会影响单元测试的覆盖能力。

    只有这样每个方法的逻辑才能简单,对应的单元测试自然便于维护。作为老板的控制类或方法不必苛求单元测试,可酌情选择是否单元测试,因为控制是少数派,且实质逻辑已经被分摊到模块中。

    逻辑与外部IO分离

    这是单一职责的延申,数据的加载、处理与输出是可以作为独立的三个职责的。其中数据的加载和输出往往与外部环境依赖有关,本身的测试意义不大,即便测试也不能到处运行,且测试运行效率低下。

    所以我们需要将IO逻辑从处理逻辑中剥离,并放到外层的控制逻辑中去并用mock来解决。这样没有外部依赖的处理逻辑——核心,将得到简化,从而单元测试得到简化。

    如果中间实在需要外部IO可考虑在IO处进行逻辑拆分,这样拆分后的子逻辑中就没有了IO依赖,从而得到简化。

    到处运行

    有时候单元测试是脱离不了环境的,如我们想验证一下 SQL 的正确性。此时建议在单元测试上应用 @Disabled 注解,以便在 mvn test 中忽略这些测试,从而保证测试可以到处运行。

    @Autowired

    请尽量避免对框架的依赖,如 spring 的 @Autowired 注入机制,这会巨幅增加单元测试的构建难度,巨幅增加单元测试的耗时,因为这会对 mock 对象的注入造成困难。

    建议,使用构造注入代替属性注入,这样就可以摆脱对 spring 的依赖。

  • 相关阅读:
    windows下git识别大小写配置
    Vim命令相关
    【Mac使用系列】【转载】十几个Mac实用工具
    【Mac使用系列】Mac锁屏及快捷键
    【Mac使用系列】常用软件及快捷键
    【Linux】Cent OS 虚拟机开机自启动配置
    【工具】使用markdown写ppt
    【产品管理】当我们在做产品时,以何种方式来表达?
    【区块链】区块链学习要点记录
    【树莓派】盒子常见问题处理办法
  • 原文地址:https://www.cnblogs.com/llxxbb/p/15777555.html
Copyright © 2011-2022 走看看