開源專案核心程式碼單元測試 100% 覆蓋率實戰
1、背景
最近發現之前開源個人自用的django-ninja腳手架專案,居然有了 30 個 star。
在這個專案上增加一些新的功能時,每次修改程式碼後,手動測試是挺麻煩的。
並且也不知道是否會影響到以前的功能,程式碼覆蓋率是多少。
因此決定加強該專案的單元測試,目標是 100% 覆蓋核心程式碼。
2、單元測試
單元測試框架就直接用 django 自帶的 TestClient,沒有額外使用 pytest。
之前有看過 pytest-django,但暫時用不到,就先放著。
覆蓋率統計直接參考 httprunner,使用了 coverage
下面開始實操
2.1 Codecov 配置
使用 github 登入
https://app.codecov.io/
登入後,就能看到 github 賬號下所有的倉庫了
點選需要配置的專案後面的 Configure
然後複製 CODECOV_TOKEN 對應的值,也就是打馬賽克的部分
然後取到 github 對應的倉庫,建立一個秘鑰,這個秘鑰是給接下來的 github action 用的
具體的程式碼在這裡
https://github.com/lihuacai168/django-ninja-demo/blob/main/.github/workflows/django-test.yml
簡單說一下這個 actions 的左右,跟 Jenkins 的流水線一樣,steps 就是定義步驟
大概步驟就是:
- 拉取程式碼
- 安裝 python 依賴
- 執行單元測試
- 生成 coverage xml 報告
- 上傳 coverage xml 報告到 Codecov(這一步需要用到 CODECOV_TOKEN 這個秘鑰)
2.2 單元測試
在 django 中編寫單元測試非常簡單,只需匯入 Django.test 下面的 TestCase,繼承即可,詳細參考
https://github.com/lihuacai168/django-ninja-demo/blob/main/employee/tests.py
2.3 本地執行單元測試
執行單測
# 首次執行需要安裝coverage,pip install coverage
$ coverage run --source='.' manage.py test
Found 11 test(s).
Creating test database for alias 'default'...
System check identified some issues:
.................
----------------------------------------------------------------------
Ran 11 tests in 2.574s
OK
Destroying test database for alias 'default'...
執行單測,生成 html 報告,並且在瀏覽器開啟
coverage run --source='.' manage.py test && coverage html && open htmlcov/index.html
可以看到整體的覆蓋率是 96%,其他的檔案都 100% 覆蓋
utils/model_opertion.py 這個檔案覆蓋率只有 60%,點選進去之後,可以檢視到具體哪裡沒有被覆蓋
2.4 coverage 覆蓋配置
在實踐中,有些檔案不需要被覆蓋的,可以透過這樣配置
有些語句不需要覆蓋率的,使用# pragma: no cover
就能標記為不需要覆蓋
2.5 CICD 自動執行單測並統計覆蓋率
因為我們在前面配置好了 github action,程式碼推送到遠端之後
單元測試會自動執行 (可在 action 中自行定義觸發條件),並且報告統計出來,傳送到 Codecov,非常的方便。
在尤其開源專案中,別人提交了 PR,我們就能根據單元測試的結果和覆蓋率,決定是否接受他的 PR
https://github.com/lihuacai168/django-ninja-demo/pull/12
也可以透過配置,直接在 README 引用覆蓋率結果,讓別人一眼就能出來當前專案的程式碼覆蓋率
2.6 Codecov 覆蓋率結果
在 codecov 中,覆蓋率的結果都會被統計出來,並且歷史記錄,非常方便溯源
3、總結
專案的單元測試經過整合 Github Ations + Coverage + TestClient + Codecov,測試流程也從手動走向自動化,大幅度提高了專案質量和可維護性。
目前整體 96%,只需要把 utils/model_opertion.py 的覆蓋率提升上來,就能完美實現 100% 覆蓋率,加油!
公眾號原文
相關文章
- 單元測試接入覆蓋率
- Mockito提升單元測試覆蓋率Mockito
- 程式碼覆蓋率與測試覆蓋率比較
- 基於Jacoco的單元測試程式碼覆蓋率統計
- C++語言的單元測試與程式碼覆蓋率C++
- James Shore:不要使用單元測試的程式碼覆蓋率
- 單元測試必備:Asp.Net Core程式碼覆蓋率實戰,打造可靠應用 !ASP.NET
- go 程式碼覆蓋率測試Go
- 單元測試的覆蓋率計算
- Linux下lcov單元測試覆蓋率Linux
- 測試開發之單元測試-實現Git增量程式碼的Jacoco覆蓋率統計Git
- iOS 覆蓋率檢測原理與增量程式碼測試覆蓋率工具實現iOS
- 從零開始做Vue前端架構(6)單元測試 & 程式碼覆蓋率Vue前端架構
- 從零入門專案整合Karate和Jacoco,配置測試程式碼覆蓋率
- 測試覆蓋率二改實現
- pHp程式碼覆蓋率PHP
- idea2022.1 檢視單測覆蓋率展示分支覆蓋率Idea
- 自動化會提高測試覆蓋率,那測試覆蓋率是什麼?
- 如何做程式碼單元壓力測試?【JWordPress前臺專案實戰】
- 程式碼重構與單元測試——測試專案(二)
- Jacoco--測試覆蓋率工具
- maven 多模組專案的測試覆蓋率分析 - jacoco 聚合分析Maven
- 圖資料庫 Nebula Graph 的程式碼變更測試覆蓋率實踐資料庫
- 精準測試與開源工具Jacoco的覆蓋率能力對比開源工具
- 測試覆蓋率 之 Cobertura的使用
- PouchContainer 整合測試覆蓋率統計AI
- 什麼是程式碼覆蓋率
- [lua][openresty]程式碼覆蓋率檢測的解決方式REST
- ReactNative 多端程式碼覆蓋率調研及實踐React
- JaCoCo計算程式碼覆蓋率原理
- 北大李戈團隊提出大模型單測生成新方法,顯著提升程式碼測試覆蓋率大模型
- 在做服務端程式碼覆蓋率或者準備做程式碼覆蓋率的兄弟們,來聊聊???服務端
- jacoco-1-java程式碼測試覆蓋率之本地環境初體驗Java
- Web端進行PHP程式碼函式覆蓋率測試的解決方案WebPHP函式
- 關於super-jacoco測試覆蓋率具體實現
- 前端精準測試探索:覆蓋率實時統計工具前端
- React單元測試實戰React
- 聊聊Go程式碼覆蓋率技術與最佳實踐Go