临时
一个项目究竟怎么设计单元测试比较好?
controller测,还是service测?还是都测?
一个类里面注入了多个类,测这个类的时候,这些注入的都mock么?mock了怎么保证真实的场景会按照mock的来走呢?不mock好像很多时间起不来。
覆盖率重要,还是质量重要,怎么判断用例是否有效拦截了问题?
devtestcov
jacoco
https://cygao.top/archives/mock 讲的不错
常见的 java UT & Mock 框架
常见的UT框架:Junit4,Junit5,TestNG,JBehave,Selenide,Gauge,Geb,Spock,JWebUnit,其中最常用的是Junit
常见的Mock框架:Mockito,PowerMock,EasyMock,TestableMock,其中最常用的是Mockito
单元测试中的 Mock
1、什么是Mock:消除外部依赖的有效方法。
对于某些不容易构造(如 HttpServletRequest
必须在 Servlet
容器中才能构造出来)或者不容易获取 比较复杂 的对象(如 JDBC
中的 ResultSet
对象),用一个 虚拟 的对象(Mock
对象)来创建,以便测试方便。
2、为什么要 Mock 测试?
- 解决不同单元之间由于耦合而难于测试的问题。
- 通过墨迹依赖以分解单元测试耦合的部分。
- 验证所调用的依赖的行为。
3、Mock 对象适用的场景?
- 真实对象很难被创建。
- 真实对象某些行为很难被触发。
- 真实情况令程序的运行速度变慢。
- 真实对象有用户界面。
- 测试时需要了解真实对象如何被调用。
- 真实对象实际上不存在。
单元测试的原则:FIRST 原则
Fast:快速。测试的运行速度将直接决定自动化的反馈速度,速度越快,越能提早发现问题,省去不必要浪费的时间,提高工作效率。反例:一个测试用例需要跑一分钟;在测试用例里面使用 sleep。
Isolated:独立。每一个测试用例需要保证完全独立运行,互相之间没有依赖存在,这样才能保证测试运行不被干扰,从而能够并行运行甚至分布式运行,使得测试运行更加 Fast。反例:一个测试用例调用了另一个测试用例;依赖了另一个测试用例的数据。
Repeatable:可重复。每一个测试用例在运行条件不变的情况下,不论重复运行多少次,运行的结果必须完全的一致。反例:在没有任何代码变化的前提下,一个测试用例跑了 999 次都通过了,但是在跑第 1000 次时失败了;与时间相关的,昨天跑的是 ok 的,今天跑就挂了。
Self-Validating:自验证。测试用例必须能够自动告知(断言)运行结果,而不是依赖人工来判断结果是正确还是错误。反例:测试用例只能打印运行日志,需要依赖人工来判断运行是否符合预期。
Timely:及时。编写自动化是一种很好的习惯,为了保证能够及时的得到反馈,必须要及时编写自动化测试而不拖延,一旦拖延,就很难补回来。一个是由于人的惰性,另一个也是因为时间久了,当时很熟悉的代码可能就陌生了。反例:现在太忙,后面找个时间集中补测试。
Spock学习笔记
https://spockframework.org/spock/docs/2.2-M2/interaction_based_testing.html