33、单元测试实战练习题

以下是三个练习题的具体实现方案,包含完整代码示例和详细说明:


练习题1:TDD实现博客评论功能

步骤1:编写失败测试

# tests/test_blog.py
import unittest
from blog import BlogPost, Comment, InvalidCommentErrorclass TestBlogSystem(unittest.TestCase):def test_create_comment(self):post = BlogPost(title="Python测试教程", content="...")comment = post.add_comment(user="开发者", text="非常实用!")self.assertIsInstance(comment, Comment)self.assertEqual(len(post.comments), 1)def test_comment_validation(self):post = BlogPost(title="TDD实践", content="...")with self.assertRaises(InvalidCommentError):post.add_comment(user="", text="空用户测试")def test_comment_display(self):post = BlogPost(title="测试驱动开发", content="...")post.add_comment(user="Alice", text="清晰易懂")self.assertIn("Alice: 清晰易懂", post.display_comments())

步骤2:实现最小功能

# blog.py
class InvalidCommentError(Exception):passclass Comment:def __init__(self, user, text):self.user = userself.text = textclass BlogPost:def __init__(self, title, content):self.title = titleself.content = contentself.comments = []def add_comment(self, user, text):if not user or not text:raise InvalidCommentError("用户和内容不能为空")comment = Comment(user, text)self.comments.append(comment)return commentdef display_comments(self):return "\n".join([f"{c.user}: {c.text}" for c in self.comments])

步骤3:运行测试

python -m unittest tests/test_blog.py -v

步骤4:重构优化

  • 添加评论时间戳功能
  • 实现评论分级嵌套
  • 添加敏感词过滤机制

练习题2:生成HTML测试报告

安装依赖

pip install pytest-html

配置测试命令

# 生成基础报告
pytest --html=report.html# 带附加信息的报告
pytest --html=detailed_report.html --self-contained-html \--metadata Project "博客系统" \--metadata Environment "测试环境"

示例报告配置类

# conftest.py
def pytest_configure(config):config._metadata["测试类型"] = "单元测试"config._metadata["Python版本"] = "3.9"def pytest_html_report_title(report):report.title = "博客系统测试报告"

高级配置(截取失败用例截图)

# conftest.py
@pytest.hookimpl(hookwrapper=True)
def pytest_runtest_makereport(item, call):outcome = yieldreport = outcome.get_result()if report.when == "call" and report.failed:html = "<div><img src='data:image/png;base64,...'/></div>"report.extra = [pytest_html.extras.html(html)]

练习题3:GitHub Actions每日构建

配置文件路径

.github/workflows/daily-build.yml

name: Daily Buildon:schedule:- cron: '0 0 * * *'  # 每天UTC时间0点运行workflow_dispatch:     # 允许手动触发jobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v3- name: Set up Pythonuses: actions/setup-python@v4with:python-version: '3.10'- name: Install dependenciesrun: |python -m pip install --upgrade pippip install -r requirements.txtpip install pytest pytest-html- name: Run testsrun: pytest --html=report.html --cov=src- name: Upload reportuses: actions/upload-artifact@v3with:name: test-reportpath: report.html- name: Codecov integrationuses: codecov/codecov-action@v3with:token: ${{ secrets.CODECOV_TOKEN }}

关键配置说明:

  1. 定时触发器:使用cron表达式控制执行频率

  2. 多Python版本支持:修改python-version矩阵

  3. 依赖缓存优化

    - name: Cache dependenciesuses: actions/cache@v3with:path: ~/.cache/pipkey: ${{ runner.os }}-pip-${{ hashFiles('requirements.txt') }}
    
  4. 邮件通知:添加失败通知配置

    - name: Send emailif: failure()uses: dawidd6/action-send-mail@v3with:server_address: smtp.example.comserver_port: 587username: ${{ secrets.MAIL_USERNAME }}password: ${{ secrets.MAIL_PASSWORD }}subject: 每日构建失败通知body: 测试用例执行失败,请及时处理!to: dev-team@example.com
    

验证实施效果

测试报告示例

