兩種常見的單元測試方式(筆記)


一、運行測試(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測試適用於測單一的邏輯做單元測試


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM