国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Lombok導(dǎo)致代碼單元測試覆蓋率崩塌

這篇具有很好參考價值的文章主要介紹了Lombok導(dǎo)致代碼單元測試覆蓋率崩塌。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Lombok 由于其使用的便利性, 目前流傳非常廣泛。甚至有呼聲希望其能被Java官方引入,成為JDK的一部分。

當然凡事都有兩面性,Lombok的引入也是有代價的。一時注釋一時爽,結(jié)果導(dǎo)致代碼在不知不覺中翻了好幾倍。

例如以下幾個簡單的注解,背后是N多個自動生成的方法:

  • @Data注解:這是若干個注解的組合,包括有@Setter、@Getter、@ToString和@EqualsAndHashCode的功能,還會添加一個公共的構(gòu)造方法。staticConstructor 參數(shù)可將構(gòu)造方法置為private,并提供一個獲取對象的靜態(tài)方法。
  • @Builder:使用私有構(gòu)造函數(shù)生成一個名為TBuilder的內(nèi)部類,創(chuàng)建一個構(gòu)造器。
  • @NoArgsConstructor:該注解使用在類上,該注解提供一個無參構(gòu)造
  • @AllArgsConstructor:該注解使用在類上,該注解提供一個全參數(shù)的構(gòu)造方法,默認不提供無參構(gòu)造方法。

這其中尤其是@Data這個注解,會附帶相當多的方法。

默認情況下,由于Jacoco不會區(qū)分Lombok生成的代碼和正常的源代碼。結(jié)果,在引入Lombok后就會發(fā)現(xiàn),覆蓋率通常會低得讓人匪夷所思。例如某個項目,通過Jacoco獲取到的代碼行數(shù)以及覆蓋率為:

可見,這個覆蓋率是非常低的,會被質(zhì)量門禁判違規(guī)(常見會要求>50%甚至>80%)。

這種情況下,開發(fā)者一般會有兩個選擇:

  1. 專門為這些生成的代碼編寫單元測試用例
  2. 要求降低質(zhì)量門禁中的覆蓋率要求

通常這兩個方案都是不可取的。

專門為這些生成的代碼編寫用例是沒有意義的。既然使用了Lombok,一個默認的前提就是Lombok是正確可靠的,為這些自動生成的代碼進行單元測試不是一件高優(yōu)先級的事情,還是放過已經(jīng)996的碼農(nóng)和他們的頭發(fā)吧,要愛護那些愿意寫單元測試的好同志。

第二種方案也不可取,這會引入一個非常不好的開始,因為破窗效應(yīng),馬上質(zhì)量門禁也沒有意義了。千萬個教訓(xùn)告訴我們,千萬不要去考驗人性。

兩種選擇都沒有意義,也都不可取,于是馬上就有人想到了第三種方法。

3 手工排除Bean

無論是Jacoco還是Sonar,都提供了exclude的方式,通過配置項來指定統(tǒng)計時排除某些特定的包或者類。如對于Jacoco可以在jacoco-maven-plugin的<configuration>中有如下配置,用于排除指定的內(nèi)容。

<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.7</version>
                <configuration>
                        <excludes>
                            <exclude>**/*DTO.*</exclude>
                            <exclude>**/domain/**/*</exclude>
                        </excludes>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

第一個<exclude>標簽將吧所有DTO結(jié)尾的類排除,而第二個<exclude>標簽將把domain目錄和子目錄下的所有類都排除出去。

通過這個方式,也可以在數(shù)據(jù)源頭上進行排除。

類似的,還可以通過基于jacoco覆蓋率報告來自研解析工具,進行覆蓋率或者增量覆蓋率計算。這個過程中,也可以指定需要排除的包或者類,實現(xiàn)類似的做法。

當然,這種方式也需要項目有一些項目結(jié)構(gòu)和命名上的約定,以保證過濾的正確。另外,既然放開了過濾的條件,有可能會讓人鉆空子。

4 使用Sonarqube 而不是Jacoco的結(jié)果

