首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >十五天Python系统学习教程第十四天

十五天Python系统学习教程第十四天

作者头像
紫风
发布2025-10-14 18:10:09
发布2025-10-14 18:10:09
1200
代码可运行
举报
运行总次数:0
代码可运行
📅 Day 14 详细学习计划:Python自动化测试与持续集成

学习目标 ✅ 掌握Python测试框架(对比Java的JUnit/Mockito) ✅ 实现单元测试、集成测试与端到端测试 ✅ 集成测试覆盖率与持续化工具 ✅ 完成博客系统全链路测试实战


一、测试框架核心对比(Java vs Python)

功能

Java

Python

核心差异

单元测试框架

JUnit 5

unittest/pytest

pytest语法更简洁

Mock框架

Mockito

unittest.mock/pytest-mock

Python的Mock更灵活

测试覆盖率

JaCoCo

coverage

使用方式类似

端到端测试

Selenium

selenium + pytest

接口一致

持续集成

Jenkins + Maven插件

GitHub Actions + pytest

配置更简单


二、单元测试与Mock技术(1.5小时)
2.1 基础单元测试(对比JUnit)
代码语言:javascript
代码运行次数:0
运行
复制
# test_calculator.py(类似Java的Test Class)  
import unittest  

def add(a, b):  
    return a + b  

class TestCalculator(unittest.TestCase):  
    def test_add_positive(self):  
        self.assertEqual(add(2, 3), 5)  # 类似JUnit的assertEquals  

    def test_add_negative(self):  
        self.assertEqual(add(-1, -1), -2)  

if __name__ == "__main__":  
    unittest.main()  
2.2 Mock外部依赖(对比Mockito)
代码语言:javascript
代码运行次数:0
运行
复制
from unittest.mock import Mock  

# 模拟数据库查询(类似Mockito.when)  
def test_user_query(mocker):  
    mock_db = Mock()  
    mock_db.execute.return_value = [("Alice", 30)]  

    user_service = UserService(mock_db)  
    result = user_service.get_user(1)  

    assert result.name == "Alice"  
    mock_db.execute.assert_called_once_with("SELECT * FROM users WHERE id=1")  

三、集成测试与API测试(1.5小时)
3.1 Flask应用测试(对比Spring Boot Test)
代码语言:javascript
代码运行次数:0
运行
复制
import pytest  
from app import create_app, db  

@pytest.fixture  
def client():  
    app = create_app(testing=True)  
    with app.test_client() as client:  
        with app.app_context():  
            db.create_all()  
        yield client  
        with app.app_context():  
            db.drop_all()  

def test_create_post(client):  
    response = client.post("/posts", json={"title": "Test", "content": "Hello"})  
    assert response.status_code == 201  
    assert "id" in response.json  
3.2 使用requests测试REST API
代码语言:javascript
代码运行次数:0
运行
复制
def test_api_posts():  
    response = requests.get("http://localhost:5000/api/posts")  
    assert response.status_code == 200  
    assert isinstance(response.json(), list)  

四、测试覆盖率与质量报告(1小时)
4.1 覆盖率分析(对比JaCoCo)
代码语言:javascript
代码运行次数:0
运行
复制
# 安装工具  
pip install coverage  

# 运行测试并生成报告  
coverage run -m pytest tests/  
coverage html  # 生成HTML报告  

报告示例

复制

代码语言:javascript
代码运行次数:0
运行
复制
Name               Stmts   Miss  Cover  
-------------------------------------  
app/__init__.py       12      0   100%  
app/models.py         20      1    95%  
4.2 代码质量扫描(对比SonarQube)
代码语言:javascript
代码运行次数:0
运行
复制
# 使用pylint进行静态分析  
pip install pylint  
pylint app/  

# 使用bandit检查安全漏洞  
pip install bandit  
bandit -r app/  

五、实战项目:博客系统全链路测试(2小时)
5.1 测试策略设计
  • 单元测试:模型方法、工具函数(覆盖率>80%)
  • 集成测试:数据库操作、API端点(模拟外部服务)
  • 端到端测试:浏览器自动化(用户注册-发文-删除全流程)
5.2 核心测试代码

模型层测试(使用SQLite内存数据库)

代码语言:javascript
代码运行次数:0
运行
复制
def test_post_model(session):  
    post = Post(title="Test", content="Content")  
    session.add(post)  
    session.commit()  
    assert post.id is not None  
    assert Post.query.count() == 1 

API测试(JSON Schema验证)

代码语言:javascript
代码运行次数:0
运行
复制
from jsonschema import validate  

