一、運行測試(JUnit)
方法:運行真實的項目環境(啟動spring應用、連接數據庫、加載各種環境)
示例代碼:
package com.ewt360.psychology.service.biz.dal.mapper; import com.ewt360.psychology.service.biz.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() { log.info("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 com.ewt360.psychology.service.biz.dal.domain; import com.alibaba.fastjson.JSON; import com.ewt360.psychology.service.biz.dal.entity.ReportDataTempEntity; import com.ewt360.psychology.service.biz.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測試適用於測單一的邏輯做單元測試