Day 03 「要开始罗!」单元测试的起手式:人生第一个单元测试

终於要开始了:「说到底,单元测试怎麽做?」

单元测试

单元测试要测的是一个逻辑单元功能是否正确。这短短的一句话,其实就有两个蛮常争议的点:1) 什麽叫一个单元,2) 什麽叫正确?

说到底,单元测试真正做的事,就是在验测一段程序码「跑起来的表现」,跟「在我脑中想像的表现」是否吻合。至於什麽叫一个单元,笔者认为,只要你认为他「足以表达一个商业逻辑,而且只表达这个商业逻辑」,就可以称为单元。所以其实单元测试的大小,你可以自己定。一旦觉得「这个测试写起来挺麻烦的」,那恭喜你,你找到「缩小单元」的时机点了。

单元测试的测法五花八门,但万变不离其宗,一般来说不出三件事:

  1. 准备资料
  2. 跑起来
  3. 检查结果

在一个测项里面把这三件事做完,我们就认为,是一个 Feasible 的单元测试。而通过这个单元测试的程序(而且每次跑都会通过),自然也就被认为是 Feasible 的程序了。

以「字串串接」为例

假设我们正在维护一个「教务处网站的後端 API 服务」,系统在某处存放了学生资料,当想要取得学生全名时,就要拿学生的姓与名出来串接。例如 first name 为 Michael,last name 为 Jordan 的同学,全名应该要是 Michael Jordan。

我们期待类别 Student 能做到这件事,因此我们把程序码写成这样:

public class Student {

    String lastName;
    String firstName;

    public Student(String firstName, String lastName) {
        this.lastName = lastName;
        this.firstName = firstName;
    }

    public String getFullName() {
        return firstName + " " + lastName;
    }

}

现在我们就对「它跑起来是否跟我当初想的一样」有兴趣了,於是我们在 Student 的测试里面做了三件事:

  1. 准备资料:造出 Student 物件,其 firstName 与 lastName 分别为 Michael 与 Jordan。
  2. 跑起来:呼叫 Student 的 getFullName 方法。
  3. 检查结果:检查回传值是否等於 Michael Jordan。
class StudentTest {
    @Test
    void full_name() {

        Student student = new Student("Michael", "Jordan");

        String actual = student.getFullName();

        assertEquals("Michael Jordan", actual);
    }
}

一旦测试通过,你会看到IDE亮起美丽的绿灯 /images/emoticon/emoticon12.gif

至此,你的人生第一个单元测试就完成了。未来万一有哪个冒失鬼,跑来你的程序里把 getFullName 的逻辑改坏了,这个测项就会失败 /images/emoticon/emoticon15.gif,对方就知道要改回来了。

什麽?你说还要测 last name 或 first name 为空的场景?那你就加呀!那就会是你人生的第二与第三个单元测试,恭喜恭喜!

谜之声:「很简单吧?怎麽会没时间测,是吧?」

Reference

  1. 范例程序码下载点:https://github.com/bearhsu2/ithelp2021.git
tags: ithelp2021

<<:  33岁转职者的前端笔记-DAY 3 什麽是 iframe 及使用心得

>>:  从零开始学3D游戏开发 Roblox Studio 简介 Part.3

《从前一天整理行李,进行三重观点叠加》

一天始於前一天的30分钟。 回应生活来说, 就像我们会在重要日子的前一晚 确认充足,好好准备。 隔天...

Centos7安装Zimbra-8.8开源邮件系统

之前安装了iRedMail,使用了一段时间感觉不太理想,可能对于我这种菜鸟来说不太友好吧,现在安装Z...

说明Jupyterhub config内容

我们在前一篇已完成JupyterHub的安装, 其中产生一个config档做为安装JupyterHu...

[Day3] HTTP Verb/Method Tampering - HTTP 动词窜改

前言 相信大家看完上一篇之後,对於HTTP有一个基本的认识了,从这篇开始会介绍一些跟HTTP相关名字...

Trouble with Distributed Systems (3-1) - Unreliable Clocks

不可靠的时钟 (Unreliable Clocks) 时钟对应用程序来说很重要,它可以回答以下问题:...