团队第四次作业

我真没招了-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)

  • pytest
  • pytest-asyncio
  • pytest-cov

数据层 / 前端(Node.js)

  • Jest
  • jsdom
  • @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={'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;','\'':'&#039;'};
      return text.replace(/[&<>"']/g, m=>map[m]);
    }
    const safe = escapeHtml('<script>alert("xss")</script>');
    expect(safe).toContain('&lt;script&gt;');
  });
});

要点:防止 XSS 的底层保障,用最小例子锁定安全基线。


要点:把常见异常类型固化为测试用例,确保服务层对异常语义有稳定预期。

(六)、测试结果

图片5

图片4

图片3

图片2

图片1

四、团队协作记录与beta冲刺的体会和收获

posted on 2025-12-15 20:35  SureyoungOuO  阅读(6)  评论(0)    收藏  举报

导航