两种常见的单元测试方式(笔记)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
两种常见的单元测试⽅式(笔记)
⼀、运⾏测试(JUnit)
⽅法:运⾏真实的项⽬环境(启动spring应⽤、连接数据库、加载各种环境)
⽰例代码:
package .dal.mapper;
import .dal.entity.ReportDataTempEntity;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import static org.junit.Assert.*;
/**
* Title: ReportDataTempMapperTest
* Description: 单元测试
* author: xu jun
* date: 2019/4/18
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
@WebAppConfiguration
@Transactional
@Slf4j
public class ReportDataTempMapperTest {
@Autowired
ReportDataTempMapper reportDataTempMapper;
@Before
public void setUp() {
("Test start..........");
}
@Test
public void selectData() {
//先插后查,由于开启了事务,不会对数据库造成影响
ReportDataTempEntity testEntity = new ReportDataTempEntity();
testEntity.setType(99);
testEntity.setData("UC test");
reportDataTempMapper.insertOne(testEntity);
List<ReportDataTempEntity> reportDataTempEntities = reportDataTempMapper.selectData(testEntity);
Assert.assertEquals(1, reportDataTempEntities.size());
}
}
优点:
1.可以跑真实的代码,适合做冒烟测试。
如DAO、core、service层的接⼝测试
缺点
1.需要加载环境,启动慢
2.依赖于真实的环境和数据库,需要配置加载环境和数据库数据(好处是可以做冒烟测试,坏处是依赖外部环境,不能只测某个单元的逻辑)
注意点:
1.某些VM的启动参数,需要在本地配置(如阿波罗配置系统)。
可以在idea的单元测试启动项⾥设置
2.由于单元测试的idea启动项设置⾥,没有spring boot的active profiles这个选项,所以⽆法读取bootstrap-dev.properties⾥的配置。
所以要写在bootstrap.properties⾥
⼆、mock测试(PowerMock)
⽅法:使⽤mock框架,在单元测试的时候,通过打桩来mock⽅法所需的对象
代码:
package .dal.domain;
import com.alibaba.fastjson.JSON;
import .dal.entity.ReportDataTempEntity;
import .dal.mapper.ReportDataTempMapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* Title: ReportDataTempDomainMockTest
* Description: 单元测试(Mock)
* author: xu jun
* date: 2019/4/18
*/
@RunWith(PowerMockRunner.class)
public class ReportDataTempDomainMockTest {
@InjectMocks
private ReportDataTempDomain reportDataTempDomain;
@Mock
private ReportDataTempMapper reportDataTempMapper;
@Test
public void getLastUpdateTime() {
//stub
Mockito.when(reportDataTempMapper.selectData(Mockito.any())).thenReturn(buildReportDataTempEntities());
Date lastUpdateTime = reportDataTempDomain.getLastUpdateTime();
Assert.assertNotNull(lastUpdateTime);
}
private List<ReportDataTempEntity> buildReportDataTempEntities() {
List<ReportDataTempEntity> result = new ArrayList<>();
ReportDataTempEntity entity = new ReportDataTempEntity();
entity.setType(99);
entity.setData(JSON.toJSONString(new Date()));
result.add(entity);
return result;
}
}
有点:
1.不依赖于环境,只测最⼩粒度的⽅法逻辑
2.运⾏速度快
缺点:
1.单元测试所需的数据,全靠模拟。
实际⽣产环境⾥的数据可能会不同(不过从单元测试的⾓度讲,没关系)
2.适⽤于测试复杂的业务逻辑,对外部依赖的因素(环境变量,配置)⽆法测试
总结:
1.运⾏测试适⽤于冒烟测试和从下向上写的接⼝⾃测(也可以测facade层的HTTP请求)
2.Mock测试适⽤于测单⼀的逻辑做单元测试。