<!-- report.html -->
<html><head><title>博客系统测试报告</title><style>/* 自动生成样式 */</style></head><body><h1>测试覆盖率 92%</h1><table><tr><th>模块</th><th>覆盖率</th></tr><tr><td>blog.py</td><td>100%</td></tr><tr><td>comment.py</td><td>85%</td></tr></table><h2>失败用例追踪</h2><div class="log">AssertionError: 预期8,实际得到9</div></body>
</html>

以上实现方案具有以下生产级特性:

  1. 错误追踪:在测试报告中直接显示失败代码上下文

  2. 环境隔离:使用虚拟环境保证测试纯净性

  3. 敏感信息保护:通过GitHub Secrets管理凭证

  4. 执行效率优化:并行测试执行配置

    strategy:matrix:python-version: ["3.8", "3.9", "3.10"]fail-fast: false
    

建议将代码分阶段实施,每个功能点完成后运行完整测试套件,确保系统稳定性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76110.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

16-算法打卡-哈希表-两个数组的交集-leetcode(349)-第十六天

1 题目地址 349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09;349. 两个数组的交集 - 给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a;输入&#xff1a;nu…

SciPy库详解

SciPy 是一个用于数学、科学和工程计算的 Python 库&#xff0c;它建立在 NumPy 之上&#xff0c;提供了许多高效的算法和工具&#xff0c;用于解决各种科学计算问题。 CONTENT 1. 数值积分功能代码 2. 优化问题求解功能代码3. 线性代数运算功能代码 4. 信号处理功能代码 5. 插…

杰弗里·辛顿:深度学习教父

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 杰弗里辛顿&#xff1a;当坚持遇见突破&#xff0c;AI迎来新纪元 一、人物简介 杰弗…

BladeX单点登录与若依框架集成实现

1. 概述 本文档详细介绍了将BladeX认证系统与若依(RuoYi)框架集成的完整实现过程。集成采用OAuth2.0授权码流程&#xff0c;使用户能够通过BladeX账号直接登录若依系统&#xff0c;实现无缝单点登录体验。 2. 系统架构 2.1 总体架构 #mermaid-svg-YxdmBwBtzGqZHMme {font-fa…

初识Redis · set和zset

目录 前言&#xff1a; set 基本命令 交集并集差集 内部编码和应用场景 zset 基本命令 交集并集差集 内部编码和应用场景 应用场景&#xff08;AI生成&#xff09; 排行榜系统 应用背景 设计思路 热榜系统 应用背景 设计思路 热度计算方式 总结对比表 前言&a…

playwright 教程高级篇:掌握网页自动化与验证码处理等关键技术详解

Playwright 教程高级篇:掌握网页自动化与验证码处理等关键技术详解 本教程将带您一步步学习如何使用 Playwright——一个强大的浏览器自动化工具,来完成网页任务,例如提交链接并处理旋转验证码。我们将按照典型的自动化流程顺序,从启动浏览器到关闭浏览器,详细讲解每个步骤…

数据结构(完)

