小小小仙贝

Loading...
BihuangChen  
这个作业属于哪个课程 首页 - 软件工程2024 - 福州大学 - 班级博客 - 博客园 (cnblogs.com)
这个作业要求在哪里 2024秋软件工程结对作业(第二次之程序实现) - 作业 - 软件工程2024 - 班级博客 - 博客园 (cnblogs.com)
这个作业的目标 站在程序员的角度,给出第一次结对作业原型设计核心模块的编码的原型。
学号 102201225(本人) 102201218(队友)

一、Github仓库地址

https://github.com/cbhhhhhh/102201225-102201218.git

小程序二维码

因其具有一定的时效性,所以如果你想c要预览的话可以qq上联系我们(陈碧煌:1648652772,肖晗涵:1437326006)

二、博客链接及具体分工

学号 姓名 作业博客链接 具体分工
102201225 陈碧煌 https://www.cnblogs.com/BihuangChen/p/18457478 前端开发,后端微信云开发,实现前后端可交互
102201218 肖晗涵 https://www.cnblogs.com/wudaohuanyu/p/18457198 后端开发、单元测试、博客撰写

三、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(小时) 实际耗时(小时)
Planning 计划 2.5 3
· Estimate · 估计这个任务需要多少时间 2.5 3
Development 开发 76.5 81
· Analysis · 需求分析 (包括学习新技术) 5 5
· Design Spec · 生成设计文档 1 2
· Design Review · 设计复审 1 1
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 1 1
· Design · 具体设计 2 3
· Coding · 具体编码 60 62
· Code Review · 代码复审 1.5 2
· Test · 测试(自我测试,修改代码,提交修改) 5 5
Reporting 报告 6.5 8
· Test Repor · 测试报告 5 6.5
· Size Measurement · 计算工作量 0.5 0.5
· Postmortem&Process Improvement Plan · 事后总结, 并提出过程改进计划 1 1
· 合计 85.5 92

四、解题思路描述及设计实现说明

(一)代码实现思路

在本次项目中,用户不仅可以发布项目、参与他人的项目,还可以对“我的项目”进行管理,同时能够进行好友添加与聊天,可实现加入对方项目

选择使用微信云开发小程序架构:前端页面使用 WXML 和 WXSS 创建页面布局和样式,JavaScript 处理用户交互和逻辑。利用云函数处理登录、注册、更新用户信息等服务端逻辑,直接与云数据库进行交互。

功能模块:

用户注册:使用学号和密码注册新用户,密码采用加密技术进行处理。
用户登录:通过微信 openID 标识用户,获取用户上下文并验证身份。
用户信息更新:用户可以在个人中心更新个人信息。
项目合作:用户可以在平台上发布、参与跨专业项目合作;
进行项目搜索和筛选;查看个人项目,并进行删除和修改。
沟通交流:在聊天页面进行用户间实时沟通。

(二)关键实现流程图

(三)有价值的代码片段及解释

1. 用户注册

// cloudfunctions/registerUser/index.js
exports.main = async (event, context) => {
  const {
    student_id,
    password,
    // 其他字段
  } = event;

  try {
    // 获取 OpenID
    const wxContext = cloud.getWXContext();
    const openid = wxContext.OPENID;

    if (!openid) {
      return {
        success: false,
        message: '无法获取用户身份信息'
      };
    }

    // 检查用户是否已存在
    const userCheck = await usersCollection.where({ student_id }).get();

    if (userCheck.data.length > 0) {
      return {
        success: false,
        message: '用户已存在'
      };
    }

    // 对密码进行加密
    const salt = bcrypt.genSaltSync(10);
    const hashedPassword = bcrypt.hashSync(password, salt);

    // 插入新用户
    const result = await usersCollection.add({
      data: {
        student_id,
        password: hashedPassword, // 存储加密后的密码
        openid,
        // 其他字段可以在个人信息完善时添加
        createdAt: db.serverDate(),
        updatedAt: db.serverDate()
      }
    });

    // 获取创建后的用户信息
    const newUser = await usersCollection.doc(result._id).get();
    const userData = newUser.data;

    // 移除密码字段
    delete userData.password;

    return {
      success: true,
      message: '注册成功',
      user: userData
    };
  } catch (err) {
    console.error('注册失败:', err);
    return {
      success: false,
      message: '注册失败',
      error: err.toString()
    };
  }
};
  • 获取用户输入:从前端传递的 student_id 和 password 中提取用户注册信息。
  • 获取 OpenID:通过 cloud.getWXContext() 获取用户的 OpenID,用于后续身份标识。
  • 检查用户是否已存在:在云数据库中查找是否已经存在同样的 student_id,若存在则返回提示“用户已存在”。
  • 密码加密:使用 bcrypt 库对用户输入的密码进行加密,确保数据库中存储的密码是加密形式。
  • 存储用户信息:将加密后的密码、OpenID、学生 ID 以及创建和更新的时间等信息存储到云数据库中。
  • 返回用户信息:成功注册后,获取刚刚创建的用户信息,并返回给前端,移除返回数据中的密码字段。

