如何写单元测试

做有素养的工程师!

https://site.mockito.org/
Mockito 是Java语言下写单元测试的工具,本篇就来讲讲它的一些概念和用法。

为什么要写单元测试?

作为一个工程师,写出来的项目要做到可读、可维护,这里的可读、可维护不单单指代码作者本人,更是指其他维护该项目的工程师。单元测试的好处不止为公司留下了可维护的代码,对工程师本人也是职业素养的提升。一个有良好单元测试的项目让你来接手,对你来说也是一件相对容易的事情。如果让你回忆一个很久之前开发的功能,你最好的方式是查看单元测试。
单元测试还可以迫使开发人员编写单一指责的方法、可读性高的代码。

什么是单元测试?

Unit testing
Software Testing: Different categories of Testing

先说一下测试的种类:

系统测试(System Test):

有很详细的测试计划,针对系统每个功能都有完整测试用例。
适用于项目验收,或有重大改动时。

冒烟测试(Smoke Test):

针对特定功能有主要的测试用例,不包含所有测试用例。
适用于新功能上线,简单的验证是否可用。

回归测试(Regression Test):

类似于冒烟测试,区别在于回归测试的目的在于确保老的功能正常,不要因为新的feature/big fixes而对已有功能产生影响。

探索测试(Exploratory Test):

不清楚具体操作。

单元测试:

一个最小的可测试单元。

集成测试:

一组测试单元。

术语

http://xunitpatterns.com/Mocks,%20Fakes,%20Stubs%20and%20Dummies.html

system under test(SUT): whatever we are testing.
Dummy Object: 在SUT中某个方法需要一个实例对象作为参数,但是该参数只是为了可以正常调用该方法,而不对该测试起任何影响。
Test Stub: 在一个SUT中,需要依赖外部的接口,为了稳定控制测试流程(Unit testing 需要保证repeatable),可以fake一个该外部接口的实现类,根据设定的参数返回指定的值。
Test Spy: 与Test Stub类似,区别在于Test Spy可以记录方法的入参,在result verification阶段可以验证参数是否与预期一致。
Mock Object: 与Test Stub类似,区别在于Mock Object预先设置了期望的接收参数,当参数与预期不符则测试失败。
Fake Object: 术语搞这么多,唉!Test Stub为了流程控制(control point); Test Spy/Mock Object 为了验证(observation point); 而Fake Object仅仅为了提供一个外部接口简单的实现,并不记录或验证什么,例如database。

怎么写单元测试?

How to write good tests
https://www.baeldung.com/mockito-series

单元测试的阶段:
Setup
Exercise
Verify
Teardown

Rock同学推荐的好网站:https://cyber-dojo.org/