FastAPI 教程

12.7 测试覆盖率与 CI/CD 集成

FastAPI教程:测试覆盖率与CI/CD集成 - 从零开始实战指南

FastAPI 教程

本教程详细讲解如何在FastAPI项目中设置测试覆盖率,集成到CI/CD管道中。涵盖项目设置、测试编写、覆盖率报告生成,以及使用GitHub Actions等工具实现自动化,适合初学者快速上手。

推荐工具
PyCharm专业版开发必备

功能强大的Python IDE,提供智能代码补全、代码分析、调试和测试工具,提高Python开发效率。特别适合处理列表等数据结构的开发工作。

了解更多

FastAPI测试覆盖率与CI/CD集成指南

引言

在软件开发中,测试覆盖率和CI/CD(持续集成/持续部署)是确保代码质量和快速交付的关键。本教程将指导你如何在FastAPI项目中集成测试覆盖率报告到CI/CD工作流中,使你的应用更健壮且易于维护。

什么是测试覆盖率? 测试覆盖率衡量你的测试覆盖了多少代码逻辑,通常以百分比表示,帮助识别未测试的部分。

什么是CI/CD? CI/CD是一种自动化流程,用于频繁集成代码更改、运行测试,并自动部署到生产环境,提高开发效率。

为什么在FastAPI中集成? FastAPI作为现代Python框架,通过自动化测试和部署,可以确保API的可靠性并加速发布周期。

项目设置

首先,创建一个简单的FastAPI应用作为示例。我们将使用Python 3.8+和虚拟环境。

  1. 创建项目目录

    mkdir fastapi-ci-cd-tutorial
    cd fastapi-ci-cd-tutorial
    
  2. 初始化虚拟环境

    python -m venv venv
    source venv/bin/activate  # 在Windows上使用 venv\Scripts\activate
    
  3. 安装依赖

    pip install fastapi uvicorn pytest coverage
    
  4. 创建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

  1. 创建测试文件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"}
    
  2. 运行测试:在终端运行 pytest,确保测试通过。

生成覆盖率报告

我们将使用 coverage.py 来生成测试覆盖率报告。

  1. 运行覆盖率测试:在项目根目录运行:
    coverage run -m pytest
    

这会运行测试并收集覆盖率数据。

  1. 查看报告:生成HTML或终端报告:

    coverage report  # 显示终端报告
    coverage html    # 生成HTML报告,可在浏览器中查看
    
  2. 添加配置(可选):在项目根目录创建一个 .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文档,深入学习高级功能。


本教程旨在提供入门指南,可根据项目需求调整。如果有问题,请查看代码库或咨询社区。

开发工具推荐
Python开发者工具包

包含虚拟环境管理、代码格式化、依赖管理、测试框架等Python开发全流程工具,提高开发效率。特别适合处理复杂数据结构和算法。

获取工具包