2.用户登录

// cloudfunctions/loginUser/index.js
exports.main = async (event, context) => {
  const { student_id, password } = event;

  try {
    // 根据 student_id 查找用户
    const userResult = await usersCollection.where({ student_id }).get();

    if (userResult.data.length === 0) {
      return {
        success: false,
        message: '用户不存在'
      };
    }

    const user = userResult.data[0];

    // 比较密码
    const passwordMatch = bcrypt.compareSync(password, user.password);

    if (!passwordMatch) {
      return {
        success: false,
        message: '密码错误'
      };
    }

    // 从用户数据中排除密码
    const { password: pwd, ...userData } = user;

    // 确保 userData 中包含 openid
    if (!userData.openid) {
      const wxContext = cloud.getWXContext();
      userData.openid = wxContext.OPENID;
      // 更新数据库中的 openid
      await usersCollection.doc(user._id).update({
        data: {
          openid: wxContext.OPENID
        }
      });
    }

    return {
      success: true,
      message: '登录成功',
      user: userData
      // 不再返回 token
    };
  } catch (err) {
    console.error('登录失败:', err);
    return {
      success: false,
      message: '登录失败',
      error: err.toString()
    };
  }
};
  • 获取用户输入:从前端获取 student_id 和 password。
  • 查找用户信息:根据 student_id 在云数据库中查找对应的用户信息,若找不到则提示“用户不存在”。
  • 密码验证:使用 bcrypt.compareSync 对比用户输入的密码与数据库中存储的加密密码,验证是否匹配。若不匹配则提示“密码错误”。
  • 返回用户信息:若密码匹配,获取用户数据,并从返回的数据中移除密码字段。如果用户数据中没有 openid,则从微信上下文中获取并更新数据库。
  • 返回登录结果:返回用户信息以及登录成功提示。

3.项目发布

