美文网首页程序员每天写500字
重构三部曲(二):单元测试篇

重构三部曲(二):单元测试篇

作者: LY丶Smile | 来源:发表于2019-01-17 19:12 被阅读4次

前言

接上篇 重构三部曲(一):思想准备篇

思想准备

关于单元测试

  • 单元测试并非要取代其他类型的测试,而只是缩小其他测试的范围
  • 单元测试旨在检查代码的内部质量,专注于质量保证而非质量检查
    • 质量检查(QC)的重点是发现缺陷
    • 质量保证(QA)的重点是将缺陷消灭在萌芽状态
  • 单元测试必须能够快速运行
  • 必须明确指出测试前设置了哪些条件,测试将执行哪些操作以及期望的结果。
  • 不要让测试依赖于其他测试
  • 应尽可能在测试中少用甚至不用基类。相对比避免代码重复,测试的清晰度更重要
  • 一种命名方式:Given部分描述前置条件,When部分描述操作,Then部分描述期望的结果
  • 测试必须因预期的原因而失败。

关于TDD(测试驱动开发)

  • 概念说明:TDD这本书编写的测试不以Test结尾,而以Spec结尾,以规范为目标
    • 规范不仅用于验证代码,还被用作可执行的文档,最主要的是,它们还被用作思考和设计方式。
  • 红灯-绿灯-重构(失败到成功再到完美)
    • 第一次运行不能通过:还没有创建方法
    • 第二次运行不能通过:添加了方法,但是没有实现
    • 第三次运行通过:实现了与这个测试相关联的所有代码
  • TDD迫使我们详细地考虑需求和设计,编写整洁而可行的代码,以及创建可执行的需求并频繁重构。
  • 以测试方式编写的文档。测试就是可执行的文档,而TDD是创建和维护这种文档的最常用方式。
  • 需要为代码编写文档通常意味着代码本身写的不好。另外,不管你如何努力,文档都必然会过期。
  • 实现越简单,产品越好,维护也越容易
  • 使用TDD时,不用预先定义设计,相反,不断编写并实现规范的过程中,设计通常会变得清晰(熟练之后的事,熟练掌握TDD之前,我们必须将需求和测试分开定义)
  • 将TDD过程分解为可重复的短暂周期,其中每个阶段的持续时间通常以分钟乃至秒计

Eclipse 中JUnit 5的使用

项目右键 -> properties -> Java Build path -> Add Library -> Junit -> JUnit 5 -> finish

关键步骤如下图

image.png 选择JUnit版本

代码覆盖率工具-Jacoco

搜索EclEmma image.png

注解

注解 用途
@Test 表明一个测试方法
@DisplayName 测试类或方法的显示名称
@BeforeEach 表明在单个测试方法运行之前执行的方法
@BeforeAll 表明在所有测试方法运行之前执行的方法
@AfterEach 表明在单个测试方法运行之后执行的方法
@AfterAll 表明在所有测试方法运行之后执行的方法
@Disabled 禁用测试类或方法
@Tag 为测试类或方法添加标签

简单示例

class FirstTDDSpec {

    private FirstTDD testd;
    
    
    @BeforeAll
    static void initAll() {
        System.out.println("@BeforeAll 初始化……");
    }
    
    @BeforeEach
    void beforeEachTest() {
        System.out.println("@BeforeEach 初始化……");
        testd = new FirstTDD();
    }
    
    @AfterAll
    static void destoryAll() {
        System.out.println("@AfterAll 所有测试执行完毕,执行销毁操作……");
    }
    
    @AfterEach
    void detory() {
        System.out.println("@AfterEach 当前测试执行完毕,执行销毁操作……");
    }
    
    
    @Test
    void whenTheGameIsStartedTheBoardIsEmpty() {
        Assert.assertEquals(0, testd.getNumberOfDiscs());
    }

    @Test
    @DisplayName("第一个mock测试方法")
    void MyFirstMockTest() {
        HelloModel mockHelloModel = Mockito.spy(HelloModel.class);
        mockHelloModel.setUserName("jack");
        mockHelloModel.setPassword("123456");
        Assert.assertEquals("jack", mockHelloModel.getUserName());
    }
    
    @Test
    void whenDiscOutsideBoardThenRuntimeException() {
        int column = -1;
        assertThrows(RuntimeException.class, () -> testd.putDiscInColumn(column));
    }
}
执行结果

参考网站

JUnit 5 新特性
JUnit 5 User Guide
Jacoco+Eclipse简单操作

相关文章

  • 重构三部曲(二):单元测试篇

    前言 接上篇 重构三部曲(一):思想准备篇 思想准备 关于单元测试 单元测试并非要取代其他类型的测试,而只是缩小其...

  • 重构三部曲(一):思想准备篇

    一、概述 重构三部曲为:思想准备,单元测试,重构 思想准备的目的是明确:为什么要重构,重构的理论支撑是什么 单元测...

  • APP重构之路(三) 引入单元测试

    APP重构之路(一) 网络请求框架 APP重构之路(二) Model的设计 APP重构之路(三) 引入单元测试 重...

  • Objective-C:写一份可测试的代码

    APP重构之路(一) 网络请求框架 APP重构之路(二) Model的设计 APP重构之路(三) 引入单元测试Ob...

  • Android单元测试(一)-基础

    一、什么是单元测试 单元测试是测试某个类的某个方法能否正常工作的一种手段。 二、单元测试目的 验收(改动和重构) ...

  • Android单元测试--基础

    为什么要使用单元测试 使用单元测试我们可以很容易的发现代码的缺陷同时在你重构代码的时候可以很方便的帮你验证重构是否...

  • 单元测试,是程序员的基本功

    10-11月份,我花了很多时间在项目D的代码重构和单元测试上,这期间重读了《重构》、《单元测试的艺术》和《Mast...

  • Android测试

    标签(空格分隔): Android 单元测试的好处:Martin Fowler在《重构》里面还解释了为什么单元测试...

  • 聊聊单元测试

    本篇主要是聊一聊以下几个方面的内容: 为什么要单元测试 单元测试框架 单元测试的好处 单元测试与重构 1. 为什么...

  • 重构

    重构要结合测试, 单元测试以及集成测试。 重构 依赖于测试: 我们是否引入了bug。 构建测试机制: 这个是很重要...

网友评论

    本文标题:重构三部曲(二):单元测试篇

    本文链接:https://www.haomeiwen.com/subject/tocwdqtx.html