12.7 测试覆盖率与 CI/CD 集成
FastAPI教程:测试覆盖率与CI/CD集成 - 从零开始实战指南
本教程详细讲解如何在FastAPI项目中设置测试覆盖率,集成到CI/CD管道中。涵盖项目设置、测试编写、覆盖率报告生成,以及使用GitHub Actions等工具实现自动化,适合初学者快速上手。
FastAPI测试覆盖率与CI/CD集成指南
引言
在软件开发中,测试覆盖率和CI/CD(持续集成/持续部署)是确保代码质量和快速交付的关键。本教程将指导你如何在FastAPI项目中集成测试覆盖率报告到CI/CD工作流中,使你的应用更健壮且易于维护。
什么是测试覆盖率? 测试覆盖率衡量你的测试覆盖了多少代码逻辑,通常以百分比表示,帮助识别未测试的部分。
什么是CI/CD? CI/CD是一种自动化流程,用于频繁集成代码更改、运行测试,并自动部署到生产环境,提高开发效率。
为什么在FastAPI中集成? FastAPI作为现代Python框架,通过自动化测试和部署,可以确保API的可靠性并加速发布周期。
项目设置
首先,创建一个简单的FastAPI应用作为示例。我们将使用Python 3.8+和虚拟环境。
-
创建项目目录:
mkdir fastapi-ci-cd-tutorial cd fastapi-ci-cd-tutorial -
初始化虚拟环境:
python -m venv venv source venv/bin/activate # 在Windows上使用 venv\Scripts\activate -
安装依赖:
pip install fastapi uvicorn pytest coverage -
创建FastAPI应用:在项目根目录创建一个文件
main.py:from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.get("/items/{item_id}") async def read_item(item_id: int, q: str = None): return {"item_id": item_id, "q": q}
编写测试
我们将使用 pytest 来编写测试。在项目根目录创建一个 tests 文件夹和一个测试文件 test_main.py。
-
创建测试文件:
tests/test_main.py:from fastapi.testclient import TestClient from main import app client = TestClient(app) def test_read_root(): response = client.get("/") assert response.status_code == 200 assert response.json() == {"Hello": "World"} def test_read_item(): response = client.get("/items/5?q=test") assert response.status_code == 200 assert response.json() == {"item_id": 5, "q": "test"} -
运行测试:在终端运行
pytest,确保测试通过。
生成覆盖率报告
我们将使用 coverage.py 来生成测试覆盖率报告。
- 运行覆盖率测试:在项目根目录运行:
coverage run -m pytest
这会运行测试并收集覆盖率数据。
-
查看报告:生成HTML或终端报告:
coverage report # 显示终端报告 coverage html # 生成HTML报告,可在浏览器中查看 -
添加配置(可选):在项目根目录创建一个
.coveragerc文件来自定义覆盖率设置,例如排除某些目录。
集成到CI/CD
我们将以GitHub Actions为例,展示如何将测试覆盖率集成到CI/CD管道中。你也可以使用GitLab CI/CD或其他工具。
步骤1:创建GitHub Actions工作流
在项目根目录创建 .github/workflows/ci.yml 文件:
name: CI/CD Pipeline
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install fastapi uvicorn pytest coverage
- name: Run tests with coverage
run: |
coverage run -m pytest
coverage report # 输出覆盖率报告
coverage html # 可选:生成HTML报告
- name: Fail if coverage is low
run: |
# 示例:设置覆盖率阈值为80%,如果低于则失败
coverage report --fail-under=80
步骤2:推送代码到GitHub仓库
将项目推送到GitHub,GitHub Actions会自动运行工作流,检查测试覆盖率和测试结果。
步骤3:扩展为CD(可选)
要添加部署,可以在工作流中添加更多步骤,例如部署到云服务如Heroku或AWS。
最佳实践
- 保持测试简单:编写针对核心功能的单元测试和集成测试。
- 定期运行CI/CD:在每次代码提交时自动运行,及早发现问题。
- 监控覆盖率:设置合理的覆盖率目标(如80%),并持续改进。
- 使用环境变量:在CI/CD中管理敏感配置,如数据库连接。
结论
通过本教程,你学会了如何在FastAPI项目中设置测试覆盖率,并集成到CI/CD管道中。这有助于自动化测试和部署,提高代码质量和开发效率。继续实践和探索,优化你的工作流!
进阶资源:查阅FastAPI官方文档、pytest和GitHub Actions文档,深入学习高级功能。
本教程旨在提供入门指南,可根据项目需求调整。如果有问题,请查看代码库或咨询社区。