// pages/CreateProject/CreateProject.js
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    // 可以在这里初始化数据或获取传递的参数
  },

  // 项目名称输入
  onProjectNameInput(e) {
    this.setData({
      projectName: e.detail.value,
    });
  },

  // 项目类型选择
  onProjectTypeChange(e) {
    const index = e.detail.value;
    this.setData({
      selectedProjectType: this.data.projectTypes[index],
    });
  },

  // 显示关键词输入框
  showAddKeyword() {
    this.setData({
      showKeywordInput: true,
      newKeyword: '',
    });
  },

  // 关键词输入
  onNewKeywordInput(e) {
    this.setData({
      newKeyword: e.detail.value,
    });
  },

  // 添加关键词
  addKeyword() {
    const { newKeyword, keywords, maxKeywords } = this.data;
    const trimmedKeyword = newKeyword.trim();

    if (!trimmedKeyword) {
      wx.showToast({
        title: '关键词不能为空',
        icon: 'none',
      });
      return;
    }

    if (keywords.length >= maxKeywords) {
      wx.showToast({
        title: `最多添加${maxKeywords}个关键词`,
        icon: 'none',
      });
      return;
    }

    if (keywords.includes(trimmedKeyword)) {
      wx.showToast({
        title: '关键词已存在',
        icon: 'none',
      });
      return;
    }

    this.setData({
      keywords: [...keywords, trimmedKeyword],
      showKeywordInput: false,
      newKeyword: '',
    });
  },

  // 取消添加关键词
  cancelAddKeyword() {
    this.setData({
      showKeywordInput: false,
      newKeyword: '',
    });
  },

  // 人才数量输入
  onTalentNumberInput(e) {
    let inputVal = e.detail.value;

    // 使用正则表达式移除所有非数字字符(虽然 type="digit" 已限制,但为了保险)
    inputVal = inputVal.replace(/\D/g, '');

    // 可选:限制最大值,例如 99999
    const maxVal = 99999;
    if (inputVal) {
      let num = parseInt(inputVal, 10);
      if (isNaN(num)) {
        num = '';
      } else if (num > maxVal) {
        num = maxVal;
        wx.showToast({
          title: `人才数量不能超过${maxVal}`,
          icon: 'none',
        });
      }
      inputVal = num.toString();
    }

    this.setData({
      talentNumber: inputVal,
    });
  },

  // 项目描述输入
  onProjectDescriptionInput(e) {
    this.setData({
      projectDescription: e.detail.value,
    });
  },

  // 点击取消按钮
  onCancel() {
    // 返回上一页
    wx.navigateBack();
  },

  // 点击创建按钮
  onSubmit() {
    // 表单验证
    if (!this.data.projectName) {
      wx.showToast({
        title: '请输入项目名称',
        icon: 'none',
      });
      return;
    }
    if (!this.data.selectedProjectType) {
      wx.showToast({
        title: '请选择项目类型',
        icon: 'none',
      });
      return;
    }
    if (!this.data.talentNumber || parseInt(this.data.talentNumber, 10) <= 0) {
      wx.showToast({
        title: '请输入有效的人才数量',
        icon: 'none',
      });
      return;
    }
    if (!this.data.projectDescription) {
      wx.showToast({
        title: '请输入项目描述',
        icon: 'none',
      });
      return;
    }
    if (!this.data.imageUrl) {
      wx.showToast({
        title: '请上传项目展示图片',
        icon: 'none',
      });
      return;
    }

    // 获取应用实例
    const app = getApp();
    const openid = app.globalData.userProfile.openid;

    if (!openid) {
      wx.showToast({
        title: '用户未登录',
        icon: 'none',
      });
      return;
    }

    // 提交表单数据
    const projectData = {
      name: this.data.projectName,
      category: this.data.selectedProjectType,
      tags: this.data.keywords, // 直接使用数组
      talentNumber: parseInt(this.data.talentNumber, 10), // 确保为数字
      description: this.data.projectDescription,
      imageUrl: this.data.imageUrl, // 使用上传后的图片URL
      createdAt: new Date().toISOString(), // 添加创建时间
      openid: openid // 关联项目创建者
    };

    const db = wx.cloud.database();
    const projectsCollection = db.collection('projects');

    // 添加到云数据库
    wx.showLoading({
      title: '创建中...',
    });
    projectsCollection.add({
      data: projectData
    }).then(res => {
      wx.hideLoading();
      wx.showToast({
        title: '项目创建成功',
        icon: 'success',
        duration: 2000,
      });

      // 添加到全局数据
      const newProject = {
        ...projectData,
        _id: res._id // 使用云数据库的 _id 作为项目 ID
      };
      app.globalData.myProjects.unshift(newProject);
      app.globalData.allProjects.unshift(newProject);

      // 跳转到项目列表页面
      setTimeout(() => {
        wx.switchTab({
          url: '/pages/first/first',
        });
      }, 2000);
    }).catch(err => {
      wx.hideLoading();
      wx.showToast({
        title: '创建项目失败',
        icon: 'none',
        duration: 2000,
      });
      console.error('创建项目失败:', err);
    });
  },

  /**
   * 选择并上传图片
   */
  onChooseImage() {
    const that = this;
    wx.chooseImage({
      count: 1, // 默认选择1张图片
      sizeType: ['original', 'compressed'], // 可以选择原图或压缩图
      sourceType: ['album', 'camera'], // 可以选择相册或拍照
      success(res) {
        const tempFilePaths = res.tempFilePaths;
        if (tempFilePaths.length > 0) {
          // 设置预览图片路径
          that.setData({
            previewImageUrl: tempFilePaths[0],
          });

          // 上传图片到云存储
          wx.showLoading({
            title: '上传中...',
          });
          const cloudPath = 'projectImages/' + Date.now() + '-' + Math.floor(Math.random() * 1000) + tempFilePaths[0].match(/\.[^.]+?$/)[0];
          wx.cloud.uploadFile({
            cloudPath,
            filePath: tempFilePaths[0],
            success: resUpload => {
              wx.hideLoading();
              wx.showToast({
                title: '上传成功',
                icon: 'success',
                duration: 2000,
              });
              // 设置图片URL到数据中
              that.setData({
                imageUrl: resUpload.fileID
              });
            },
            fail: err => {
              wx.hideLoading();
              wx.showToast({
                title: '上传失败',
                icon: 'none',
                duration: 2000,
              });
              console.error('上传失败', err);
            }
          });
        }
      },
      fail(err) {
        console.error('选择图片失败', err);
      }
    });
  },

	项目创建流程:
  • 用户在页面输入项目名称、选择项目类型、输入关键词、人才数量和项目描述,最后上传项目展示图片。

  • 每一步都有相应的事件处理函数来更新数据和进行输入验证。

    关键词管理:

  • 允许用户添加关键词,使用 addKeyword 方法实现关键词的添加。它会检查关键词的有效性、数量限制及是否重复。

    提交项目:

  • 提交按钮触发 onSubmit 方法,进行表单验证后,将项目数据提交到云数据库。如果提交成功,将项目信息存入全局数据,并在创建成功后跳转回项目列表。

    图片选择与上传:

  • 通过 onChooseImage 方法选择图片并上传到云存储,成功后将返回的图片 URL 存储在数据中,以便提交。

