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

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測試適用於測單一的邏輯作單元測試

相關文章
相關標籤/搜索