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

前言

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

PS:本文主要知识来源于《Java测试驱动开发》这本书

理论知识储备

关于单元测试

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

关于TDD(测试驱动开发)

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

关于Mockito

  • 将真实类转换为模拟类。就像重写了这个类,将其所有方法都改为空。
  • mock():用于创建模拟对象,还可使用when()和given()指定这些模拟对象的行为
  • spy():可用于实现部分模拟。除非另有说明,否则间谍对象调用实际方法。mock()创建一个完全伪造的对象,而spy()使用实际对象
  • verify():用于检查调用方法时提供的是否是指定参数,是一种断言。

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简单操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容