雖然Jacoco中的數(shù)據(jù)受到了lombok的污染,但是SonarQube由于有自身代碼行的計算是根據(jù)掃描的源碼,再根據(jù)自身的算法進行計算,并不是根據(jù)Jacoco提供的數(shù)據(jù)。再由此計算覆蓋率的時候,就可以部分規(guī)避掉這個問題了。所以這是一個正解。當然,由于SonarQube和Jacoco的代碼行、覆蓋率等算法有差異,最好是保持指標數(shù)據(jù)源前后的一致性,避免混用。

5 使用lombok.addLombokGeneratedAnnotation

其實從Jacoco 0.8.0開始,其實就具備了可以將lobmok生成的代碼從Jacoco報告中排除的能力。發(fā)布說明可以參見

https://github.com/jacoco/jacoco/pull/513

具體做法是,在項目的根目錄下新建一個名字為lombok.config的文件,里面有如下的內(nèi)容,

config.stopBubbling = true
lombok.addLombokGeneratedAnnotation = true

Lombok在為由其生成的構(gòu)造方法、方法、字段和類型中增加@Generated注解,然后Jacoco借助這個注解來實現(xiàn)更為準去的排除。排除以后的結(jié)果如下,

當然,這個方案對兩者的版本也有限制,要求Lombok >= 1.16.14, jacoco>0.8.0

總結(jié)一下,面對lombok,有如下五種解決方案,推薦后兩種哦。

1專門為這些生成的代碼編寫單元測試用例 【X】

2要求降低質(zhì)量門禁中的覆蓋率要求【X】

3手工排除Bean 【X】

4使用Sonarqube 而不是Jacoco的結(jié)果【OK】

5使用lombok.addLombokGeneratedAnnotation 【OK】文章來源地址http://www.zghlxwxcb.cn/news/detail-471576.html

