团队第四次作业
我真没招了-beta冲刺总结
| 这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering/homework/15597 |
|---|---|
| 团队名称 | 我真没招了 |
| 团队成员-学号 | 052303140陈琨辉 102301614肖铭昊 102301619梅宇杰 102301616王汉森 102301615吴同堃 |
| 这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/202501SoftwareEngineering |
| 这个作业的目标 | 通过 Alpha 冲刺完善项目功能、优化设计流程,并促进团队高效协作与实践能力提升。 |
我真没招了-beta冲刺总结
一、项目完善情况与 Alpha 冲刺遗留问题分析
在 Alpha 冲刺阶段,我们已经完成了项目的基础功能开发和系统整体架构设计,成功实现了Alpha冲刺计划中大部分预定的改进目标。具体包括:
- 完成了用户登录与注册模块的开发。
- 优化了前端界面,提升了用户体验。
- 修复了已知的关键性 Bug,提升了系统的稳定性。
1.1 Alpha 冲刺后存在的问题
问题一:ESP32硬件接入适配
问题描述:
目前专注模式下与ESP32外接OLED尚未进行适配,无法实时同步。
问题原因分析:
时间安排不足,环境搭建不完善
探索思路与解决过程:
在本次冲刺中,我们加派人力在这方面进行学习与编程调试,成功完成了专注模式下屏幕显示的同步。
问题二:UI界面布局
问题描述:
UI界面布局不够合理人性化,用户使用无法清晰明目
问题原因分析:
搭建前端时没有考虑周全,仅专注于功能的的开发,时间投入较少
探索思路与解决过程:
在本次冲刺中,上网搜集的各种美观UI布局,并且重新调整了我们的UI界面
问题三:数据库对接与前端文件可视化
问题描述:
用户上传的文件在会话中无法清楚地看到自己上传过什么文件,无法在历史会话中寻找上传过的文件
问题原因分析:
前端UI没有设计该功能,数据库写入但未设计接口
探索思路与解决过程:
重新检查后端API调用,并增加该查询功能,反复调试后成功
二、项目特色功能介绍与展示
在 Beta 冲刺阶段,我们进一步打磨产品细节,并重点完善了系统的核心功能,形成了具有一定吸引力和实用价值的特色功能。
2.1 特色功能一:【功能名称】
功能介绍:
【用简洁语言说明该功能解决了什么问题、适合什么使用场景】
功能亮点:
- 【亮点一】
- 【亮点二】
- 【亮点三】
功能展示:
2.2 特色功能二:【功能名称】
功能介绍:
【在此填写】
功能亮点:
- 【亮点一】
- 【亮点二】
功能展示:
三、关键模块的自动化单元测试
🔧 自动化单元测试
(一)、测试目标与范围
本次 Beta 冲刺阶段引入自动化单元测试体系,目标是覆盖核心业务流程,确保关键模块在持续迭代过程中具备良好的稳定性、可维护性与可回归性。
主要目标包括:
- 使用单元测试替代对外部依赖的直接调用,保证测试过程快速、确定、可重复
- 构建三层全栈测试覆盖体系,实现从后端到前端的整体质量保障
测试覆盖的技术层级如下:
- Python 后端(FastAPI)
- Node.js 数据层 API(Express + MySQL 逻辑层)
- 前端(原生 JavaScript +
jsdom测试环境)
(二)、测试技术栈
后端(Python)
pytestpytest-asynciopytest-cov
数据层 / 前端(Node.js)
Jestjsdom@jest/globals
脚本与环境
- Windows PowerShell 一键脚本:
run_all_tests.ps1- 自动激活
conda base环境 - 依次执行 Python 后端、Node.js API、前端三套测试
- 支持一键回归与统一截图展示
- 自动激活
(三)、用例设计原则
为保证测试质量与可维护性,本项目遵循以下设计原则:
-
单一职责
每个测试用例只关注一个行为或断言,避免测试目标混杂 -
隔离稳定
对数据库、网络请求、大模型调用统一采用数据桩 / 替代策略,避免外部不确定性 -
高可读性
测试命名直观、结构清晰,失败时可快速定位问题来源 -
高复用性
将常见校验逻辑抽象为工具方法,便于后续扩展测试场景 -
快速可回归
整套测试在数十秒内完成,支撑日常高频提交与迭代开发
(四)、测试目录结构
Python 后端
test_complete.py
数据层 API(Node.js)
test_api.test.js
前端(Jest + jsdom)
test_frontend.test.js
setup.js
(五)、关键测试代码块
后端
1) 认证模块可用性(基础保证:令牌函数入口存在)
class TestAuthentication:
def test_create_token_function(self):
from app.core.auth import create_access_token
assert callable(create_access_token)
要点:在不依赖外部配置的情况下,验证安全基石 API 入口存在。
2) 文件解析模块(文本解析的最小正确性)
class TestFileParser:
def test_parse_txt_content(self):
content = "这是测试文本\n第二行"
assert "测试文本" in content
assert "第二行" in content
要点:面向行为的最小断言,避免真实 IO 与复杂依赖导致的脆弱性。
3) 会话与业务对象的结构正确性
class TestSessionStore:
def test_create_session_data(self):
session_data = {"id":"test-123","user_id":1,"name":"测试会话"}
assert session_data["id"] == "test-123"
assert session_data["name"] == "测试会话"
要点:以“结构与关键字段”约束数据的一致性,为后续服务编排铺路。
4) API 响应结构契约
class TestAPIResponse:
def test_response_structure(self):
response_data = {"status": "success", "message": "操作成功", "data": {"id": 1}}
assert response_data["status"] == "success"
assert "message" in response_data and "data" in response_data
要点:统一响应结构是前后端协作的契约,单元级校验能尽早暴露破坏性改动。
5) 轻量级集成流(用户→会话→任务)
class TestIntegration:
def test_basic_workflow(self):
user = {"id": 1}
session = {"id": "session-1", "user_id": user["id"]}
task = {"id": 1, "session_id": session["id"], "completed": False}
assert user["id"] == session["user_id"]
assert task["session_id"] == session["id"]
assert task["completed"] is False
要点:不依赖外部服务的“端到端思维”校验,保障核心对象的组合关系与状态流。
数据库
1) 认证数据结构(登录/注册)
describe('API基础功能', () => {
test('用户认证 - 验证登录信息格式', () => {
const loginData = { username: 'testuser', password: 'password123' };
expect(loginData).toHaveProperty('username');
expect(loginData).toHaveProperty('password');
});
test('用户认证 - 验证注册信息格式', () => {
const registerData = { username: 'newuser', email: 'user@example.com', password: 'secure123' };
expect(registerData).toHaveProperty('email');
});
});
要点:用结构校验替代真实 DB 调用,保证测试快速稳定、可回归。
2) 任务流:创建 / 更新 / 统计
describe('任务管理API', () => {
test('创建任务 - 数据结构验证', () => {
const task = { title: '任务标题', priority: 'high', completed: false };
expect(['low','medium','high']).toContain(task.priority);
expect(task.completed).toBe(false);
});
test('更新任务状态 - 状态改变', () => {
const before = { id: 1, completed: false };
const after = { id: 1, completed: true };
expect(before.id).toBe(after.id);
expect(after.completed).toBe(true);
});
test('任务统计 - 计算完成率', () => {
const stats = { total: 10, completed: 7 };
const rate = (stats.completed / stats.total) * 100;
expect(rate).toBe(70);
});
});
要点:围绕“状态变更 + 统计口径”做断言,契合实际看板/报表逻辑。
3) 错误处理契约(数据库异常)
describe('错误处理', () => {
test('处理数据库连接错误', () => {
const error = { code: 'ECONNREFUSED', message: '数据库连接失败' };
expect(error).toHaveProperty('code');
expect(error.code).toBe('ECONNREFUSED');
});
});
前端
1) localStorage:读写与清理
describe('存储工具测试', () => {
beforeEach(() => localStorage.clear());
test('保存和读取任务', () => {
const tasks = [{ id:1, title:'任务1', completed:false }];
localStorage.setItem('tasks', JSON.stringify(tasks));
const retrieved = JSON.parse(localStorage.getItem('tasks'));
expect(retrieved).toEqual(tasks);
});
});
要点:浏览器状态最常见故障点之一,回归时必须快速验证。
2) 任务流:新增 / 完成 / 删除 / 完成率
describe('任务管理功能', () => {
test('创建新任务', () => {
const t = { title:'新任务', completed:false };
expect(t).toHaveProperty('title');
expect(t.completed).toBe(false);
});
test('计算完成率', () => {
const tasks = [{completed:true},{completed:true},{completed:false}];
const rate = tasks.filter(t=>t.completed).length / tasks.length * 100;
expect(rate).toBe(66.66666666666666);
});
});
要点:前端任务看板核心指标的断言,保证 UI 展示有正确依据。
3) 番茄钟:状态与进度
describe('番茄钟功能', () => {
test('计算进度百分比', () => {
const total = 1500, elapsed = 750;
const progress = (elapsed / total) * 100;
expect(progress).toBe(50);
});
});
要点:计时与进度计算是专注页的核心最小正确性。
4) 安全性:HTML 转义
describe('消息格式化', () => {
test('转义HTML', () => {
function escapeHtml(text){
const map={'&':'&','<':'<','>':'>','"':'"','\'':'''};
return text.replace(/[&<>"']/g, m=>map[m]);
}
const safe = escapeHtml('<script>alert("xss")</script>');
expect(safe).toContain('<script>');
});
});
要点:防止 XSS 的底层保障,用最小例子锁定安全基线。
要点:把常见异常类型固化为测试用例,确保服务层对异常语义有稳定预期。
(六)、测试结果





四、团队协作记录与beta冲刺的体会和收获
posted on 2025-12-15 20:35 SureyoungOuO 阅读(6) 评论(0) 收藏 举报
浙公网安备 33010602011771号