Docker 教學 - .NET Core 測試報告 (Coverlet + ReportGenerator)

-- Pageviews

本篇將介紹如何透過 Coverlet + ReportGenerator 產生 .NET Core 的測試報告;
並用 Dockerfile 產生測試報告的 Docker Image,以網頁的形式查看程式碼覆蓋率。

Coverlet

dotnet cli 提供的 dotnet test 指令,並沒有支援測試覆蓋率,可透過第三方套件分析程式碼覆蓋率。
Coverlet 是一套支援 .NET Core 且跨平台的程式碼覆蓋率分析工具。

可透過 dotnet cli 的 dotnet tool 安裝,指令如下:

1
dotnet tool install --global coverlet.console

除了安裝 dotnet tool 外,測試專案也需要安裝 NuGet 套件 coverlet.msbuild,安裝指令:

1
dotnet add package coverlet.msbuild

安裝完成後,就可透過 dotnet test 指令,附帶參數執行程式碼覆蓋率分析:

1
2
3
4
dotnet test /p:CollectCoverage=true \
/p:CoverletOutputFormat=opencover \
/p:CoverletOutput=./coverage/ \
UnitTest.sln
  • CollectCoverage
    使否啟用程式碼覆蓋率分析。
    (預設為 false)
  • CoverletOutputFormat
    程式碼覆蓋率分析報告的格式。
    支援的格式有:jsonlcovopencovercoberturateamcity
    (預設為 json 格式)
  • CoverletOutput
    分析報告的輸出路徑。
    上例會在測試專案目錄下的 coverage 資料夾產生 coverage.opencover.xml 檔案。
    (預設為測試專案目錄)

dotnet test 程式碼覆蓋率分析完成會輸出如下畫面:

Docker 教學 - .NET Core 測試報告 - Coverlet 程式碼覆蓋率分析

ReportGenerator

上面步驟透過 Coverlet 產生的 coverage.opencover.xml 檔案並不適合閱讀,所以透過 ReportGenerator 這套工具,把 opencover 格式的測試報告轉換成 HTML,再透過瀏覽器打開,呈現圖形化介面報告。

ReportGenerator 支援多種測試報告格式轉換,官方資料:

輸入格式輸出格式
  • HTML, HTMLSummary, HTMLInline, HtmlInline_AzurePipelines, HtmlInline_AzurePipelines_Dark, HTMLChart, MHTML
  • Cobertura
  • SonarQube
  • XML, XMLSummary
  • Latex, LatexSummary
  • TextSummary
  • CsvSummary
  • PngChart
  • Badges
  • Custom reports


安裝方式一樣可透過 dotnet cli 的 dotnet tool 安裝,指令如下:

1
dotnet tool install --global dotnet-reportgenerator-globaltool

安裝完成後,就可透過 reportgenerator 指令,將測試報告格式轉換:

1
2
3
4
reportgenerator \
-reports:./coverage/coverage.opencover.xml \
-reporttypes:Html \
-targetdir:./coverage
  • reports
    要被轉換的測試報告來源檔案路徑。
  • reporttypes
    轉換輸出的格式。
    (預設為 Html)
  • targetdir
    轉換輸出的位置。

轉換完成就會生成一大堆的 HTML 檔案。如下:

Docker 教學 - .NET Core 測試報告 - ReportGenerator 檔案

用瀏覽器開啟 index.htm 就可以看到圖形化的測試報告進入點。

Dockerfile

build-unit-test.dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
FROM mcr.microsoft.com/dotnet/core/sdk:2.2 AS dotnet-test-env
RUN dotnet tool install --global coverlet.console && \
dotnet tool install --global dotnet-reportgenerator-globaltool
ENV PATH=$PATH:/root/.dotnet/tools/
WORKDIR /
COPY . .
RUN dotnet test \
/p:CollectCoverage=true \
/p:CoverletOutputFormat=opencover \
/p:CoverletOutput=/coverage/ \
UnitTest.sln
RUN reportgenerator -reports:/coverage/coverage.opencover.xml -targetdir:/coverage

FROM nginx:alpine
RUN rm /usr/share/nginx/html/index.html
COPY --from=dotnet-test-env /coverage /usr/share/nginx/html

Docker Image 建置指令:

1
docker build -f build-unit-test.dockerfile -t my-project-coverage .

以上 Dockerfile 共分為兩個階段:

  • 第一階段產生名稱為 dotnet-test-env 的暫存 Container
    1. 安裝 CoverletReportGenerator
    2. 把程式碼複製到 Container
    3. 執行程式碼覆蓋率分析
    4. 將測試報告轉換為 HTML 格式
  • 第二階段把 dotnet-test-env 的 /coverage 目錄內檔案,複製到 nginx 預設目錄內,打包成最終階段的 Docker Image。

建置完成後,就可以用 docker run 把測試報告的 Docker Image 執行起來了。
指令:

1
docker run -p 8080:80 my-project-coverage

用瀏覽器開啟 http://localhost:8080/ 就可以看到圖形化的測試報告了。

Docker 教學 - .NET Core 測試報告 - ReportGenerator 圖形化的測試報告

參考