团队作业5——测试与发布(Alpha版本)

课程 2024软件工程
作业要求 团队作业5——测试与发布(Alpha版本)
作业目标 测试并发布

测试概述

本测试计划旨在为新开发的宿舍管理系统、进行全面的测试,以确保其满足既定的功能需求、性能标准、安全性要求及兼容性标准。测试将覆盖所有新开发的功能点,并进行必要的非功能测试,以保障产品的质量和用户体验

测试范围

2.1.1 功能测试:覆盖所有新开发的功能点,包括但不限于用户注册与登录、主题圈创建与管理、话题发布与展示等。

2.1.2 非功能测试:

性能测试:评估系统在高负载下的响应时间、吞吐量等。

测试目标

确保所有功能按预期工作,无严重缺陷。

验证系统的性能、安全性和兼容性满足既定标准。

提供详细的测试报告和缺陷记录,以供开发和产品团队参考。

测试用例

测试方法

本次测试主要分为自动化测试梯度压力测试

自动化测试

语言:python

工具:selenium

使用selenium中的webdriver模块用于驱动浏览器,并在代码中通过驱动对网址进行访问

自动化测试分为四个模块

如下为自动化测试脚本:

代码结构

如上图:

​ common包中的utils脚本用于生成公用的浏览器驱动器供其他模块调用

代码:

import datetime
import os.path
import sys

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager


class Driver:
   driver = ""

   def __init__(self):
       options = webdriver.ChromeOptions()
       options.add_argument("--remote-allow-origins=*")
       self.driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
       self.driver.implicitly_wait(2)

   def getScreeShot(self):
       # 创建屏幕截图
       # 图片文件名称:./2024-05-08-173456.png
       dirname = datetime.datetime.now().strftime("%Y-%m-%d")
       # 判断dirname文件夹是否已经存在,若不存在则创建文件夹
       # ../images/2024-05-08
       if not os.path.exists("../images/" + dirname):
           os.mkdir("../images/" + dirname)
       # 2024-05-08-173456.png
       # 图片路径:../images/调用方法-2024-05-08/2024-05-08-173456.png
       # 图片路径:../images/LoginSucTest-2024-05-08/2024-05-08-173456.png
       # 图片路径:../images/LoginFailTest-2024-05-08/2024-05-08-173456.png
       filename = sys._getframe().f_back.f_code.co_name + "-" + datetime.datetime.now().strftime(
           "%Y-%m-%d-%H%M%S") + ".png"
       self.driver.save_screenshot("../images/" + dirname + "/" + filename)


BlogDriver = Driver()

Login_register中定义TBLogin类用于利用URL进行网页访问和自动化注册,登录

代码:

import time

from selenium.webdriver.common.by import By

from common.utils import BlogDriver


# 测试登陆页面

class TBLogin:
   url = ""
   driver = ""

   def __init__(self):
       self.url = 'http://10.21.32.192:8080/login'
       self.driver = BlogDriver.driver
       self.driver.get(self.url)

   # 用账号登录并记录登录情况
   def testLogin(self):
       # 点击登录按钮
       self.driver.find_element(By.CSS_SELECTOR, "#basic_username").clear()
       self.driver.find_element(By.CSS_SELECTOR, "#basic_password").clear()
       self.driver.find_element(By.CSS_SELECTOR, "#basic_username").send_keys("测试账号")
       self.driver.find_element(By.CSS_SELECTOR, "#basic_password").send_keys("testpasswd")
       self.driver.find_element(By.CSS_SELECTOR, "#basic > div.ant-form-item.mt-3.css-14sxnx2 "
                                                "> div > div > div > div > button").click()

       # 检查登录情况
       res = self.driver.find_element(By.CSS_SELECTOR, "div > div > div > div > "
                                                       "span.anticon.anticon-check-circle > svg > path").text
       self.driver.getScreenShot()
       assert res, "登录成功"

   # 通过邮箱注册
   def testRegister(self):
       self.driver.find_element(By.CSS_SELECTOR, "#basic > div.ant-row.css-14sxnx2 > "
                                                 "div.ant-col.ant-col-15.css-14sxnx2 > span").click()
       self.driver.find_element(By.CSS_SELECTOR, "#basic_username").clear()
       self.driver.find_element(By.CSS_SELECTOR, "#basic_email").clear()
       self.driver.find_element(By.CSS_SELECTOR, "#basic_email").clear()

       self.driver.find_element(By.CSS_SELECTOR, "#basic_username").send_keys("测试账号")
       self.driver.find_element(By.CSS_SELECTOR, "#basic_email").send_keys("3086094473@qq.com")
       self.driver.find_element(By.CSS_SELECTOR, "#basic_password").send_keys("testpasswd")

       self.driver.getScreenShot()
       # 检查登录情况
       res = self.driver.find_element(By.CSS_SELECTOR,
           "#root > div.adm-tab-bar.fixed.bottom-0.w-screen.shadow-sm.bg-gray-50 "
           "> div > div.adm-tab-bar-item.adm-tab-bar-item-active "
           "> div.adm-tab-bar-item-title.adm-tab-bar-item-title-with-icon").text
       assert res, "话题"
       self.driver.close()



cicle中定义类ManageCircle用于对已经登录的账号中的主题圈进行管理

代码:

from typing import Callable

from selenium.webdriver.common.by import By

from common.utils import BlogDriver


