ut-in-java

UT技能可以给你带来什么?

  • 测试:
    • 所想即所得
    • 测试的入口,没有单侧不了的代码
    • 健壮性
    • 代码重构后,验证的手段
  • 学习源码的手段
  • 痛苦: UT 代码是体力活
  • 单侧的维护:
    • 不断补充和优化,工程的单侧是慢慢优化和补充的
    • don’t repeat yourself,做有沉淀的事情

UT tools

1
"write less, check more"
  • Junit
  • Spring Test
  • AssertJ
  • Hamcrest
  • Mockito
  • JSONassert
  • JsonPath
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>

test in java

mock /spy in mockito

  • 概念上区别:

    • 一个是会真实的调用,一个是不会产生调用
    • mock 提供的是完全的mock,spy提供的部分mock;
      也就是mock的对象,client 调用非mock 的行为,会出现异常,spy 调用非mock 行为,会按真实的代码逻辑处理;
  • 以这个代码为例 code

  • 为什么提供这两种mock特性?

    • 有时,client 只需要部分的mock行为

@Runwith

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:
      1
      2
      3
      4
      5
      6
      7
      @Target({ElementType.TYPE, ElementType.METHOD})
      @Retention(RetentionPolicy.RUNTIME)
      @EnabledIf(
      expression = "#{systemProperties['os.name'].toLowerCase().contains('mac')}",
      reason = "Enabled on Mac OS"
      )
      public @interface EnabledOnMac {}

以下注解 在 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