背景
當(dāng)存量代碼較多時(shí)屁商,項(xiàng)目單元測試整體覆蓋率就會(huì)偏低烟很,但這可能是正常現(xiàn)象,因此不能依據(jù)已有的全量單元測試覆蓋率來判斷項(xiàng)目質(zhì)量溯职。
基于這個(gè)背景精盅,我們需要統(tǒng)計(jì)增量代碼覆蓋率作為項(xiàng)目質(zhì)量的參考指標(biāo)之一,并集成到 DevOps 平臺(tái)谜酒。
方案
1叹俏、先通過 git diff 統(tǒng)計(jì)代碼差異,根據(jù)差異代碼選擇運(yùn)行單元測試案例僻族,最后得到差異覆蓋率報(bào)告
2粘驰、先運(yùn)行全量單元測試案例來生成整體覆蓋率報(bào)告,然后通過 git diff 統(tǒng)計(jì)差異代碼述么,最后根據(jù)整體覆蓋率報(bào)告和差異代碼來形成差異覆蓋率報(bào)告
通過比較方案 2 侵入性小蝌数,擴(kuò)展好,能方便支持多種 java 覆蓋率工具度秘,還能支持 python 顶伞、js 等覆蓋率工具,下面簡單例子介紹下實(shí)現(xiàn)方案 2 的開源工具 diff-cover
diff-cover 介紹
diff-cover 用 python 開發(fā)的開源工具剑梳,github 地址是 https://github.com/Bachmann1234/diff-cover唆貌。它不僅能實(shí)現(xiàn)增量代碼單元測試覆蓋率統(tǒng)計(jì),還能實(shí)現(xiàn)增量代碼質(zhì)量檢查垢乙。
支持單元測試覆蓋率工具或報(bào)告格式有:Cobertura锨咙、JaCoCo、JSCover追逮、coverage.py酪刀、nosetests、JSCover 等钮孵。
支持代碼檢查工具或報(bào)告格式有:pycodestyle, pyflakes, flake8, pylint, checkstyle, checkstylexml骂倘、 findbugs。
鑒于公司用 Cobertura 生成單元測試覆蓋率油猫,因此 diff-cover 可以容易集成到 DevOps 平臺(tái)稠茂。缺點(diǎn)是由于代碼質(zhì)量檢查用的是 pmd 工具,可能 diff-cover 還不支持情妖,
diff-cover 安裝和使用
1睬关、首先安裝 python 環(huán)境,網(wǎng)上一堆毡证,請 google
2电爹、輸入如下命令安裝 diff-cover
pip install diff_cover
3、新建 git 項(xiàng)目 DiffDemo
- 新建遠(yuǎn)程倉庫 DiffDemo
- 克隆代碼
git clone https://github.com/scottlinlin/DiffDemo
cd DiffDemo
4料睛、新建 maven 工程
- 打開 idea 新建一個(gè) maven 工程 DiffDemo丐箩,工程路徑是 DiffDemo
- 新建 Math 類摇邦,實(shí)現(xiàn)兩個(gè)數(shù)相乘的簡單功能
- 新建 MathTest 類,使用 junit4 實(shí)現(xiàn)相乘的單元測試
- git add & git commit 添加到本地倉庫
- git push 推送到遠(yuǎn)程倉庫屎勘,此時(shí)遠(yuǎn)程和本地倉庫代碼一致
- 然后本地運(yùn)行 mvn cobertura:cobertura,生成覆蓋報(bào)告路徑是 ./target/site/cobertura/coverage.xml施籍,此時(shí)覆蓋率100%
- 運(yùn)行 diff-cover,
diff-cover target/site/cobertura/coverage.xml --compare-branch=origin/master
-
結(jié)果應(yīng)該為空概漱,即沒有新增代碼也沒有差異覆蓋率
scott.lin
diff-cover 參數(shù)說明
第一個(gè)參數(shù)是覆蓋率報(bào)告文件丑慎,也可以填寫多個(gè)文件
第二個(gè)參數(shù)是比較 git 分支 或 commit id,上訴比較是 origin/master 和 HEAD之間代碼差異瓤摧,origin/master 是遠(yuǎn)程 master 分支竿裂,HEAD 當(dāng)前分支即指向本地 Master 最新提交
5、新增代碼照弥,統(tǒng)計(jì)差異覆蓋率
- Math 類新增除腻异、平方功能代碼
- 本地運(yùn)行 mvn cobertura:cobertura,生成覆蓋報(bào)告
- 運(yùn)行 diff-cover,
diff-cover target/site/cobertura/coverage.xml --compare-branch=origin/master --html-report report.html
-
輸出差異覆蓋率報(bào)告这揣,即新增除和平臺(tái)代碼覆蓋率為0悔常,如下:
scott.lin
6、demo 地址
https://github.com/scottlinlin/DiffDemo
展望
- 將 diff-cover 集成到目前 DevOps 平臺(tái)曾沈,并將增量覆蓋率作為項(xiàng)目質(zhì)量的一個(gè)重要指標(biāo)
- 繼續(xù) poc diff-cover 的代碼質(zhì)量檢查命令 diff-quality 这嚣,看能否支持 pmd 生成的質(zhì)量報(bào)告
- 集成 pylint pytest 等 python 工具鸥昏,用 diff-cover 實(shí)現(xiàn)增量代碼檢查