class ManageCircle:
    driver = ""

    def __init__(self):
        self.driver = BlogDriver.driver

    # 测试创建主题圈
    def creCircle(self):
        # 点击创建主题圈
        self.driver.find_element(By.CSS_SELECTOR, "#root > div.adm-pull-to-refresh > div.adm-pull-to-refresh-content "
                                                  "> div > div.flex.w-screen.px-5 > span").click()
        # 填写主题圈名
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.p-5.px-6 > input").send_keys("校园圈测试")
        # 填写主题圈内容
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.p-5.px-6 > textarea").send_keys("测试")

        # 截图
        BlogDriver.getScreeShot()

        # 发布主题圈
        self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.adm-nav-bar "
                                                  "> div.adm-nav-bar-right > button").click()
        # 查看发布结果
        restxt = self.driver.find_element(By.CSS_SELECTOR, "#rc-tabs-11-tab-3").text
        assert restxt, "测试主题圈"
        BlogDriver.getScreenShot()


topic中定义ManageTopic类用于对账号的话题进行管理

代码:

from selenium.webdriver.common.by import By

from common.utils import BlogDriver


class ManageTopic:
   driver = ""

   def __init__(self):
       self.driver = BlogDriver.driver

   def CreTopic(self):
       # 上传话题
       # 点击话题
       self.driver.find_element(By.CSS_SELECTOR, "#root > div.adm-tab-bar.fixed.bottom-0.w-screen.shadow-sm.bg-gray-50 "
                                                 "> div > div.adm-tab-bar-item.adm-tab-bar-item-active").click()
       # 点击创建
       self.driver.find_element(By.CSS_SELECTOR, "#root > div.adm-floating-bubble "
                                                 "> div.adm-floating-bubble-button").click()
       # 输入内容
       self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.p-5.px-6 > textarea").send_keys("测试内容")
       # 截图
       BlogDriver.getScreeShot()
       # 点击发布
       self.driver.find_element(By.CSS_SELECTOR, "#root > div > div.adm-nav-bar "
                                                 "> div.adm-nav-bar-right > button").click()
       # 验证话题上传效果
       txt = self.driver.find_element(By.CSS_SELECTOR, "#root > div.py-5 > div:nth-child(1) "
                                                 "> div > div.text-sm" ).text
       assert txt, "test"
       BlogDriver.getScreeShot()

预期结果

注册模块预期结果:成功注册

登录预期结果:成功登录

创建主题圈预期结果:创建成功并展示

创建话题预期结果:创建成功并展示

实际结果

注册

登录

创建话题圈

创建主题

由上图可知:

注册实际结果:成功

登录实际结果:成功

管理话题圈实际结果:成功

管理主题实际结果:成功

梯度压力测试

测试工具:jmeter工具

如上图分别测试登录,创建,发布三个模块

聚合报告如下:

线程数量变化情况:

TPS图:

RTT图:

根据性能测试可以得知,这个项目允许的极限并发数为两千左右。稳定情况下的允许的并发用户为一千人左右。

足够正常情况下校园师生使用

测试总结

1. 在测试过程中总共发现了多少Bug?每个类别的Bug分别为多少个?

(1) 发现了四个bug,分别是:

(2) 登录时点击登录无法跳转

(3) 界面布局在页面大小改变时有变化

(4) 图片上传后,加载有问题

(5) 后端服务器曾经一度无法访问

2. 修复的bug:

(1) 跳转和上传已修复

3. 不能重现的bug

(1) 服务器无法访问

4. 这个产品就是这样设计的,不是bug;

5. 没有能力修复,将来也不打算修复;

6. 这个bug的确应该修复,但是没有时间在这个版本修复,延迟到下一个版本修复。

页面布局问题

7. 场景测试(scenario testing),包括以下内容:

(1) 使用有效邮箱登录,使用无效邮箱登录

(2) 使用有效邮箱注册,使用无效邮箱注册

(3) 创建主题圈,管理员审核主题圈

(4) 主题圈管理操作(关闭、推荐)

(5) 发布包含文字的话题,发布包含图片的话题

8. 你认为你们团队的软件在什么条件下,就可以认定其已经足够好,可以发布Alpha版本?——出口条件(exit criteria)
(1) 核心功能均已实现

(2) 代码质量合格,与预期相符

(3) 性能合格,满足预期目标

(4) 合法

(5) 具备反馈机制或者反馈通道

(6) 完成初步的测试

​# 发布说明

功能

  1. 登录注册 管理员,用户(默认,可升级为管理员,升级不做审核,省略后台管理系统的工作量)

  2. 建主题圈(管理员)

  3. 发布话题(直接发布默认在校园圈,也可以在主题圈内发布)

  4. 话题审核(圈有圈管理员审核话题)

  5. 话题评论(文字,语音,图片,小文件,不用审核)

  6. 搜索功能(推荐展示热门话题)

  7. 聊天(纯文字聊天,提供授权交换联系方式,个人信息详情,参考boss )

  8. 圈内微应用(微前端架构,方便后续拓展):

      1. 传送门(管理员收集圈内相关链接快捷跳转,比如饭圈跳转美团,校园圈跳转学校系统等)
      1. 转盘(管理员收集圈内相关主题建立转盘,比如饭圈南亭主题随机美食)

运行环境

平台 Windows
浏览器 Edge / Chrome
硬件配置 常规电脑即可
网络配置 校园网即可

系统已知的问题和限制

软件的发布方式以及发布地址

发布方式:网站
DreamToByteDance

posted @ 2024-11-27 23:31  u1u1uu1  阅读(107)  评论(0)    收藏  举报