(四)实现成果展示

  • 注册、登录

  • 个人信息完善+我的信息

  • 账号登出

  • 项目浏览 点击查看详情并报名加入

  • 查看项目详情

  • 项目发布gif

  • 我的项目+项目管理——修改

  • 项目管理——删除项目

  • 聊天——添加好友

  • 聊天——发起聊天

五、附加特点设计与展示

(一)设计的创意独到之处,这个设计的意义

  • 实现项目的搜索和筛选功能。创建好的项目可以在项目展示页面上显示。
  • 意义:按照用户偏好实现项目搜索、筛选,方便用户使用,提高用户体验。

(二)实现思路

1.搜索功能

用户在输入框中输入搜索关键字,对项目进行选择。

2.筛选功能:

  • 通过对项目数组的多次 filter 操作,逐步缩小满足条件的项目范围。
  • 先进行分类筛选,再基于关键字进行名称和标签匹配,最后应用更多筛选条件。

(三)贴出你认为重要的/有价值的代码片段,并解释

// 综合筛选项目
filterProjects() {
    const { allProjects, activeCategory, searchKeyword, filterOptions } = this.data;
    let filteredProjects = allProjects;

    // 按分类筛选
    if (activeCategory !== 'all') {
        filteredProjects = filteredProjects.filter(item => item.category === activeCategory);
    }

    // 按搜索关键字筛选(标题和标签)
    if (searchKeyword) {
        const keywordLower = searchKeyword.toLowerCase();
        filteredProjects = filteredProjects.filter(item =>
            item.name.toLowerCase().includes(keywordLower) ||
            item.tags.some(tag => tag.toLowerCase().includes(keywordLower))
        );
    }

    // 应用筛选界面的筛选条件
    // 筛选项目类别
    if (filterOptions.category) {
        filteredProjects = filteredProjects.filter(item => item.category === filterOptions.category);
    }


    // 筛选关键词
    if (filterOptions.keyword) {
        const keywordLower = filterOptions.keyword.toLowerCase();
        filteredProjects = filteredProjects.filter(item =>
            item.name.toLowerCase().includes(keywordLower) ||
            item.tags.some(tag => tag.toLowerCase().includes(keywordLower))
        );
    }

  

    // 更新项目列表前,对项目按照创建时间降序排序
    filteredProjects.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt));

    // 更新项目列表
    this.setData({
        projects: filteredProjects
    });
},
  • 首先用filterProjects 方法对所有项目进行筛选,根据当前选择的分类 (activeCategory) 过滤项目。
  • 然后,如果用户提供了搜索关键字,进一步根据项目的名称和标签进行筛选。
  • 最后,应用来自筛选界面的其他筛选条件,如项目类别、关键词。
  • 筛选后,对项目按创建时间进行降序排序,并更新页面的项目列表 (projects)。

