临时

一个项目究竟怎么设计单元测试比较好?

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

posted on 2023-07-13 20:07  彦承  阅读(32)  评论(0编辑  收藏  举报