最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot集成junit編寫單元測試實戰(zhàn)

 更新時間:2022年02月23日 10:54:00   作者:mb61f5029be6939  
在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),本文主要介紹了springboot集成junit編寫單元測試實戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),甚至,用代碼覆蓋率來考核測試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。于是乎,測試人員費(fèi)盡心思設(shè)計案例覆蓋代碼。用代碼覆蓋率來衡量,有利也有弊。

首先,讓我們先來了解一下所謂的“代碼覆蓋率”。我找來了所謂的定義:代碼覆蓋率 = 代碼的覆蓋程度,一種度量方式。

一:查看jar包版本號是否為junit4;

java中springboot集成junit編寫單元測試(實戰(zhàn)+坑)_mvc

junit自身注解:

@BeforeClass 全局只會執(zhí)行一次,而且是第一個運(yùn)行
@Before 在測試方法運(yùn)行之前運(yùn)行
@Test 測試方法
@After 在測試方法運(yùn)行之后允許
@AfterClass 全局只會執(zhí)行一次,而且是最后一個運(yùn)行
@Ignore 忽略此方法

坑:為什么要先看版本號因為在junit5中@Before無效需要使用@BeforeEach;

二:實戰(zhàn)應(yīng)用:

idea快捷創(chuàng)建測試類:

1.首先要保證有test類,和main同級:

java中springboot集成junit編寫單元測試(實戰(zhàn)+坑)_spring_02

2.創(chuàng)建

java中springboot集成junit編寫單元測試(實戰(zhàn)+坑)_代碼覆蓋率_03

java中springboot集成junit編寫單元測試(實戰(zhàn)+坑)_代碼覆蓋率_04

編輯

添加圖片注釋,不超過 140 字(可選)

java中springboot集成junit編寫單元測試(實戰(zhàn)+坑)_代碼覆蓋率_05

3.編寫單元測試

@RunWith(SpringRunner.class):運(yùn)行器指定
@SpringBootTest(classes =IotSystemApplication.class, webEnvironment =SpringBootTest.WebEnvironment.DEFINED_PORT)
@Slf4j

可選參數(shù)

@ActiveProfiles("baseline") :表示項目啟動參數(shù)為-baseline
@Transactional :回滾
import com.shimao.iot.common.entity.ResultListVO;
import com.shimao.iot.common.entity.ResultVO;
import com.shimao.iot.common.model.dict.vo.AreaDictGangVo;
import com.shimao.iot.common.model.dict.vo.AreaDictVo;
import com.shimao.iot.system.IotSystemApplication;
import lombok.extern.slf4j.Slf4j;
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.context.WebApplicationContext;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author zhangtonghao
* @create 2022-02-16 11:00
*/
@ActiveProfiles("baseline")
@RunWith(SpringRunner.class)
@SpringBootTest(classes =IotSystemApplication.class, webEnvironment =SpringBootTest.WebEnvironment.DEFINED_PORT)
@AutoConfigureMockMvc
@Transactional
@Slf4j
class AreaDictionaryControllerTest {
    private MockMvc mockMvc;
    @Autowired
    private AreaDictionaryController controller;
    @Autowired
    private WebApplicationContext webApplicationContext;
    /*@BeforeEach  初始化數(shù)據(jù)
void setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}*/
    @Test   
    void getRegionDetail() {
        ResultListVO<AreaDictGangVo> regionDetail =controller.getRegionDetail("");
        System.out.println("======測試成功:" +regionDetail);
        String name ="華北";
        regionDetail =controller.getRegionDetail(name);
        Assert.assertNotNull(regionDetail);
        System.out.println("======測試成功:" +regionDetail);
    }
    @Test
    void testGetRegionDetail() {
        Long areaCode =100001L;
        ResultVO<AreaDictVo> regionDetail =controller.getRegionDetail(areaCode);
        Assert.assertNotNull(regionDetail);
        System.out.println("======測試成功:" +regionDetail);
    }
    @Test
    void getAreaTypeDetails() {
        Integer areaCode =100001;
        ResultListVO<AreaDictVo> resultListVO =controller.getAreaTypeDetails(areaCode);
        Assert.assertNotNull(resultListVO);
        System.out.println("======測試成功:" +resultListVO);
    }
    @Test
    void getSubrangeDetail() {
        Long areaCode =100001L;
        ResultListVO<AreaDictVo> resultListVO =controller.getSubrangeDetail(areaCode);
        Assert.assertNotNull(resultListVO);
        System.out.println("======測試成功:" +resultListVO);
    }
    @Test
    void getGangDetail() {
        Long areaCode =100001L;
        ResultVO<AreaDictGangVo> resultListVO =controller.getGangDetail(areaCode);
        Assert.assertNotNull(resultListVO);
        System.out.println("======測試成功:" +resultListVO);
    }
    @Test
    void findAreaDictList() {
        Long areaCode =100001L;
        List<Long> areaCodes =new ArrayList<>();
        areaCodes.add(areaCode);
        List<AreaDictVo> resultListVO =controller.findAreaDictList(areaCodes);
        Assert.assertNotNull(resultListVO);
        System.out.println("======測試成功:" +resultListVO);
    }
    @Test
    void findAreaDictParentMap() {
        Long areaCode =100001L;
        List<Long> areaCodes =new ArrayList<>();
        areaCodes.add(areaCode);
        Map<Long, AreaDictVo> resultListVO =controller.findAreaDictParentMap(areaCodes);
        Assert.assertNotNull(resultListVO);
        System.out.println("======測試成功:" +resultListVO);
    }
    @Test
    void queryProvinceAndCity() {
        ResultListVO<AreaDictVo> resultListVO =controller.queryProvinceAndCity();
        Assert.assertNotNull(resultListVO);
    }
}