微信开发者工具调用函数信息以及函数调用日志:

(四)实现成果展示

六、目录结构和使用说明

(一)项目目录组织

├──cloudfunctions 各种云函数的实现

│ ├── addFriend/ // 添加好友
│ ├── findDupicateStudentIds/ // 找到重复StudentIds
│ ├── getFriends/ // 获取friends
│ ├── getOpenId/ // 获取openid

│ ├── getUserProfile/ // 获取用户信息

│ ├──loginUser/ // 登录

│ ├──registerUser/ // 注册

│ ├──updateUserProfile/ // 更新用户信息

│ └── ...

miniprogram
├── components // 组件目录
│ ├── cloudTipModal // 云提示模态框组件
│ ├── cloudbaseModuleInstallModal // 云基础模块安装模态框组件
│ ├── cloudbaseModuleInstallPath // 云基础模块安装路径组件
│ └── mpCodeModal // 小程序二维码模态框组件
├── images // 图片资源目录
│ ├── icons // 图标资源文件夹
│ ├──各种PNG和SVG格式的图片资源 // 存放小程序使用的图片资源
├── pages // 页面目录
│ ├── chat // 聊天页面
│ ├──CreateProject // 创建项目
│ ├── first // 项目浏览界面

│ ├──login // 登录
│ ├── messages // 消息列表
│ ├──myProject // 我的项目
│ ├── profile // 个人资料

│ ├── ProjectDetail // 项目详情
│ ├──ProjectDetail_Modify // 项目管理

│ ├──register // 注册
│ ├──user-center // 用户中心

│ ├──web //

│ └── home // 主界面
├── utils // 工具库
├── app.js // 小程序的全局逻辑文件
├── app.json // 全局配置文件
├── app.wxss // 全局样式文件
├── envList.js // 环境列表
└── sitemap.json // 小程序的站点地图文件

其他文件
├── README.md、配置文件、环境列表等,提供项目说明和配置。
├── project.config.json // 项目的配置文件,用于微信开发者工具的项目设置。
└── package.json // 项目的 Node.js 配置文件,定义项目的依赖和脚本。

(二)使用说明

1.环境准备

(1)安装微信开发者工具

(2)注册微信小程序账号

(3)获取项目代码

	**打开终端**
  • 克隆项目仓库(需根据提示安装相关依赖):

    git clone https://github.com/cbhhhhhh/102201225-102201218.git
    
  • 进入项目目录:

    cd 102201225-102201218 
    

2.配置云开发

(1)登录微信开发者工具

  • 打开微信开发者工具,使用您的微信小程序账号登录。

(2)导入项目

(3)配置云开发

  • 在微信开发者工具中,在编辑器内依次右键云函数点击第二个上传并部署(云端安装依赖)

https://img2024.cnblogs.com/blog/3512981/202410/3512981-20241010183630306-2034217787.png

  • 初始化云函数和数据库,确保 cloudfunctions 和数据库集合已正确配置。

3.运行项目