到了這里,關(guān)于Lombok導(dǎo)致代碼單元測試覆蓋率崩塌的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 特性介紹 | MySQL 測試框架 MTR 系列教程(二):進階篇 - 內(nèi)存/線程/代碼覆蓋率/單元/壓力測試

    作者:盧文雙 資深數(shù)據(jù)庫內(nèi)核研發(fā) 序言: 以前對 MySQL 測試框架 MTR 的使用,主要集中于 SQL 正確性驗證。近期由于工作需要,深入了解了 MTR 的方方面面,發(fā)現(xiàn) MTR 的能力不僅限于此,還支持單元測試、壓力測試、代碼覆蓋率測試、內(nèi)存錯誤檢測、線程競爭與死鎖等功能,因

    2024年02月03日
    瀏覽(24)
  • springboot項目使用Junit5 + mockito + jacoco 實現(xiàn)單元測試以及代碼覆蓋率檢查

    在創(chuàng)建springboot項目時會默認添加spring-boot-starter-test依賴,其中已經(jīng)包含了junit、mockito依賴,根據(jù)springboot版本的不同junit和mockito的版本也會有所不同 先說一下各自功能: junit只說一點,junt4和junit5的注解不同,使用方式略有差異,其他不贅述了,基本用法都懂。 mockito是mock的

    2023年04月23日
    瀏覽(32)
  • IDFA 單元測試以及單元測試覆蓋率步驟

    IDFA 單元測試以及單元測試覆蓋率步驟

    1、新建java類 隨意選擇java類文件,新建一個Java類CountVowel,用來統(tǒng)計字符串中元音的個數(shù),代碼如下: 2、生成測試類 一)、對寫好的類新建測試類,有以下兩種方法: 將鼠標光標移動到類名上,使用 Alt+Enter 組合鍵,如下圖,選擇 Create Test ,從而新建一個測試類; 右鍵點

    2024年02月16日
    瀏覽(19)
  • java 單元測試覆蓋率調(diào)研

    java 單元測試覆蓋率調(diào)研

    根據(jù)網(wǎng)上的資料搜索發(fā)現(xiàn),現(xiàn)在常用的 java 單元測試覆蓋率工具主要有: Emma Cobertura Jacoco Clover(商用) 工具 Jacoco Emma Cobertura 原理 使用 ASM 修改字節(jié)碼 修改 jar 文件,class 文件字節(jié)碼文件 基于 jcoverage,基于 asm 框架對 class 文件插樁 覆蓋粒度 行,類,方法,指令,分支 行,類

    2024年02月12日
    瀏覽(29)
  • 如何計算單元測試的覆蓋率

    如何計算單元測試的覆蓋率

    單元測試的覆蓋率有:語句覆蓋率(即行覆蓋率)、分支覆蓋率、條件覆蓋率、分支條件覆蓋率、路徑覆蓋率等。 語句覆蓋率 所謂語句就是那些非分支、非判斷的語句。 計算公式:程序執(zhí)行到的語句總數(shù) / 全部語句的總數(shù) 分支覆蓋率 有判定語句的地方都會出現(xiàn)2個分支。

    2024年01月21日
    瀏覽(23)
  • Sonarqube-8.9版本測試單元測試覆蓋率

    Sonarqube-8.9版本測試單元測試覆蓋率

    junit testNG Spock Jacoco Cobertura SonarQube 不會運行測試或生成報告。要在分析中包含覆蓋結(jié)果,需要設(shè)置第三方覆蓋工具來生成報告并配置 SonarQube 以導(dǎo)入這些報告。 生成單元測試覆蓋率需要按照以下步驟操作: SonarQube 使用導(dǎo)入的覆蓋率報告中的覆蓋行和可執(zhí)行行(或要覆蓋的行

    2024年02月02日
    瀏覽(23)
  • 13.Springboot整合junit5單元測試與生成單元測試覆蓋率

    13.Springboot整合junit5單元測試與生成單元測試覆蓋率

    現(xiàn)在基本大公司都要求單元測試了,保證我們代碼得質(zhì)量,而我司更是要求覆蓋率要達到60%以上,所以搞一下。 這里有兩個方法: 1.使用maven自帶得test,idea右側(cè)maven模塊執(zhí)行項目下得test 2.使用cmd命令,在你的項目pom文件所在目錄 ,打開cmd,執(zhí)行如下: 結(jié)果如下:打開site文

    2024年02月16日
    瀏覽(23)
  • 【Maven】單元測試、統(tǒng)計、覆蓋率相關(guān)插件使用介紹

    【Maven】單元測試、統(tǒng)計、覆蓋率相關(guān)插件使用介紹

    maven-surefire-plugin 是 maven 執(zhí)行單元測試的插件,不顯性配置也可以直接使用。 這個插件的 surefire:test 命令會默認綁定 maven 執(zhí)行的 test 階段。 執(zhí)行結(jié)束后,默認在 target/surefire-reports 目錄下會生成 txt 和 xml 兩種格式的結(jié)果,不利于直觀展示,需要結(jié)合其它插件一起使用。 如果

    2024年02月08日
    瀏覽(21)
  • maven sonar 掃描單元測試覆蓋率為0,但是單元測試數(shù)不為0

    maven sonar 掃描單元測試覆蓋率為0,但是單元測試數(shù)不為0

    最初配置如下: sonar 掃描后的單元測試覆蓋率為0。但是但與測試數(shù)量不為0. 而配置的 sonar : 單元測試數(shù)基于 maven-surefire-plugin 插件 單元測試覆蓋率基于 jacoco-maven-plugin 插件。 發(fā)現(xiàn) maven 執(zhí)行后沒有 jacoco.exec 文件。導(dǎo)致 sonar 單元測試覆蓋率為 0。并且沒有下面的 jacoco 結(jié)果文

    2024年02月11日
    瀏覽(16)
  • Springboot 多模塊項目集成Jacoco統(tǒng)計單元測試覆蓋率

    jenkis服務(wù)器需要配置Jacoco 常見報錯: Not compiling test sources Skipping JaCoCo execution due to missing execution data file. 修改插件配置

    2024年02月09日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包