树 二叉树 构建二叉树 int value;Node left;Node right;public Node(int val) {valueval;} 节点的添加 Node rootnull;public void insert(int num) {Node nodenew Node(num);if(rootnull) {rootnode;return;}Node index root;while(true) {//插入的节点值小if(index.value&g…

FastAPI与SQLAlchemy数据库集成与CRUD操作

title: FastAPI与SQLAlchemy数据库集成与CRUD操作 date: 2025/04/16 09:50:57 updated: 2025/04/16 09:50:57 author: cmdragon excerpt: FastAPI与SQLAlchemy集成基础包括环境准备、数据库连接配置和模型定义。CRUD操作通过数据访问层封装和路由层实现,确保线程安全和事务…

一个基于Django的写字楼管理系统实现方案

一个基于Django的写字楼管理系统实现方案 用户现在需要我用Django来编写一个写字楼管理系统的Web版本&#xff0c;要求包括增删改查写字楼的HTML页面&#xff0c;视频管理功能&#xff0c;本地化部署&#xff0c;以及人员权限管理&#xff0c;包含完整的代码结构和功能实现&am…

mongodb在window10中创建副本集的方法,以及node.js连接副本集的方法

创建Mongodb的副本集最好是新建一个文件夹&#xff0c;如D:/data&#xff0c;不要在mongodb安装文件夹里面创建副本集&#xff0c;虽然这样也可以&#xff0c;但是容易造成误操作或路径混乱&#xff1b;在新建文件夹里与现有 MongoDB 数据隔离&#xff0c;避免误操作影响原有数…

Maven 多仓库与镜像配置全攻略:从原理到企业级实践

Maven 多仓库与镜像配置全攻略&#xff1a;从原理到企业级实践 一、核心概念&#xff1a;Repository 与 Mirror 的本质差异 在 Maven 依赖管理体系中&#xff0c;repository与mirror是构建可靠依赖解析链的两大核心组件&#xff0c;其核心区别如下&#xff1a; 1. Repositor…

STM32 四足机器人常见问题汇总

文章不介绍具体参数&#xff0c;有需求可去网上搜索。 特别声明&#xff1a;不论年龄&#xff0c;不看学历。既然你对这个领域的东西感兴趣&#xff0c;就应该不断培养自己提出问题、思考问题、探索答案的能力。 提出问题&#xff1a;提出问题时&#xff0c;应说明是哪款产品&a…

MySQL 中 `${}` 和 `#{}` 占位符详解及面试高频考点

文章目录 一、概述二、#{} 和 ${} 的核心区别1. 底层机制代码示例 2. 核心区别总结 三、为什么表名只能用 ${}&#xff1f;1. 预编译机制的限制2. 动态表名的实现 四、安全性注意事项1. ${} 的风险场景2. 安全实践 五、面试高频考点1. 基础原理类问题**问题 1**&#xff1a;**问…

C语言编译预处理2

#include <XXXX.h>和#include <XXXX.c> #include "XXXX.h" 是 C 语言中一条预处理指令 #include <XXXX.h>&#xff1a;这种形式用于包含系统标准库的头文件。预处理器会在系统默认的头文件搜索路径中查找XXXX.h 文件。例如在 Linux 系统中&#…

Elasticvue-轻量级Elasticsearch可视化管理工具

Elasticvue一个免费且开源的 Elasticsearch 在线可视化客户端&#xff0c;用于管理 Elasticsearch 集群中的数据&#xff0c;完全支持 Elasticsearch 版本 8.x 和 7.x. 功能特色&#xff1a; 集群概览索引和别名管理分片管理搜索和编辑文档REST 查询快照和存储库管理支持国际…

Git提交规范及最佳实践

Git 提交规范通常是为了提高代码提交的可读性、可维护性和自动化效率&#xff08;如生成 ChangeLog&#xff09;。以下是常见的 Conventional Commits 规范&#xff0c;结合社区最佳实践总结而成&#xff1a; 1. 提交格式 每次提交的 commit message 应包含三部分&#xff1a;…

Ubuntu中snap

通过Snap可以安装众多的软件包。需要注意的是&#xff0c;snap是一种全新的软件包管理方式&#xff0c;它类似一个容器拥有一个应用程序所有的文件和库&#xff0c;各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题&#xff0c;使应用程序之…

android studio 运行java main报错

运行某个带main函数的java文件报错 Could not create task :app:Test.main(). > SourceSet with name main not found. 解决办法&#xff1a;在工程的.idea/gradle.xml 文件下添加&#xff1a; <option name"delegatedBuild" value"false" /&g…

openssh离线一键升级脚本分享(含安装包)

查看当前的版本 [rootmyoracle ~]#ssh -V相关安装包下载地址 openssh下载地址&#xff1a;http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssl下载地址&#xff1a;https://www.openssl.org/source/zlib下载地址&#xff1a;http://www.zlib.net/今天演示从7.4升级…

Mac M1管理多个Node.js版本

目录 1. 使用 nvm (Node Version Manager) 1.1.安装 nvm 1.2.安装Node.js版本 1.3.查看已安装的node版本列表 1.4.使用特定版本的Node.js 1.5.查看当前使用的版本 2. 使用 fnm (Fast Node Manager) 2.1.安装 fnm 2.2.安装Node.js版本 2.3.查看已安装的版本 2.4.使用…