(1)启动开发环境

  • 在微信开发者工具中,点击上方菜单栏中“工具”的“编译”按钮,启动项目的本地开发环境。

(2)预览小程序

  • 打开模拟器,即可预览项目。
  • 微信小程序开发者的系统可能加载缓慢或者未连上网络而出现报错,请耐心等待加载

有任何问题可以联系我们qq:陈碧煌1648652772;肖晗涵1437326006

4.测试功能

(1)用户管理

  • 注册自己的账号和密码(账号可选择填写学号)

  • 输入账号密码登录(可尝试错误的账号和密码、或空)

  • 前往“我的”完善个人信息(可点击头像上传个人头像)

  • 在“我的”页面可选择登出账号

(2)参与项目

  • 点击加入项目浏览项目列表

  • 点击感兴趣的项目,查看项目详情

  • 点击报名参加项目

    (3)发布项目

  • 首页点击发布项目

  • 填写发起项目的详情(项目名称、项目类型、关键词、人才数量、项目描述、项目展示),点击创建,即可在项目列表浏览到自己发布的项目

  • 点击自己刚创建的项目,可查看项目详情(包括项目创立时间)

    (4)项目管理

  • 点击“我的项目”可查看个人创建项目

  • 可进行对应项目的修改或删除

    (5)项目搜索与筛选

  • 在搜索框里输入项目名称或关键字即可搜索感兴趣的项目

  • 点击筛选,可根据项目类别和关键词进行项目筛选

    (6)聊天功能

  • 点击消息,输入账号进行好友添加(输入项目成员账号,即可实现项目内成员沟通)

  • 在我的消息里点击聊天框选择好友进行交流

七、用户反馈

我们邀请朋友对小程序进行内测,得到如下评价

八、单元测试

(一)说明你们选用的测试工具,是如何学习单元测试的,能出一份你自己的简易教程吗?

1.测试工具

Mocha + Chai。Mocha 是一个灵活、功能丰富的 JavaScript 测试框架,可以用于 Node.js 和浏览器中的单元测试和集成测试。Chai 是一个断言库,断言测试结果是否符合预期。Chai与 Mocha 搭配使用,支持should、expect 和 assert三种风格的断言,使测试代码更具可读性。

2.学习路线

(1)了解单元测试的定义及作用。(2)了解常见的JavaScript测试框架。(3)通过阅读“测试框架Mocha实例教程”链接,结合自身项目框架,决定选择学习mocha作为测试框架。

3.简易教程

(1)安装 Mocha 和 Chai
(2)在 package.json 文件中添加"scripts": { "test": "mocha" }
(3)编写功能代码example.js
(4)创建test目录并编写测试脚本example.test.js。

  • 测试脚本里面应该包括一个或多个describe块,每个describe块应该包括一个或多个it块。
  • describe块称为"测试套件",表示一组相关的测试。它是一个函数,第一个参数是测试套件的名称("xxx的测试"),第二个参数是一个实际执行的函数。
  • it块称为"测试用例",表示一个单独的测试,是测试的最小单位。它也是一个函数,第一个参数是测试用例的名称("根据预期测试结果自定义"),第二个参数是一个实际执行的函数。

(5)运行测试命令npm test,根据输出判断测试是否成功。

(二)展示出项目部分单元测试代码,并说明测试的函数

测试函数loginUser/index.js

//index.test.js
const { expect } = require('chai');
const cloud = require('wx-server-sdk');
const loginUser = require('../cloudfunctions/loginUser/index.js'); // 确保路径正确
const bcrypt = require('bcryptjs');

cloud.init({ env: 'test-env' }); // 使用测试环境