4.啟動測試:正常啟動我就不說了說下如何查看覆蓋率啟動

首先需要安裝junit插件,然后啟動:

java中springboot集成junit編寫單元測試(實戰(zhàn)+坑)_mvc_06

java中springboot集成junit編寫單元測試(實戰(zhàn)+坑)_mvc_07

注意點:其實書寫單元測試沒有什么技巧,只有一個參數(shù)問題;你能保證參數(shù)正確就可以讓測試覆蓋率更高。這都需要看代碼實現(xiàn),所以不用妄想一鍵生成覆蓋率達(dá)到百分之80啥的了,不存在的。下面還有一些可用的技巧和講解,著急的可以不用看直接回去寫代碼去了。

三:擴(kuò)展

某些對象類的單元測試:

/**

* 調(diào)用VO DTO POJO MODEL等服務(wù)通用方法
*/
@Test
public void testDto() {
    HeartDtoheartDto = newHeartDto();
    testGetAndSet(heartDto);
    heartDto.toString();
    heartDto.equals(newObject());
    heartDto.hashCode();
    AlllogDtoallLogDto = newAlllogDto();
    testGetAndSet(allLogDto);
    allLogDto.toString();
    allLogDto.equals(newObject());
    allLogDto.hashCode();
}
/**
* JavaBean屬性名要求:前兩個字母要么都大寫,要么都小寫
* 對于首字母是一個單詞的情況,要么過濾掉,要么自己拼方法名
* f.isSynthetic()過濾合成字段
*/
private static void testGetAndSet(Object t) {
    try {
        Class modelClass =t.getClass();
        Object obj =modelClass.newInstance();
        Field[] fields =modelClass.getDeclaredFields();
        for (Fieldf :fields) {
            if (f.getName().equals("aLike") ||f.isSynthetic()) {
                continue;
            }
            PropertyDescriptorpd = newPropertyDescriptor(f.getName(), modelClass);
            Methodget =pd.getReadMethod();
            Methodset =pd.getWriteMethod();
            set.invoke(obj, get.invoke(obj));
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

斷言列表:

-------------->assertTrue(String message, boolean condition)             要求condition == true
-------------->assertFalse(String message, boolean condition)            要求condition == false
-------------->assertEquals(String message, XXX expected,XXX actual) 要求expected期望的值能夠等于actual
-------------->assertArrayEquals(String message, XXX[] expecteds,XXX [] actuals) 要求expected.equalsArray(actual)
-------------->assertNotNull(String message, Object object)          要求object!=null
-------------->assertNull(String message, Object object)             要求object==null
-------------->assertSame(String message, Object expected, Object actual)     要求expected == actual
-------------->assertNotSame(String message, Object unexpected,Object actual) 要求expected != actual
-------------->assertThat(String reason, T actual, Matcher matcher)  要求matcher.matches(actual) == true
-------------->fail(String message) 要求執(zhí)行的目標(biāo)結(jié)構(gòu)必然失敗,同樣要求代碼不可達(dá),即是這個方法在程序運(yùn)行后不會成功返回,如果成功返回了則報錯

代碼覆蓋程度的度量方式是有很多種的,這里介紹一下最常用的幾種:

1. 語句覆蓋(StatementCoverage)

又稱行覆蓋(LineCoverage),段覆蓋(SegmentCoverage),基本塊覆蓋(BasicBlockCoverage),這是最常用也是最常見的一種覆蓋方式,就是度量被測代碼中每個可執(zhí)行語句是否被執(zhí)行到了。這里說的是“可執(zhí)行語句”,因此就不會包括像C++的頭文件聲明,代碼注釋,空行,等等。非常好理解,只統(tǒng)計能夠執(zhí)行的代碼被執(zhí)行了多少行。需要注意的是,單獨一行的花括號{} 也常常被統(tǒng)計進(jìn)去。語句覆蓋常常被人指責(zé)為“最弱的覆蓋”,它只管覆蓋代碼中的執(zhí)行語句,卻不考慮各種分支的組合等等。假如你的上司只要求你達(dá)到語句覆蓋,那么你可以省下很多功夫,但是,換來的確實測試效果的不明顯,很難更多地發(fā)現(xiàn)代碼中的問題。

2. 判定覆蓋(DecisionCoverage)

又稱分支覆蓋(BranchCoverage),所有邊界覆蓋(All-EdgesCoverage),基本路徑覆蓋(BasicPathCoverage),判定路徑覆蓋(Decision-Decision-Path)。它度量程序中每一個判定的分支是否都被測試到了。這句話是需要進(jìn)一步理解的,應(yīng)該非常容易和下面說到的條件覆蓋混淆。因此我們直接介紹第三種覆蓋方式,然后和判定覆蓋一起來對比,就明白兩者是怎么回事了。

3. 條件覆蓋(ConditionCoverage)

它度量判定中的每個子表達(dá)式結(jié)果true和false是否被測試到了。

4. 路徑覆蓋(PathCoverage)

又稱斷言覆蓋(PredicateCoverage)。它度量了是否函數(shù)的每一個分支都被執(zhí)行了。這句話也非常好理解,就是所有可能的分支都執(zhí)行一遍,有多個分支嵌套時,需要對多個分支進(jìn)行排列組合,可想而知,測試路徑隨著分支的數(shù)量指數(shù)級別增加。

到此這篇關(guān)于springboot集成junit編寫單元測試實戰(zhàn)的文章就介紹到這了,更多相關(guān)springboot junit單元測試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java服務(wù)調(diào)用失敗報Service com.oneinfinite.adflow.api.service.TestService未找到的解決方法

    Java服務(wù)調(diào)用失敗報Service com.oneinfinite.adflow.api.service.T

    在Java開發(fā)中,服務(wù)調(diào)用是常見的操作,尤其是在微服務(wù)架構(gòu)中,然而,服務(wù)調(diào)用過程中可能會遇到各種問題,下面我們來看看如何解決Service com.oneinfinite.adflow.api.service.TestService with version 0.0.0 not found的問題吧
    2025-03-03
  • 利用Java代碼寫一個并行調(diào)用模板

    利用Java代碼寫一個并行調(diào)用模板

    這篇文章主要介紹了利用Java代碼寫一個并行調(diào)用模板,文章基于Java的相關(guān)內(nèi)容展開寫一個并行調(diào)用模板的詳細(xì)介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-05-05
  • Java中HashTable和HashMap的區(qū)別_動力節(jié)點Java學(xué)院整理

    Java中HashTable和HashMap的區(qū)別_動力節(jié)點Java學(xué)院整理

    HashTable和HashMap主要的區(qū)別有:線程安全性,同步(synchronization),以及速度。接下來通過本文給大家簡單介紹下HashTable和HashMap的區(qū)別,需要的的朋友參考下吧
    2017-04-04
  • SpringMVC接收多個對象的4種方法

    SpringMVC接收多個對象的4種方法

    這篇文章主要為大家詳細(xì)介紹了SpringMVC接收多個對象的4種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Spring?Cache簡單介紹和使用大全

    Spring?Cache簡單介紹和使用大全

    Spring?Cache是一個框架,實現(xiàn)了基于注解的緩存功能,只需要簡單地加一個注解,就能實現(xiàn)緩存功能,這篇文章主要介紹了Spring?Cache簡介和使用,需要的朋友可以參考下
    2023-03-03
  • springmvc限流攔截器的示例代碼

    springmvc限流攔截器的示例代碼

    本篇文章主要介紹了springmvc限流攔截器的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • springboot集成WebSockets廣播消息(推薦)

    springboot集成WebSockets廣播消息(推薦)

    這篇文章主要介紹了springboot-集成WebSockets廣播消息,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-12-12
  • Spring容器擴(kuò)展機(jī)制的實現(xiàn)原理

    Spring容器擴(kuò)展機(jī)制的實現(xiàn)原理

    這篇文章主要介紹了Spring容器擴(kuò)展機(jī)制的實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • Java?Maven?Settings配置參考教程

    Java?Maven?Settings配置參考教程

    這篇文章主要介紹了Java?Maven?Settings配置參考,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • 使用MockMvc進(jìn)行controller層單元測試 事務(wù)自動回滾的完整案例

    使用MockMvc進(jìn)行controller層單元測試 事務(wù)自動回滾的完整案例

    這篇文章主要介紹了使用MockMvc進(jìn)行controller層單元測試 事務(wù)自動回滾的完整案例,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06

最新評論

神农架林区| 武清区| 乐至县| 卢龙县| 延津县| 淄博市| 宜城市| 南投县| 武城县| 西畴县| 济源市| 扎囊县| 平果县| 沁源县| 加查县| 平山县| 定结县| 栖霞市| 武乡县| 西充县| 绩溪县| 建宁县| 客服| 达日县| 元朗区| 鸡泽县| 道真| 涞源县| 大连市| 汶川县| 颍上县| 庆安县| 拉萨市| 米脂县| 隆昌县| 游戏| 凤凰县| 辉南县| 绵阳市| 阳曲县| 桓台县|