開源專案核心程式碼單元測試 100% 覆蓋率實戰

花菜發表於2024-04-22

1、背景

最近發現之前開源個人自用的django-ninja腳手架專案,居然有了 30 個 star。

在這個專案上增加一些新的功能時,每次修改程式碼後,手動測試是挺麻煩的。

並且也不知道是否會影響到以前的功能,程式碼覆蓋率是多少。

image.png

因此決定加強該專案的單元測試,目標是 100% 覆蓋核心程式碼。
image.png

2、單元測試

單元測試框架就直接用 django 自帶的 TestClient,沒有額外使用 pytest。

之前有看過 pytest-django,但暫時用不到,就先放著。
覆蓋率統計直接參考 httprunner,使用了 coverage

下面開始實操

2.1 Codecov 配置

使用 github 登入
https://app.codecov.io/

登入後,就能看到 github 賬號下所有的倉庫了
image.png

點選需要配置的專案後面的 Configure
image.png

然後複製 CODECOV_TOKEN 對應的值,也就是打馬賽克的部分

image.png

然後取到 github 對應的倉庫,建立一個秘鑰,這個秘鑰是給接下來的 github action 用的
image.png

具體的程式碼在這裡
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 這個秘鑰) image.png

2.2 單元測試

在 django 中編寫單元測試非常簡單,只需匯入 Django.test 下面的 TestCase,繼承即可,詳細參考

https://github.com/lihuacai168/django-ninja-demo/blob/main/employee/tests.py
image.png

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

image.png

可以看到整體的覆蓋率是 96%,其他的檔案都 100% 覆蓋

utils/model_opertion.py 這個檔案覆蓋率只有 60%,點選進去之後,可以檢視到具體哪裡沒有被覆蓋

image.png

2.4 coverage 覆蓋配置

在實踐中,有些檔案不需要被覆蓋的,可以透過這樣配置

image.png

有些語句不需要覆蓋率的,使用# pragma: no cover就能標記為不需要覆蓋
image.png

2.5 CICD 自動執行單測並統計覆蓋率

因為我們在前面配置好了 github action,程式碼推送到遠端之後

單元測試會自動執行 (可在 action 中自行定義觸發條件),並且報告統計出來,傳送到 Codecov,非常的方便。

在尤其開源專案中,別人提交了 PR,我們就能根據單元測試的結果和覆蓋率,決定是否接受他的 PR
https://github.com/lihuacai168/django-ninja-demo/pull/12
image.png

也可以透過配置,直接在 README 引用覆蓋率結果,讓別人一眼就能出來當前專案的程式碼覆蓋率

image.png

2.6 Codecov 覆蓋率結果

在 codecov 中,覆蓋率的結果都會被統計出來,並且歷史記錄,非常方便溯源
image.png

3、總結

專案的單元測試經過整合 Github Ations + Coverage + TestClient + Codecov,測試流程也從手動走向自動化,大幅度提高了專案質量和可維護性。

目前整體 96%,只需要把 utils/model_opertion.py 的覆蓋率提升上來,就能完美實現 100% 覆蓋率,加油!

公眾號原文

相關文章