1、運行測試(JUnit)java
方法:運行真實的項目環境(啓動spring應用、鏈接數據庫、加載各類環境)web
示例代碼: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層的接口測試json
缺點bootstrap
1.須要加載環境,啓動慢app
2.依賴於真實的環境和數據庫,須要配置加載環境和數據庫數據(好處是能夠作冒煙測試,壞處是依賴外部環境,不能只測某個單元的邏輯)框架
注意點:dom
1.某些VM的啓動參數,須要在本地配置(如阿波羅配置系統)。能夠在idea的單元測試啓動項裏設置ide
2.因爲單元測試的idea啓動項設置裏,沒有spring boot的active profiles這個選項,因此沒法讀取bootstrap-dev.properties裏的配置。因此要寫在bootstrap.properties裏
2、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測試適用於測單一的邏輯作單元測試