在我昨天的文章中介紹了如果對Teams bot做service level的測試,那到底要寫多少的測試代碼才算夠?如何才算測試到位了?這個時候我們就需要用”測試覆蓋率”來衡量,雖然覆蓋率高并不一定代表著就可以高枕無憂的以為我們軟件質量高了,但是測試覆蓋率是一個代碼質量的很好的信心指數。?
在傳統的ASP.NET下有很多的用來做測試代碼覆蓋率的工具和庫,在Core時代的工具選擇就更加多了,在我的LuckyDraw bot里,我使用了Scott Hanselman推薦的Coverlet。
用法也比較簡單,首先在csproj項目文件中添加此工具。當然也可以在你當前的開發機器里使用dotnet tool install -g <package id>
來全局安裝coverlet工具,但是我還是比較喜歡針對項目來安裝。
<Project Sdk="Microsoft.NET.Sdk">...<ItemGroup><PackageReference Include="coverlet.msbuild" Version="2.6.0"><IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets><PrivateAssets>all</PrivateAssets></PackageReference></ItemGroup>...
</Project>
然后我又在我的項目根目錄下運行:
dotnet test .\test\LuckyDrawBot.Tests\LuckyDrawBot.Tests.csproj /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=.\lcov.info
在所有測試用例都執行完后,coverlet就可以顯示出測試覆蓋率了。
可以看到LuckyDraw bot的覆蓋率有95%以上。這里面的三個指標的分別是: Line:代碼行的覆蓋率 Method:函數方法的覆蓋率 Branch:這個概念指執行路徑的覆蓋率,具體的含義可以看這里
另外,如果大家使用VS code的話,我推薦一個插件:Coverage Gutters. https://github.com/ryanluker/vscode-coverage-gutters coverlet搭配這個插件,就可以在VS Code里可視化你的代碼測試覆蓋率,如下圖:
綠色部分代表我的代碼已經被測試覆蓋到,紅色部分(62-64行,68-70行)還沒有覆蓋到,所以我應該在下個版本中增加更多的測試用來來覆蓋。