单元测试记录

9 篇文章 0 订阅

单元测试规范

1. maven配置

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

其中这个类集成了

  • JUnit 4: 目前最强大的java应用单元测试框架

  • Spring Test & Spring Boot Test: Spring Boot 集成测试支持

  • AssertJ: 一个java断言库,提供测试断言支持

  • Hamcrest: 对象匹配断言和约束组件

  • Mockito: 可以按类型创建mock对象,可以根据方法参数指定特定的响应,也支持对于mock调用过程的断言

  • JSONassert: JSON断言库

  • JsonPath: JSON XPath 操作类库

2. 测试模板

2.1 sping自带的单元测试模板
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {

	@Test
	public void contextLoads() {
	}
	//在下面我们可以写自己的单元测试
}

正常来说,SpringBoot项目建立的时候会生成一个测试类/src/test/ApplicationTests.java

不建议使用spring自带的单元测试模板

因为我们如果去执行这个测试类,会启动一个空的spring项目。也就是说,我们启动了整个应用,耗费了资源,只是为了测试一个方法。一个好的单元测试应该是毫秒级的。

2.2 使用Mockito框架
常用注解
  • @RunWith(MockitoJUnitRunner.class) 使用在类上,初始化mock
  • @Mock 创建一个mock
  • @InjectMocks 创建一个实例,其余用@Mock注解创建的mock将被注入到用该实例中
常用测试场景
  • do/when:包括doThrow(…).when(…)/doReturn(…).when(…)/doAnswer(…).when(…)
  • given/will:包括given(…).willReturn(…)/given(…).willAnswer(…)
  • when/then: 包括when(…).thenReturn(…)/when(…).thenAnswer(…)

其中:

when(…) thenReturn(…)会调用真实的方法,如果你不想调用真实的方法而是想要mock的话,就不要使用这个方法。
doReturn(…) when(…) 不会调用真实方法

Answer 修改对未预设的调用返回默认期望

@Test
public void mockTest(){
  //mock对象使用Answer来对未预设的调用返回默认期望值
  List list = mock(List.class,new Answer() {
    @Override
    public Object answer(InvocationOnMock invocation) throws Throwable {
      return 999;
    }
  });
  //下面的get(1)没有预设,通常情况下会返回NULL,但是使用了Answer改变了默认期望值
  assertThat(list.get(1),is(999));
  //下面的size()没有预设,通常情况下会返回0,但是使用了Answer改变了默认期望值
  assertThat(list.size(),is(999));
}


模拟void方法

 Mockito.doNothing().when(对象).方法名()
 Mockito.doAnswer((invocationOnMock) -> null).when(对象).方法名();
demo
@RunWith(MockitoJUnitRunner.class)
public class HelloControllerTest {
	
	//需要mock的对象
    @Mock
    HelloService helloService;

    @InjectMocks
    HelloController helloController ;


    @Test
    public void hello() throws Exception {

        Mockito.when(helloService.hello()).thenReturn("hello");
        
        String result=helloController.hello();
        assertEquals("hello", result);


    }

}

Mockito 更多的使用可查看→官方文档

##### 不足之处

  • 不能mock静态方法

  • 不能mock private方法

  • 不能mock final class

2.3 PowerMockito
mavan配置
<!-- https://mvnrepository.com/artifact/org.powermock/powermock-module-junit4 -->
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>2.0.5</version>
    <scope>test</scope>
</dependency>

<!-- https://mvnrepository.com/artifact/org.powermock/powermock-api-mockito2 -->
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito2</artifactId>
    <version>2.0.4</version>
    <scope>test</scope>
</dependency>

##### 类注解

@RunWith(PowerMockRunner.class) // 告诉JUnit使用PowerMockRunner进行测试
@PrepareForTest({DateUtils.class}) // 所有需要测试的类列在此处,适用于模拟final类或有final, private, static, native方法的类

mock静态方法
 //mock DateUtils工具类
 PowerMockito.mockStatic(DateUtils.class);
 PowerMockito.when(DateUtils.getToday()).thenReturn("20200329");

mock私有方法
HelloService spy = PowerMockito.spy(helloService;
PowerMockito.when(spy, "testPrivate" ).thenReturn("test");//私有方法mockito不行了,需要用无所不能的PowerMock监视spy

String result=spy.hello("test");//该方法调用testPrivate方法
assertEquals("hello", result);
单元测试报告 版本:V1.3 文 档 编 号 保 密 等 级 作 者 最后修改日期 审 核 人 最后审批日期 批 准 人 最后批准日期 修订记录 日期 版本 修订说明 修订人 目 录 1 简介 2 1.1 目的 2 1.2 背景 2 1.3 范围 2 2 测试用例清单 2 3 功能测试分析 2 4 边界测试分析 2 5 覆盖率分析 2 6 内存使用分析 2 7 典型缺陷记录 3 7.1 缺陷1 3 7.1.1 表现 3 7.1.2 原因 3 7.1.3 方案 3 8 测试数据分析 3 8.1 测试有效性分析 3 8.2 测试效率分析 3 9 产品质量分析 4 10 测试结论 4 简介 目的 【描述该单元测试报告的目的。】 背景 【描述单元测试报告的背景,单元测试活动目的。如无特殊背景信息,可裁剪。】 范围 【说明该单元测试报告在整个项目周期的适用范围】 测试用例清单 模块 目标类 级别 用例类 用例描述 执行结果 备注 【被测的代码类】 【代码级别】 【Junit测试类1】 【意图描述】 【P/F】 【Junit测试类2】 功能测试分析 边界测试分析 覆盖率分析 目标类 级别 方法覆盖率 行覆盖率 备注 【被测的代码类】 【代码级别】 内存使用分析 典型缺陷记录 记录单元测试中所发现的典型缺陷或常见缺陷。供再次发现同类问题时,作为参考使用。 缺陷1 表现 【缺陷表现描述】 原因 【缺陷产生原因分析描述】 方案 【解决方案描述】 测试有效性分析 【统计实际发现的缺陷数据,分析与计划值产生偏差的原因,结合《项目量化管理计划》定义的阈值,确定是否采取相关措施】 计划发现缺陷数 致命 严重 一般 实际发现缺陷数 偏差分析 对策或调整措施 产品质量分析 【结合上述数据和信息,对本次测试的项目、产品的本身质量进行分析、评价和总结】 测试结论  【描述测试是否达到测试计划的目的,是否满足单元测试的结束条件。】
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值