簡體   English   中英

使用 JaCoCo 對 java.lang 類進行單元測試覆蓋

[英]Unit test coverage on java.lang classes with JaCoCo

我正在嘗試使用 JaCoCo 對java.lang類進行單元測試覆蓋率。

背景:到目前為止有效

這不是真正的標准,但是將${sourceDirectory}OpenJDK-8-sources (在 Ubuntu 上)中提供的源和 rt.jar 中提供的類復制到${project.build.outputDirectory}中非常簡單${project.build.outputDirectory} ,然后 JaCoCo maven 插件可以看到它們並為某些類生成合適的 output。

例如,我對sun.reflect.ByteVectorFactory的來源進行了一些報道。

但我無法覆蓋java.lang中的課程。 調用Byte.toString()時,報告中未涵蓋 function 並且Byte.class未顯示在classDumpDir生成的數據中。

我查看了 JaCoCo 的來源,看看java.lang是否被明確忽略,到目前為止我沒有發現任何明顯的東西,但我對 JaCoCo 源代碼一點也不熟悉。

實際問題

可以做些什么來解決這個限制? 我正在考慮以下幾種可能性:

  • 這是 Java 的硬性限制,對此無能為力
  • java.lang 的排除在java.lang中是硬編碼的,因為它是系統 package 名稱,但這可以更改
    • 通過設置一些隱藏選項或環境變量
    • 通過提供它們的修改版本來覆蓋類路徑中的一些文件
    • 通過更改 JaCoCo 源代碼

編輯

我似乎並不是唯一一個嘗試做這種事情的人。

郵件列表線程:https://groups.google.com/g/jacoco/c/_tuoA7DHA7E/m/BQj53OvXoUsJ

GitHub 上的拉取請求: https://github.com/jacoco/jacoco/pull/49

在這中間的某個地方,有人提到

尤其是代理本身使用的 JDK 類可能無法被跟蹤。

所以它可以解釋為什么有些類沒有被檢測。

我做了更多的測試,我看到了

  • java.lang.Byte 沒有得到覆蓋
  • java.lang.ProcessBuilder 獲得覆蓋
  • java.util.ArrayList 沒有得到覆蓋
  • java.util.Calendar 得到覆蓋

因此,似乎無法以這種方式檢測代理加載時已經加載的類。

我提取了rt.jar中的所有類,並使用離線檢測對其進行檢測,然后將rt.jar替換為其檢測版本,並將 JaCoCo 代理包含在引導程序 ZA2F2ED4F8EBC2CBB14C21A29DC40 路徑中(使用 -XbootclassAB 路徑)

這樣做,我得到以下無限遞歸:

        ...
        at java.lang.System.getProperties(System.java)
        at org.jacoco.agent.rt.internal_f3994fa.Offline.getRuntimeData(Offline.java:36)
        at org.jacoco.agent.rt.internal_f3994fa.Offline.getProbes(Offline.java:60)
        at java.lang.System.$jacocoInit(System.java)
        at java.lang.System.getProperties(System.java)
        at org.jacoco.agent.rt.internal_f3994fa.Offline.getRuntimeData(Offline.java:36)

應該可以捕獲遞歸以防止這種情況發生,但這顯然需要對 JaCoCo 源代碼進行一些修改,因此目前無法檢測這些類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM