我看单元测试

谢@walter邀, 来介绍一下我这些年写单元测试的体验. 大家可以来GitHub Page提提自己的看法 !

为什么要写单元测试?

代码质量是一个程序员最好的名片

你的代码不仅代表你个人而且代表整个团队

同一个团队工作, 相互之间代码的对接免不了, 单元测试能让其他同事快速理解你的代码, 并能迅速上手帮你维护. 宏观上来看, 这大大降低了大家的沟通成本, 并能够打破壁垒, 使大家互为备份.

单元测试能让你对自己的代码更有信心, 重构的门槛除了那些方法论, 就是一个高覆盖率的单元测试.

说到谈到打破壁垒, 另外重要的一点就是代码的可读性与整洁工整性. 代码应该让人一眼看上去很舒服, 这样才有看下去的欲望. 此处推荐«编写可读代码的艺术»

单元测试与自测方法有何不同?

很多人说我会写main方法啊, 在我本地跑通了就ok了啊.

的确没错, main方法确实能让那时的你确认你的代码在一般情况下是ok的. 可是过上一段时间, 你再回头看看有点陌生的代码, 可能底层数据也变了, 你还能顺利执行么? 你还能记得你当时想要的结果是什么?

自测方法一般是end to end的测试. 很难去按照模块进行测试, 如果修改了代码, 定位问题也很难.

这些问题单元测试都可以解决.

  1. 通过命名或者注解, 你可以将你想测试的大致情况写下来.
  2. assert, 可以方便的进行结果的断言. 将你认为正确的结果与真实结果进行比较
  3. 不依赖于外部环境? 没问题! mysql, rpc, restapi都可以mock. mock的框架: Mockito, EasyMock, PowerMock
  4. 想真实的测一下sql? 没问题! H2 内存数据库与Spring Test完美集成.
  5. 想测一下异常处理? 没问题! Mock可以帮你模拟任何异常情况
  6. 各种corner case? 还是万能的Mock, 都能帮你搞定!

我没时间单元测试怎么办?

我认为单元测试也并不是每一行代码都需要写. 还是抓住那个要领. 关键路径, 重构 必写. CRUD代码可以不写.

如果你觉得没时间写单元测试, 那么有这么几种可能: 要么你只写CRUD简单代码, 要不你觉得你的代码质量无所谓. 这两点都是致命的.


总之, 不要为了写而写. 要抱着对自己负责, 对团队负责的心态去写. 相信经过时间的考验, 你一定离不开它.

                2015年11月6日夜于家中.