post_schema = {  
    "type": "object",  
    "properties": {  
        "id": {"type": "number"},  
        "title": {"type": "string"}  
    },  
    "required": ["id", "title"]  
}  

def test_get_post(client):  
    response = client.get("/api/posts/1")  
    validate(response.json(), post_schema)  

端到端测试(Selenium)

代码语言:javascript
代码运行次数:0
运行
复制
from selenium.webdriver import Chrome  

def test_user_flow():  
    driver = Chrome()  
    driver.get("http://localhost:5000/register")  
    driver.find_element("name", "username").send_keys("testuser")  
    driver.find_element("name", "password").send_keys("secret123")  
    driver.find_element("tag name", "button").click()  
    assert "Welcome" in driver.page_source  
    driver.quit()  

六、持续集成配置(1小时)
6.1 GitHub Actions配置(对比Jenkinsfile)
代码语言:javascript
代码运行次数:0
运行
复制
# .github/workflows/test.yml  
name: Python CI  

on: [push]  

jobs:  
  test:  
    runs-on: ubuntu-latest  
    steps:  
    - uses: actions/checkout@v4  
    - name: Set up Python  
      uses: actions/setup-python@v4  
      with:  
        python-version: "3.10"  
    - run: pip install -r requirements.txt  
    - run: pytest --cov=app tests/  
    - name: Upload coverage  
      uses: codecov/codecov-action@v3  
6.2 钉钉通知集成
代码语言:javascript
代码运行次数:0
运行
复制
- name: Notify DingTalk  
  uses: nicolasnoble/dingtalk-action@v1  
  with:  
    access_token: ${{ secrets.DINGTALK_TOKEN }}  
    msgtype: markdown  
    content: |  
      ## 测试结果  
      - 覆盖率: ${{ coverage }}%  
      - 通过率: ${{ success }}  

七、Java开发者注意事项

测试固件差异

  • Python使用setUp/tearDown(类似JUnit 4)
  • pytestfixture更灵活(类似JUnit 5扩展模型)

异步测试处理

代码语言:javascript
代码运行次数:0
运行
复制
@pytest.mark.asyncio  
async def test_async_api():  
    async with AsyncClient() as client:  
        response = await client.get("/async")  
        assert response.status_code == 200  

测试环境隔离

  • 使用pytestmonkeypatch修改环境变量
代码语言:javascript
代码运行次数:0
运行
复制
def test_config(monkeypatch):  
    monkeypatch.setenv("DB_URI", "sqlite:///:memory:")  
    assert get_config().db_uri == "sqlite:///:memory:"  

八、扩展练习

参数化测试(类似JUnit的@ParameterizedTest)

代码语言:javascript
代码运行次数:0
运行
复制
@pytest.mark.parametrize("a,b,expected", [  
    (1, 2, 3),  
    (-1, 1, 0)  
])  
def test_add(a, b, expected):  
    assert add(a, b) == expected  

测试驱动开发(TDD)实战

  • 先编写失败测试
  • 实现功能代码使其通过
  • 重构优化

性能基准测试

代码语言:javascript
代码运行次数:0
运行
复制
def test_api_performance(benchmark):  
    result = benchmark(requests.get, "http://api/posts")  
    assert result.status_code == 200  

通过第十四天学习,您将掌握: 1️⃣ Python测试生态的核心工具链 2️⃣ 分层测试策略设计与实施 3️⃣ 生产级持续集成流水线搭建 4️⃣ 从单元测试到端到端测试的完整解决方案

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 📅 Day 14 详细学习计划:Python自动化测试与持续集成
  • 一、测试框架核心对比(Java vs Python)
  • 二、单元测试与Mock技术(1.5小时)
    • 2.1 基础单元测试(对比JUnit)
    • 2.2 Mock外部依赖(对比Mockito)
  • 三、集成测试与API测试(1.5小时)
    • 3.1 Flask应用测试(对比Spring Boot Test)
    • 3.2 使用requests测试REST API
  • 四、测试覆盖率与质量报告(1小时)
    • 4.1 覆盖率分析(对比JaCoCo)
    • 4.2 代码质量扫描(对比SonarQube)
  • 五、实战项目:博客系统全链路测试(2小时)
    • 5.1 测试策略设计
    • 5.2 核心测试代码
  • 六、持续集成配置(1小时)
    • 6.1 GitHub Actions配置(对比Jenkinsfile)
    • 6.2 钉钉通知集成
  • 七、Java开发者注意事项
  • 八、扩展练习
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档