编辑
2024-04-22
测试平台
00

目录

1、背景
2、单元测试
2.1 Codecov配置
2.2 单元测试
2.3 本地执行单元测试
2.4 coverage覆盖配置
2.5 CICD自动执行单测并统计覆盖率
2.6 Codecov覆盖率结果
3、总结

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 本地执行单元测试

执行单测

shell
# 首次执行需要安装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报告,并且在浏览器打开

shell
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%覆盖率,加油!

本文作者:花菜

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!