測試覆蓋率 之 Cobertura的使用

久曲健發表於2022-05-05

什麼是程式碼覆蓋率?

程式碼覆蓋率是對整個測試過程中被執行的程式碼的衡量,它能測量原始碼中的哪些語句在測試中被執行,哪些語句尚未被執行。

為什麼要測量程式碼覆蓋率?

眾所周知,測試可以提高軟體版本的質量和可預測性。但是,你知道你的單元測試甚至是你的功能測試實際測試程式碼的效果如何嗎?是否還需要更多的測試?

這些是程式碼覆蓋率可以試圖回答的問題。總之,出於以下原因我們需要測量程式碼覆蓋率:

  • 瞭解我們的測試用例對原始碼的測試效果
  • 瞭解我們是否進行了足夠的測試
  • 在軟體的整個生命週期內保持測試質量

注:程式碼覆蓋率不是靈丹妙藥,覆蓋率測量不能替代良好的程式碼審查和優秀的程式設計實踐。

通常,我們應該採用合理的覆蓋目標,力求在程式碼覆蓋率在所有模組中實現均勻覆蓋,而不是隻看最終數字的是否高到令人滿意。

舉例:假設程式碼覆蓋率只在某一些模組程式碼覆蓋率很高,但在一些關鍵模組並沒有足夠的測試用例覆蓋,那樣雖然程式碼覆蓋率很高,但並不能說明產品質量就很高。

關於Cobertura

Cobertura可以理解為一種測試覆蓋率報告方案,通過Cobertura + Maven + Jenkins來實現測試覆蓋率的展示。

如何使用Cobertura

1、pom中新增依賴

           <!-- 在clean時把老的ser檔案也清理掉 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-clean-plugin</artifactId>
                <version>2.4.1</version>
                <configuration>
                    <filesets>
                        <fileset>
                            <directory>.</directory>
                            <includes>
                                <include>**/*.ser</include>
                            </includes>
                        </fileset>
                    </filesets>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>cobertura-maven-plugin</artifactId>
                <version>2.7</version>
                <configuration>
                    <formats>
                        <format>html</format>
                        <format>xml</format>
                    </formats>
                    <aggregate>true</aggregate> <!-- 表示會聚合不同子module下的測試報告 -->
                    <check/>
                </configuration>
            </plugin>

2、通過命令列生成報告檔案

輸入如下命令:

mvn cobertura:cobertura

它會在每個模組以及根目錄的target下分別產生.ser檔案以及相應覆蓋率報告檔案。

3、覆蓋率報告

覆蓋率的html報告如下:

4、其他定製需要

因實際場景需要,排除某些方法,需要調整如下配置:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.18.1</version>
    <configuration>
        <includes>
            <include>**/*TestJMock.java</include>
        </includes>
        <excludes>
            <exclude>**/*Test.java</exclude>
        </excludes>
    </configuration>
</plugin>

如果要對測試覆蓋率進行控制,一定要達到指定標準呢,做如下配置:

<plugin>
 <groupId>org.codehaus.mojo</groupId>
 <artifactId>cobertura-maven-plugin</artifactId>
 <version>2.7</version>
 <configuration>
     <formats>
         <format>html</format>
         <format>xml</format>
     </formats>
     <aggregate>true</aggregate> <!-- 表示會聚合不同子module下的測試報告 -->
    <check>
        <branchRate>0</branchRate>
        <lineRate>0</lineRate>
        <haltOnFailure>true</haltOnFailure>
        <totalBranchRate>0</totalBranchRate>
        <totalLineRate>0</totalLineRate>
        <packageLineRate>0</packageLineRate>
        <packageBranchRate>0</packageBranchRate>
        <regexes>
            <regex>
                <pattern>com.company.mode.services.*</pattern>
                <branchRate>60</branchRate>
                <lineRate>80</lineRate>
            </regex>
        </regexes>
    </check>
 </configuration>
</plugin>

通過mvn cobertura:check即可對覆蓋率進行校驗

這個Maven外掛的一些缺陷:

1、不支援lambda表示式,在mvn命令的執行中會報錯,即使在通過git倉庫下載最新Cobertura程式碼自己打包生成的jar包,雖然沒有報錯,但是依然不能正常產生報告

2、根目錄下的測試覆蓋率檔案似乎只是隨機選了底下一個module的覆蓋率,沒有按照我們的設想來:將所有子module的測試覆蓋率彙總。

Jenkins整合

安裝Cobertura外掛

設定 Pre Steps

新增構建後操作

生成覆蓋率報告

所有的配置都好了,點選立即構建,即可生成相應的測試覆蓋率報告

到此,關於Cobertura的使用介紹完畢,有興趣的同學,請自行嘗試!

參考文章:

https://blog.csdn.net/guzhangyu12345/article/details/90542976
https://blog.csdn.net/weixin_40785472/article/details/115961328

相關文章