UT技能可以给你带来什么?
- 测试:
- 所想即所得
- 测试的入口,没有单侧不了的代码
- 健壮性
- 代码重构后,验证的手段
- 学习源码的手段
- 痛苦: UT 代码是体力活
- 单侧的维护:
- 不断补充和优化,工程的单侧是慢慢优化和补充的
- don’t repeat yourself,做有沉淀的事情
UT tools
1
"write less, check more"
- Junit
- Spring Test
- AssertJ
- Hamcrest
- Mockito
- JSONassert
- JsonPath
|
|
test in java
mock /spy in mockito
概念上区别:
- 一个是会真实的调用,一个是不会产生调用
- mock 提供的是完全的mock,spy提供的部分mock;
也就是mock的对象,client 调用非mock 的行为,会出现异常,spy 调用非mock 行为,会按真实的代码逻辑处理;
以这个代码为例 code
为什么提供这两种mock特性?
- 有时,client 只需要部分的mock行为
@Runwith
- see https://www.mscharhag.com/java/understanding-junits-runner-architecture
- runner:
BlockJUnit4ClassRunner
MockitoJUnitRunner
SpringJUnit4ClassRunnerk
;
junit
junit4 or junit5? why?
- junit5 可以多个runner 并发的运行,测试用例能更快的得到结果
- junit5 使用了java8 的特性
- junit5 将junit 的结构进行了拆分(多个jar包,可以按需使用特定的jar包)
- junit5 独立开发,提供了一套新的注解,这个有迁移成本,所以很多基于junit4 的测试框架(例如spring test),没有使用junit5
- junit5 重写了整个代码,所以理论上工程上可以同时使用junit4 & junit5 (如何同时使用junit4 & junit5 ,可以参考链接link
- junit5 和junit4 的使用区别,可以参考 reference
test in spring-framework based apps
注解使用
@ContextConfiguration
@WebAppConfiguration
- 配置好mvc 集成测试的环境,启动web服务,访问web资源
- 使用
file:src/main/webapp
作为默认的web 资源目录 (潜台词是你可以指定测试使用的web资源)
@ActiveProfiles
@EnabledIf
@DisabledIf
: 告知不要运行某个测试当满足一定的条件时- 可以利用这个注解作为元注解,自定义其他的注解,eg:1234567@Target({ElementType.TYPE, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@EnabledIf(expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",reason = "Enabled on Mac OS")public @interface EnabledOnMac {}
- 可以利用这个注解作为元注解,自定义其他的注解,eg:
以下注解 在 SpringJUnit4ClassRunner
下生效
- @Timed(N)
单元测试必须在指定时间N(ms)内执行完毕 - @Repeat(N)
测试方法执行N 次
更多测试注解,可以参考文档reference link
Test mvc
spring-boot based test
java UT 业界动态
- Behavior Driven Development
- java8_Lambdas_based junit5