describe('loginUser 云函数', () => {
  before(async () => {
    // 初始化数据库
    const db = cloud.database();
    // 清空用户集合以确保测试环境干净
    await db.collection('users').remove({});
    // 添加一个测试用户
    const salt = bcrypt.genSaltSync(10);
    const hashedPassword = bcrypt.hashSync('password123', salt);
    await db.collection('users').add({
      data: {
        student_id: '123456',
        password: hashedPassword,
        openid: 'openid_test',
      }
    });
  });

  it('应该成功登录用户', async () => {
    const event = { student_id: '123456', password: 'password123' };
    const result = await loginUser.main(event);
    expect(result.success).to.be.true;
    expect(result.message).to.equal('登录成功');
    expect(result.user.student_id).to.equal('123456');
  });

  it('应该返回“用户不存在”', async () => {
    const event = { student_id: '999999', password: 'password123' };
    const result = await loginUser.main(event);
    expect(result.success).to.be.false;
    expect(result.message).to.equal('用户不存在');
  });

  it('应该返回“密码错误”', async () => {
    const event = { student_id: '123456', password: 'wrongpassword' };
    const result = await loginUser.main(event);
    expect(result.success).to.be.false;
    expect(result.message).to.equal('密码错误');
  });

  it('应该成功更新用户的 OpenID', async () => {
    const event = { student_id: '123456', password: 'password123' };
    const originalGetWXContext = cloud.getWXContext; // 存储原始函数
    cloud.getWXContext = () => ({ OPENID: 'new_openid' }); // 模拟获取新 OpenID
    const result = await loginUser.main(event);
    cloud.getWXContext = originalGetWXContext; // 恢复原始函数
    expect(result.success).to.be.true;
    expect(result.user.openid).to.equal('new_openid');
  });

  // 其他测试用例...
});

(三)说明构造测试数据的思路,你是如何考虑各种情况的?你如何考虑将来测试人员的***难?

测试数据构造的思路

构造测试数据时,我们考虑了以下情况:

  • 正常情况:确保用户输入有效且满足要求。
  • 边界情况:如用户名或密码为空,或重复使用已有的用户名。
  • 错误情况:例如输入错误的密码、尝试登录不存在的用户等。

我们还考虑了将来测试人员的***难,例如:

  • 使用极端输入(如超长用户名或密码)测试系统的健壮性。
  • 处理特殊字符(如空格、符号)确保系统能正常识别。

测试设计的评价

  • 覆盖面:我们的测试用例涵盖了正常情况、边界情况和错误情况,确保系统的各个方面得到验证。
  • 自动化:使用 Mocha 和 Chai 的测试框架,我们可以轻松地将测试自动化,这使得每次代码更改后都可以快速运行测试。
  • 维护性:测试用例结构清晰,易于维护和扩展。随着系统的增长,可以添加新的测试用例来验证新的功能。

九、Github代码签入记录

十、遇到的代码模块异常或结对困难及解决方法

(一)结对困难及解决

(1)在作业开始前我和队友都没有相关的前后端开发经验,因此对于使用工具和语言摸索了相当长一段时间。在chatgpt、b站教程以及各种查阅网页资料的帮助下,我们最终一步一步地成功做出第一个小程序,也真正意义上感到入门了计算机这个专业。

(2)对github协作编程不熟悉。通过学习git相关教程最终实现在github上提交pull request。收获就是初步入门github。

(二)代码模块异常及解决

微信云开发平台不允许添加本地域名,导致前后端之间的接口无法对接,不能正确传递数据。最终采用平台本身自带的云函数和云数据库实现项目后端。

(三)对于账号密码与项目连接的bug修改

死bug改了我一下午,离提交还有12小时的时候,发现项目绑定的是微信的OpenId,因此我的项目以及其他聊天功能全部离奇出问题,修改了一下午都要崩溃了,anyway现在已经是完全跟账号相绑定,成功解决了这个bug

十一、评价你的队友

肖晗涵说
值得学习的地方:审美超好,设计界面非常好看,会分享相关资料帮助我更快地了解所需的知识,同时学习新技术的能力超强,是个认真负责的队友!
需要改进的地方:无
陈碧煌说
值得学习的地方:抗压能力好,能快速适应项目需求变化并改进。同时也善于沟通,有良好的团队合作精神。
需要改进的地方:效率有待提高

posted on 2024-10-10 23:50  Xcccbh  阅读(41)  评论(0编辑  收藏  举报