项目背景

随着数字经济不断发展,线上购物已成为大众主要消费方式,电商行业发展日趋成熟。为满足日常线上交易需求,本次搭建了集商品浏览、购物下单、订单管理等功能于一体的电商商城系统。为保障系统稳定可靠、使用体验良好,我围绕功能、界面、性能、兼容性等多个维度开展全面测试,排查潜在问题,为系统正常运行提供质量保障。

测试范围

功能测试、界面测试、自动化测试、性能测试。

项目功能

电商商城系统主要实现了登录页面、首页功能、商品详情页、购物车功能、个人中心、业务管理、商品收藏页面功能

  1. 登录页面:登录页面支持账号、手机、邮箱注册与登录,同时提供找回密码功能。登录和注册有格式、验证码等进行效验,保障用户账号安全与操作准确性。
  2. 首页功能:可在首页功能看到商品分类,展开分类栏可看到完整的子分类;轮播图图片展示完整,点击轮播图可成功跳转到其他页面,搜索框可精准搜索商品出来。为用户提供便捷的商品浏览与检索入口。
  3. 商品详情页:在首页能任意点击商品并成功跳转到商品详情页,能对商品进行收藏的添加和取消,点击商品可以看到商品细节放大图,还可以对商品进行购物车添加以及购买,未选规格时会提示用户,满足用户浏览与购买需求。
  4. 购物车功能:在首页顶部浏览框点击“购物车”,跳转到购物车功能页面,也可以对商品进行收藏,对商品的数量进行增加和减少,有结算下单功能。调整失败、操作成功时均有对应提示,可便捷管理待购商品,为结算下单提供支撑。
  5. 个人中心:在首页顶部浏览框点击“个人中心”,跳转到个人中心页面,可看到业务管理、财产中心和资料管理功能。可以对个人信息进行修改,修改操作会进行严格的格式与合法性校验。修改成功或失败均有对应提示,地址管理支持新增、编辑、删除收货地址,保障用户个人信息与收货信息的准确性和安全性。
  6. 业务管理和商品收藏页面功能:业务管理没有支持功能的实现。商品收藏页面可通过导航栏或个人中心进入,支持条数设置、页码跳转、商品搜索与删除功能。条数设置和页码跳转存在边界值校验,可自动修正无效输入,便于用户高效管理收藏商品。

设计测试用例



功能测试

登录功能

1.注册页面

1.1.账号注册

测试场景一:输入正确的用户名、密码、验证码,则注册成功

预期结果:界面显示提示“注册成功”并跳转到个人中心页面,实际结果和预期结果一样


测试场景二:输入已存在的登录账号

预期结果:注册失败,提示显示为“用户已存在[liangjian]”,实际结果和预期结果一样


测试场景三:输入正确的用户名,正确的验证码,错误的密码格式

预期结果:注册失败,提示显示为“密码格式6~18个字符之间”,实际结果和预期结果一样


测试场景四:输入正确的用户名,密码格式和错误验证码格式

预期结果:注册失败,提示显示为“密码格式6~18个字符之间”,实际结果和预期结果一样


测试场景五:输入空的用户名,密码格式和错误验证码格式

预期结果:注册失败,提示显示为“请使用字母、数字、下划线2~18个字符”,实际结果和预期结果一样


1.2.手机注册

测试场景一:输入错误的手机号码格式

预期结果:注册失败,提示显示为“手机号码格式错误”,实际结果和预期结果一样


测试场景二:输入错误的验证码

预期结果:注册失败,提示显示为“手机号码格式错误”,实际结果和预期结果一样


测试场景三:输入空的验证码

预期结果:注册失败,提示显示为“请输入有效的图形验证码”,实际结果和预期结果一样


测试场景四:输入密码的格式错误

预期结果:注册失败,提示显示为“密码格式6~18个字符之间”,实际结果和预期结果一样


测试场景五:正确的手机号格式、密码格式和验证码注册,注册成功

预期结果:注册失败,提示显示为“发送失败[MissingAccessKeyId]”,实际结果和预期结果不一样


1.3邮箱注册

测试场景一:输入错误的电子邮箱格式

预期结果:注册失败,提示显示为“电子邮箱格式错误”,实际结果和预期结果一样


测试场景二:输入错误的验证码

预期结果:注册失败,提示显示为“验证码错误”,实际结果和预期结果一样


测试场景三:输入空的验证码

预期结果:注册失败,提示显示为“请输入有效的图形验证码”,实际结果和预期结果一样


测试场景四:输入错误的密码格式

预期结果:注册失败,提示显示为“密码格式6~18个字符之间”,实际结果和预期结果一样


测试场景五:正确的邮箱格式、密码格式和验证码注册,注册成功

预期结果:注册失败,提示显示为“发送失败[SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting]”,实际结果和预期结果不一样


2.登录页面

2.1.账号登录

测试场景一:输入正确的用户名、密码和验证码点击登录并登录成功

预期结果:登录成功会跳转到首页,实际结果与预期结果一样


测试场景二:输入正确用户名和错误密码并点击登录

预期结果:登录失败,提示显示为“密码错误”,实际结果和预期结果一样


测试场景三:输入正确用户名和空密码,用户名:zhangsan,密码:789456

预期结果:登录失败,提示显示为“密码格式6~18个字符之间”,实际结果和预期结果一样


测试场景四:输入错误用户名和错误密码,用户名:lianggggg,密码:123456

预期结果:登录失败,提示显示为“账号不存在”,实际结果和预期结果一样


测试场景五:输入空用户名和正确密码,用户名:,密码:456852

预期结果:登录失败,提示显示为“请输入登录账号”,实际结果和预期结果一样


测试场景六:输入空用户名和空密码,用户名:,密码:

预期结果:登录失败,提示显示为“请输入登录账号”和“密码格式6~18个字符之间”,实际结果和预期结果一样


测试场景七:验证码输入错误

预期结果:登录失败,提示显示为“验证码错误”,实际结果和预期结果一样


测试场景八:验证码为空

预期结果:登录失败,提示显示为“请输入有效的图形验证码”,实际结果和预期结果一样


测试场景九:验证码过时

预期结果:登录失败,提示显示为“验证码已过期”,实际结果和预期结果一样


2.2.手机登录

测试场景一:手机号码格式错误

预期结果:登录失败,提示显示为“手机号码格式错误”,实际结果和预期结果一样


测试场景二:验证码输入错误

预期结果:登录失败,提示显示为“验证码错误”,实际结果和预期结果一样


测试场景三:验证码为空

预期结果:登录失败,提示显示为“请输入有效的图形验证码”,实际结果和预期结果一样


测试场景四:登录账号不存在

预期结果:登录失败,提示显示为“手机号码不存在、请先注册!”,实际结果和预期结果一样


2.3邮箱登录

测试场景一:电子邮箱格式错误

预期结果:登录失败,提示显示为“电子邮箱格式错误”,实际结果和预期结果一样


测试场景二:验证码输入错误

预期结果:登录失败,提示显示为“验证码错误”,实际结果和预期结果一样


测试场景三:验证码为空

预期结果:登录失败,提示显示为“请输入有效的图形验证码”,实际结果和预期结果一样


测试场景四:登录账号不存在

预期结果:登录失败,提示显示为“电子邮箱不存在、请先注册!”,实际结果和预期结果一样


3.找回密码--登录页面

测试场景一:输入错误电子邮箱、验证码和密码点击登录

预期结果:重置失败,提示显示为“请输入有效的手机/邮箱格式”,实际结果和预期结果一样


测试场景二:验证码输入错误

预期结果:重置失败,提示显示为“验证码错误”,实际结果和预期结果一样


测试场景三:验证码为空

预期结果:重置失败,提示显示为“请输入有效的图形验证码”,实际结果和预期结果一样


测试场景四:登录账号不存在

预期结果:重置失败,提示显示为“手机号码不存在、请先注册!”或者是“电子邮箱不存在、请先注册!”,实际结果和预期结果一样


测试场景五:输入密码为空

预期结果:重置失败,提示显示为“密码格式6~18个字符之间×”,实际结果和预期结果一样


首页功能

1.商品分类展示

测试场景:登录或者注册成功后,进入商城系统首页,查看左侧的商品分类栏

预期结果:所有商品分类完整,正确展示,分类明确,展开分类栏可以看到子分类


2.轮播图展示与跳转

测试场景:在商城首页,观察轮播图切换,点击轮播图中的 “iPhone 14 pro” 宣传图。

预期结果:轮播图正常自动切换,点击后跳转至该商品的详情页面。

实际结果:轮播图正常自动切换,点击后跳转无法至该商品的详情页面。


3.搜索框

测试场景一:在首页页面,点击搜索框输入正确的关键词

预期结果:搜索关键词成功就会显示对应内容的页面,与实际结果一样


测试场景二:在首页页面,对搜索框不进行搜索直接点击“搜索”

预期结果:没有关键词直接搜索,会显示所有商品,无法准确搜索,与实际结果一样


测试场景三:在首页页面,点击搜索框输入两个“**”再点击“搜索”

预期结果:显示“没有相关数据”的提示


商品详情页

1.打开商品

测试场景:在商城首页页面,任意点击一个商品,跳转到对应商品的详情页

预期结果:成功跳转到商品的详情页


2.收藏商品

测试场景:在商品详情页中,点击商品图片右下角的“收藏”,爱心会变成红色

预期结果:爱心会变成红色,会有提示出来“收藏成功”


3.取消商品

测试场景:在商品详情页中,点击商品图片右下角的“收藏”,红色爱心会变成空心

预期结果:红色爱心会变成空心,会有提示出来“取消成功”


4.商品图片

测试场景:在商品详情页中,轻碰商品图片可看到商品细节放大图

预期结果:可以成功看到商品细节放大图


5.加入购物车

测试场景一:在商品详情页中,可以对商品进行购物车的添加

预期结果:添加成功,会有窗口弹出,提示商品已成功加入购物车!


测试场景二:在商品详情页中,可以对商品进行购物车的添加

预期结果:添加失败,没有对商品进行规格的选择,会出现“请选择规格”的提示


6.购买商品

测试场景:在商品详情页中,可以对商品进行购买

预期结果:点击购买会跳转到订单页面


购物车功能

1.商品数量调整

测试场景一:在商城首页,右上角快速浏览框点击“购物车”,跳转到购物车功能页,对商品数量进行调整

预期结果:对数量进行增加,添加成功页面会做出调整把数量发生变化,价格也会变化


测试场景二:在商城首页,右上角快速浏览框点击“购物车”,跳转到购物车功能页,对商品数量进行调整

预期结果:对数量进行减少,会调整失败,提示:最低起购数量1台


测试场景二:在商城首页,右上角快速浏览框点击“购物车”,跳转到购物车功能页,对商品数量进行调整

预期结果:对调整的数量高于限定数量,会调整失败,自动修改为限定数量值


2.收藏商品

测试场景:在购物车功能页的右边可以对商品进行收藏

预期结果:显示提示为收藏成功,“收藏”变成“已收藏


3.取消商品

测试场景:在购物车功能页的右边可以对商品进行收藏的取消

预期结果:显示提示为取消成功,“已收藏”变成“收藏”


4.购物车商品结算

测试场景:在购物车功能页里,可以对一件商品、多件商品、全选商品进行订单结算,点击“结算”会跳转到订单页面

预期结果:成功跳转至商品订单页面


5.购物车商品删除

测试场景:在购物车功能页里,可以对一件商品、多件商品、全选商品进行删除,会有弹窗出来提示是否对商品进行删除,删除成功商品就不在购物车

预期结果:删除成功会有提示为删除成功,商品就不在购物车


个人中心

1.个人信息查看

测试场景:在商城首页,右上角快速浏览框点击“个人中心”,跳转到个人中心页面,对个人信息进行查看

预期结果:正确显示用户的呢称、手机号码、邮箱等注册时填写的信息


2.头像修改

测试场景一:在个人中心页面,对头像进行修改

预期结果:修改成功,上传头像,把就头像替换成新头像


测试场景二:在个人中心页面,对头像进行修改

预期结果:修改失败,不上传文件,显示提示为“请选择需要上传的图片”


3.昵称修改

测试场景一:在个人中心页面,对昵称进行修改

预期结果:只需要1个及以上非空字符即可修改成功,但是超过60个字符将无法输入


测试场景二:在个人中心页面,对昵称进行修改

预期结果:修改失败,不输入昵称进去,显示提示为“昵称2~16个字符之间”


测试场景三:在个人中心页面,对昵称进行修改

预期结果:修改失败,输入一个空格进行,显示提示为“昵称1~60个字符之间”


4.生日修改

测试场景一:在个人中心页面,对生日进行修改

预期结果:修改成功,显示为修改的生日


5.性别修改

测试场景一:在个人中心页面,对性别进行修改

预期结果:修改成功,显示为修改的性别


6.收货地址管理--新增地址

测试场景一:在个人中心页面里,左边一栏“资料管理”点击“我的地址”,跳转到收货地址页面进行地址的添加

预期结果:新增成功,显示提示为“操作成功”


测试场景二:在个人中心页面里,左边一栏“资料管理”点击“我的地址”,跳转到收货地址页面进行地址的添加

预期结果:在姓名为空的情况下,新增失败,显示提示为“姓名格式1~80个字符之间”


测试场景三:在个人中心页面里,左边一栏“资料管理”点击“我的地址”,跳转到收货地址页面进行地址的添加

预期结果:在电话为空的情况下,新增失败,显示提示为“电话格式有误”


测试场景四:在个人中心页面里,左边一栏“资料管理”点击“我的地址”,跳转到收货地址页面进行地址的添加

预期结果:在省市区为空的情况下,新增失败,显示提示为“请填写(选择)此字段”


测试场景五:在个人中心页面里,左边一栏“资料管理”点击“我的地址”,跳转到收货地址页面进行地址的添加

预期结果:在详细地址为空的情况下,新增失败,显示提示为“详细地址格式1~80个字符之间 ×”


7.收货地址管理--地址管理

测试场景一:在个人中心页面里,左边一栏“资料管理”点击“我的地址”,跳转到收货地址页面进行对地址进行编辑,删除等操作

预期结果:编辑,删除等操作都成功了


8.密码修改

测试场景一:在个人中心页面,对密码进行修改

预期结果:修改成功,修改密码和原密码一样


测试场景二:在个人中心页面,对密码进行修改

预期结果:修改失败,当前密码为空,显示提示为“当前密码格式6~18个字符之间”


测试场景三:在个人中心页面,对密码进行修改

预期结果:修改失败,新密码为空,显示提示为“新密码格式格式6~18个字符之间”


测试场景四:在个人中心页面,对密码进行修改

预期结果:修改失败,确认密码为空,显示提示为“确认密码格式6~18个字符之间,与新密码一致”


业务管理

1.订单管理

测试场景:在个人中心页面,点击订单管理,对订单进行处理

预期结果:能在订单列表对订单进行管理。

实际结果:不能选择支付,无法生成订单,订单列表为空,无法验证此功能


2.订单售后

测试场景:在个人中心页面,点击订单售后,对订单进行处理

预期结果:能在订单列表对订单进行售后处理。

实际结果:不能选择支付,无法生成订单,订单列表为空,无法验证此功能


3.商品评价

测试场景:在个人中心页面,点击商品评价,对商品进行评价和查看评价

预期结果:能在订单列表里评价商品。

实际结果:不能选择支付,无法生成订单,订单列表为空,无法验证此功能


商品收藏页面功能

1.页面打开方式

测试场景:对商品收藏页面进行打开

预期结果:首页顶部导航栏“我的收藏”,下拉点击"商品收藏";也可以在首页顶部导航栏“个人中心”,点击左边“商品收藏”


2.商品收藏页面条数设置

测试场景一:对商品收藏页面的条数进行设置

预期结果:设置成功,页面条数调整为对应条数


测试场景二:对商品收藏页面的条数进行设置

预期结果:设置失败,页面条数设置为0,自动换成默认值20


3.商品收藏搜索

测试场景:对商品收藏页面进行搜索

预期结果:能在商品列表根据要求迅速搜索筛选目标收藏对象


4.删除收藏商品

测试场景:对商品收藏页面进行删除

预期结果:能在商品收藏列表删除收藏的商品



界面测试

1.网站首页


2.个人中心页


3.商品分类页



自动化测试

驱动类

#创建驱动对象
import datetime
import os.path
import sys

from selenium import webdriver
from selenium.webdriver.edge.service import Service
from selenium.webdriver.chromium import service
from selenium.webdriver.common.by import By
from webdriver_manager. microsoft import EdgeChromiumDriverManager

#链接浏览器
class Driver:
    #driver = ""
    def __init__(self):
        #没有成功的写法
        # self.driver = webdriver.Edge(
        #     service=Service(executable_path="D:\\pycharm\\StoreSystemProject1\\msedgedriver.exe"))
        # options = webdriver.EdgeOptions()
        # options.add_experimental_option("detach", True)
        # self.driver = webdriver.Edge(service=Service(EdgeChromiumDriverManager().install()), options=options)
        
        #成功的写法
        options = webdriver.EdgeOptions()
        options.add_experimental_option("detach", True)
        # 使用手动下载的驱动,确保版本与 Edge 149 匹配
        #里面需要注意一个问题,就是Microsoft Edge浏览器可能会更新,我们要随意留言,
        # 如果Microsoft Edge浏览器更新了就去https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?form=MA13LH
        #重新下载 edgedriver_win64.zip ,并且一定要跟浏览器版本是一样的
        self.driver = webdriver.Edge(
            service=Service(executable_path=r"D:\dirver\msedgedriver.exe"),
            options=options
        )
        self.driver.implicitly_wait(5)
    #进行对日志截图
    def getScreenshot(self):
        dirname=datetime.datetime.now().strftime("%Y-%m-%d")
        log_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "logs", dirname)
        if not os.path.exists(log_dir):
            os.makedirs(log_dir)
        filename=sys._getframe().f_back.f_code.co_name+"_"+datetime.datetime.now().strftime("%Y-%m-%d-%H%M%S")+".png"
        self.driver.save_screenshot(os.path.join(log_dir, filename))

StoreDriver = Driver()

注册模块类

#注册--商城系统注册页面
import time
from common.utils import StoreDriver
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException

class RegisterTest:
    url=""
    driver=""
    saved_verify_code=None
    def __init__(self):
        self.url="http://49.235.61.184/?s=user/regInfo.html"
        self.driver=StoreDriver.driver
        self.driver.get(self.url)

        #页面最大化
        self.driver.maximize_window()
        self.verified_code=None

    #成功注册--测试用例
    def SucessRegister(self):
        #先清空内容,防止连续多次的send_keys造成内容拼接
        #用户名
        self.driver.find_element(By.NAME,"accounts").clear()
        #密码
        self.driver.find_element(By.NAME,"pwd").clear()
        #验证码
        verify_input=self.driver.find_element(By.NAME,"verify")
        verify_input.clear()

        #定位元素并输入测试用例
        time.sleep(1)
        #这些例子全是为了验证代码执行是否成功而设计的测试用例
        # self.driver.find_element(By.NAME,"accounts").send_keys("lishimin")
        # self.driver.find_element(By.NAME, "accounts").send_keys("lishiminn")
        # self.driver.find_element(By.NAME, "accounts").send_keys("lishiminnn")
        # self.driver.find_element(By.NAME, "accounts").send_keys("liminnn")
        
        self.driver.find_element(By.NAME, "accounts").send_keys("limminnn")
        self.driver.find_element(By.NAME,"pwd").send_keys("123456")
        # 手动输入验证码
        self.verified_code=input("请输入验证码:")
        verify_input.send_keys(self.verified_code)

        # 勾选同意协议
        #没有成功的写法
        #self.driver.find_element(By.NAME, "is_agree_agreement").click()
        #成功的写法
        agree = self.driver.find_element(By.NAME, "is_agree_agreement")
        time.sleep(0.5)
        self.driver.execute_script("arguments[0].click();", agree)
        # 点击注册
        # 没有成功的写法
        #self.driver.find_element(By.CSS_SELECTOR,"button[type='submit']").click()
        # self.driver.find_element(By.XPATH, "/html/body/div[1]/div[1]/div[3]/div/div/div[2]/div/div[1]/div[1]/form/div[5]/button").click()
        # 成功的写法
        self.driver.find_element(By.XPATH, "//button[text()='注册']").click()

        # #添加屏幕截图
        time.sleep(2)
        StoreDriver.getScreenshot()
        # #检查是否注册失败
        # 检查是否注册成功:如果注册按钮还在,说明注册失败
        if len(self.driver.find_elements(By.XPATH, "//button[text()='注册']")) > 0:
            print("校验结果:注册失败,页面未跳转")
        else:
            print("校验结果:注册成功,页面已跳转")
            time.sleep(1)
            # 验证当前URL确认在首页
            print("当前页面URL:", self.driver.current_url)
    # -----------------------------------------------------------------------------------
    
    #注意:在异常登录中的测试用例,我是一个板块一个板块来测试的,并不是同时进行,
    # 为了看代码方便在全部异常测试用例单独执行完后我再去掉注释
    #异常登录--测试用例
    def FailRegister(self):

        #测试用例一:输入已存在的账号
        # 先清空内容,防止连续多次的send_keys造成内容拼接
        self.driver.find_element(By.NAME,"accounts").clear()
        self.driver.find_element(By.NAME,"pwd").clear()
        verify_input=self.driver.find_element(By.NAME,"verify")
        verify_input.clear()
        # #定位元素并输入测试用例
        self.driver.find_element(By.NAME,"accounts").send_keys("limminnn")
        self.driver.find_element(By.NAME,"pwd").send_keys("123456")
        self.verified_code=input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        # #勾选同意协议
        agree = self.driver.find_element(By.NAME, "is_agree_agreement")
        time.sleep(0.5)
        self.driver.execute_script("arguments[0].click();", agree)
        # #点击注册
        self.driver.find_element(By.XPATH, "//button[text()='注册']").click()
        # #添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # #检查是否注册失败
        if len(self.driver.find_elements(By.XPATH, "//button[text()='注册']")) > 0:
            print("校验结果:注册失败,页面未跳转")
        else:
            print("校验结果:注册成功,页面已跳转")
            time.sleep(1)
            # 验证当前URL确认在首页
            print("当前页面URL:", self.driver.current_url)


        #--------------------------------------------------------------------------------
        #测试用例二:输入正确用户名和错误密码
        # 先清空内容,防止连续多次的send_keys造成内容拼接
        self.driver.find_element(By.NAME, "accounts").clear()
        self.driver.find_element(By.NAME, "pwd").clear()
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()
        # # 定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("limminnn")
        self.driver.find_element(By.NAME, "pwd").send_keys("123")
        self.verified_code = input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        # # 勾选同意协议
        agree = self.driver.find_element(By.NAME, "is_agree_agreement")
        time.sleep(0.5)
        self.driver.execute_script("arguments[0].click();", agree)
        # # 点击注册
        self.driver.find_element(By.XPATH, "//button[text()='注册']").click()
        # # 添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # # 检查是否注册失败
        if len(self.driver.find_elements(By.XPATH, "//button[text()='注册']")) > 0:
            print("校验结果:注册失败,页面未跳转")
        else:
            print("校验结果:注册成功,页面已跳转")
            time.sleep(1)
            # 验证当前URL确认在首页
            print("当前页面URL:", self.driver.current_url)
       
        # -------------------------------------------------------------------------------
        # 测试用例三:输入正确用户名,正确密码和错误的验证码
        # 先清空内容,防止连续多次的send_keys造成内容拼接
        self.driver.find_element(By.NAME, "accounts").clear()
        self.driver.find_element(By.NAME, "pwd").clear()
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()
        # # 定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("linnn")
        self.driver.find_element(By.NAME, "pwd").send_keys("123456")
        self.verified_code = input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        # # 勾选同意协议
        agree = self.driver.find_element(By.NAME, "is_agree_agreement")
        time.sleep(0.5)
        self.driver.execute_script("arguments[0].click();", agree)
        # # 点击注册
        self.driver.find_element(By.XPATH, "//button[text()='注册']").click()
        #
        # # 添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # # 检查是否注册失败
        if len(self.driver.find_elements(By.XPATH, "//button[text()='注册']")) > 0:
            print("校验结果:注册失败,页面未跳转")
        else:
            print("校验结果:注册成功,页面已跳转")
            time.sleep(1)
            # 验证当前URL确认在首页
            print("当前页面URL:", self.driver.current_url)

        # -------------------------------------------------------------------------------
        # 测试用例四:输入空的用户名,正确密码和正确的验证码
        self.driver.find_element(By.NAME, "accounts").clear()
        self.driver.find_element(By.NAME, "pwd").clear()
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()
        # 定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("")
        self.driver.find_element(By.NAME, "pwd").send_keys("123456")
        self.verified_code = input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        # 勾选同意协议
        agree = self.driver.find_element(By.NAME, "is_agree_agreement")
        time.sleep(0.5)
        self.driver.execute_script("arguments[0].click();", agree)
        # 点击注册
        self.driver.find_element(By.XPATH, "//button[text()='注册']").click()
        # 添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # 检查是否注册失败
        if len(self.driver.find_elements(By.XPATH, "//button[text()='注册']")) > 0:
            print("校验结果:注册失败,页面未跳转")
        else:
            print("校验结果:注册成功,页面已跳转")
            time.sleep(1)
            # 验证当前URL确认在首页
            print("当前页面URL:", self.driver.current_url)

登录模块类

#登录--商城系统登录页面
import time
from common.utils import StoreDriver
from selenium import webdriver
from selenium.webdriver.common.by import By

class LoginTest:
    url=""
    driver=""
    saved_verify_code=None;
    def __init__(self):
        self.url="http://49.235.61.184/?s=user/loginInfo.html"
        self.driver=StoreDriver.driver
        self.driver.get(self.url)
        self.driver.maximize_window()
        self.verified_code=None

    #成功登录--测试用例
    def sucessLogin(self):
        # 先清空内容,防止连续多次的send_keys造成内容拼接
        # 用户名
        self.driver.find_element(By.NAME, "accounts").clear()
        # 密码
        self.driver.find_element(By.NAME, "pwd").clear()
        # 验证码
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()

        #定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("liangjian")
        self.driver.find_element(By.NAME, "pwd").send_keys("456852")
        self.verified_code=input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        #self.driver.find_elements(By.XPATH, "//*[contains(text(),'liangjian')]")
        self.driver.find_element(By.XPATH, "//form//button[text()='登录']").click()

        #添加屏幕截图 :时间长一点,这样才能成功截图到成功登入首页的图片
        # time.sleep(2)
        # StoreDriver.getScreenshot()

        #能找到商场首页用户的昵称,说明登陆成功,否则登录失败
        #"//span[text()='liangjian']"
        time.sleep(1)
        if len(self.driver.find_elements(By.XPATH, "//span[text()='liangjian']")) > 0:
            print("校验结果:登录成功")
        else:
            print("校验结果:登录失败")

    # --------------------------------------------------------------------------------------
    # 注意:在异常登录中的测试用例,我是一个板块一个板块来测试的,并不是同时进行,
    # 为了看代码方便在全部异常测试用例单独执行完后我再去掉注释
    # 失败登录--测试用例
    def failLogin(self):
        # #测试用例一:输入未注册的账号
        self.driver.find_element(By.NAME, "accounts").clear()
        self.driver.find_element(By.NAME, "pwd").clear()
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()
        # # 定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("liaoooooo")
        self.driver.find_element(By.NAME, "pwd").send_keys("123456")
        self.verified_code = input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        self.driver.find_element(By.XPATH, "//form//button[text()='登录']").click()
        #
        # # 添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # # 能找到商场首页用户的昵称,说明登陆成功,否则登录失败
        time.sleep(1)
        if len(self.driver.find_elements(By.XPATH, "//span[text()='liangjian']")) > 0:
            print("校验结果:登录成功")
        else:
            print("校验结果:登录失败")

        # ------------------------------------------------------------------------------------------------------------------------
        # 测试用例二:不输入用户名,输入密码和验证码
        self.driver.find_element(By.NAME, "accounts").clear()
        self.driver.find_element(By.NAME, "pwd").clear()
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()
        # 定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("")
        self.driver.find_element(By.NAME, "pwd").send_keys("123456")
        self.verified_code = input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        self.driver.find_element(By.XPATH, "//form//button[text()='登录']").click()

        # 添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # 能找到商场首页用户的昵称,说明登陆成功,否则登录失败
        time.sleep(1)
        if len(self.driver.find_elements(By.XPATH, "//span[text()='liangjian']")) > 0:
            print("校验结果:登录成功")
        else:
            print("校验结果:登录失败")
        # # ------------------------------------------------------------------------------------------------------------------------
        # # 测试用例三:输入已注册的账号和正确验证码,不输入密码
        self.driver.find_element(By.NAME, "accounts").clear()
        self.driver.find_element(By.NAME, "pwd").clear()
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()
        # 定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("liangjian")
        self.driver.find_element(By.NAME, "pwd").send_keys("")
        self.verified_code = input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        self.driver.find_element(By.XPATH, "//form//button[text()='登录']").click()

        # 添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # 能找到商场首页用户的昵称,说明登陆成功,否则登录失败
        time.sleep(1)
        if len(self.driver.find_elements(By.XPATH, "//span[text()='liangjian']")) > 0:
            print("校验结果:登录成功")
        else:
            print("校验结果:登录失败")
        # # ------------------------------------------------------------------------------------------------------------------------
        # # 测试用例四:输入已注册的账号,正确验证码和错误密码
        self.driver.find_element(By.NAME, "accounts").clear()
        self.driver.find_element(By.NAME, "pwd").clear()
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()
        # 定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("liangjian")
        self.driver.find_element(By.NAME, "pwd").send_keys("789963")
        self.verified_code = input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        self.driver.find_element(By.XPATH, "//form//button[text()='登录']").click()

        # 添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # 能找到商场首页用户的昵称,说明登陆成功,否则登录失败
        time.sleep(1)
        if len(self.driver.find_elements(By.XPATH, "//span[text()='liangjian']")) > 0:
            print("校验结果:登录成功")
        else:
            print("校验结果:登录失败")
        # ------------------------------------------------------------------------------------------------------------------------
        # 测试用例五:输入已注册的账号,正确密码和错误验证码
        self.driver.find_element(By.NAME, "accounts").clear()
        self.driver.find_element(By.NAME, "pwd").clear()
        verify_input = self.driver.find_element(By.NAME, "verify")
        verify_input.clear()
        # 定位元素并输入测试用例
        self.driver.find_element(By.NAME, "accounts").send_keys("liangjian")
        self.driver.find_element(By.NAME, "pwd").send_keys("456852")
        self.verified_code = input("请输入验证码:")
        verify_input.send_keys(self.verified_code)
        self.driver.find_element(By.XPATH, "//form//button[text()='登录']").click()

        # 添加屏幕截图
        time.sleep(1)
        StoreDriver.getScreenshot()
        # 能找到商场首页用户的昵称,说明登陆成功,否则登录失败
        time.sleep(1)
        if len(self.driver.find_elements(By.XPATH, "//span[text()='liangjian']")) > 0:
            print("校验结果:登录成功")
        else:
            print("校验结果:登录失败")

首页功能模块类

#商城首页
import time
from common.utils import StoreDriver
from selenium.webdriver.common.by import By

class HomeStore():
    url=""
    driver=""
    def __init__(self):
        self.url = "http://49.235.61.184/"
        self.driver = StoreDriver.driver
        # 登录后已经在首页了,不需要再跳转
        self.driver.get(self.url)
        self.driver.maximize_window()
    def checkHome(self):
        #检查首页商品分类元素并成功点击
        self.driver.find_element(By.XPATH,"//*[@id='goods-category']/div/a/div").click()
        time.sleep(2)
        #StoreDriver.getScreenshot()
        # 返回商城首页,不要用这个定位元素的方法去使用,因为回来的时候找不到该元素而报错
        #self.driver.find_element(By.XPATH, "//span[text()='商城首页']").click()
        self.driver.back()
        time.sleep(1)
        # ----------------------------------------------------------------------------------------------
        #检查首页搜索框元素
        self.driver.find_element(By.XPATH,"//button[@id='ai-topsearch']").click()
        time.sleep(2)
        # StoreDriver.getScreenshot()
        self.driver.back()
        time.sleep(1)
        # ----------------------------------------------------------------------------------------------
        #检查首页“个人中心”元素
        self.driver.find_element(By.XPATH, "//span[text()='个人中心']").click()
        time.sleep(2)
        # StoreDriver.getScreenshot()
        self.driver.back()
        time.sleep(1)
        # ----------------------------------------------------------------------------------------------
        # 检查首页“我的收藏”元素
        # <span class="am-vertical-align-middle">我的收藏</span>
        self.driver.find_element(By.XPATH,"//span[text()='我的收藏']").click()
        time.sleep(0.5)
        #<p class="am-text-truncate">商品收藏</p>
        self.driver.find_element(By.XPATH,"//p[text()='商品收藏']").click()
        time.sleep(2)
        # StoreDriver.getScreenshot()
        self.driver.back()
        time.sleep(1)
        # ----------------------------------------------------------------------------------------------
        # 检查首页“购物车”元素
        #<span class="am-vertical-align-middle">购物车</span>
        self.driver.find_element(By.XPATH,"//span[text()='购物车']").click()
        time.sleep(2)
        # StoreDriver.getScreenshot()
        self.driver.back()
        time.sleep(1)
        # ----------------------------------------------------------------------------------------------
        # 检查首页“消息”元素
        #<span class="am-vertical-align-middle">消息</span>
        self.driver.find_element(By.XPATH,"//span[text()='消息']").click()
        time.sleep(2)
        # StoreDriver.getScreenshot()
        self.driver.back()
        time.sleep(1)

商品详情页模块类

#商品详情页
import time
from common.utils import StoreDriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By

class DetailStore:
    url=""
    driver=""
    def __init__(self):
        self.url="http://49.235.61.184/?s=goods/index/id/3.html"
        self.driver=StoreDriver.driver
        self.driver.get(self.url)

    # 注意:在异常登录中的测试用例,我是一个板块一个板块来测试的,并不是同时进行,
    # 为了看代码方便在全部异常测试用例单独执行完后我再去掉注释
    def productDetail(self):
        #收藏商品
        #<em class="goods-favor-text">收藏</em>
        self.driver.find_element(By.XPATH,"//*[@id='clearcontent']/div[2]/span").click()
        time.sleep(1)
        StoreDriver.getScreenshot()
        time.sleep(1)
        # ----------------------------------------------------------------------------------------------
        #取消收藏商品
        # 验证"已收藏"状态
        self.driver.find_element(By.XPATH, "//em[@class='goods-favor-text'][text()='已收藏']").click()
        time.sleep(1)
        StoreDriver.getScreenshot()
        # ----------------------------------------------------------------------------------------------
        #商品数量调整
        quantity=self.driver.find_element(By.XPATH, "//input[@class='am-form-field operate-number-input']")
        quantity.send_keys(Keys.CONTROL,"1")
        quantity.send_keys(Keys.DELETE)
        quantity.send_keys("3")
        time.sleep(1)
        StoreDriver.getScreenshot()
        # ----------------------------------------------------------------------------------------------
        #商品加入购物车
        # 通过文本定位
        self.driver.find_element(By.XPATH, "//button[contains(.,'加入购物车')]").click()
        time.sleep(1)
        StoreDriver.getScreenshot()
        # ----------------------------------------------------------------------------------------------
        #立即购买商品
        self.driver.find_element(By.XPATH, "//button[contains(.,'立即购买')]").click()
        time.sleep(1)
        StoreDriver.getScreenshot()

购物车功能模块类

# 购物车功能
import time
from common.utils import StoreDriver
from selenium.webdriver.common.by import By
from selenium.webdriver import Keys


class ShoppingTest():
    url = ""
    driver = ""

    def __init__(self):
        self.url = "http://49.235.61.184/?s=cart/index.html"
        self.driver = StoreDriver.driver
        self.driver.get(self.url)

    # 注意:在异常登录中的测试用例,我是一个板块一个板块来测试的,并不是同时进行,
    # 为了看代码方便在全部异常测试用例单独执行完后我再去掉注释
    def shoppingCart(self):
        time.sleep(2)
        #购物车中商品数量调整
        quantity_cart=self.driver.find_element(By.XPATH,"//input[@class='am-form-field am-radius input-clearout-element']")
        quantity_cart=self.driver.find_element(By.XPATH, "//*[@id='data-list-325']/td[3]/div/input")
        quantity_cart.send_keys(Keys.CONTROL,"a")
        quantity_cart.send_keys(Keys.DELETE)
        quantity_cart.send_keys("20")
        time.sleep(1)
        StoreDriver.getScreenshot()
        # ---------------------------------------------------------------------------------------
        # 收藏商品
        self.driver.find_element(By.XPATH,"//*[@id='data-list-359']/td[5]/div/a[2]").click()
        time.sleep(1)
        StoreDriver.getScreenshot()
        # ---------------------------------------------------------------------------------------
        # 商品取消收藏
        #运行失败的写法
       # # self.driver.find_element(By.XPATH, "//a[@class='am-color-grey-dark submit-ajax'][text()='已收藏']").click()
        # 运行成功的写法
        self.driver.find_element(By.XPATH, "//a[text()='已收藏']").click()
        self.driver.find_element(By.XPATH,"//*[@id='data-list-359']/td[5]/div/a[2]").click()
        time.sleep(1)
        StoreDriver.getScreenshot()
        # ---------------------------------------------------------------------------------------
        # 购物车商品结算
        #不成功的写法
        # self.driver.find_element(By.XPATH,"//*[@id='data-list-359']/td[1]/label/input ").click()
        # self.driver.find_element(By.XPATH, "//input[@type='checkbox'][@value='359']").click()
        #和之前同意协议一模一样的问题,<i class="am-icon-checked"> 图标遮挡了 checkbox。用 JS 点击
        checkbox = self.driver.find_element(By.XPATH, "//input[@type='checkbox'][@value='359']")
        self.driver.execute_script("arguments[0].click();", checkbox)
        time.sleep(0.5)
        self.driver.find_element(By.XPATH, "//button[text()='结算']").click()
        time.sleep(1)
        StoreDriver.getScreenshot()
        # ---------------------------------------------------------------------------------------
        #购物车全部收藏
        checkbox = self.driver.find_element(By.XPATH, "//input[@type='checkbox'][@value='1']")
        self.driver.execute_script("arguments[0].click();", checkbox)
        time.sleep(0.5)
        self.driver.find_element(By.XPATH, "//a[contains(@class,'nav-collect-submit')][text()='收藏']").click()
        time.sleep(0.5)
        StoreDriver.getScreenshot()

        # 删除商品
        #错误写法
        # self.driver.find_element(By.XPATH,"//*[@id='data-list-359']/td[1]/label/input").click()
        #换一种写法
        checkbox = self.driver.find_element(By.XPATH, "//input[@type='checkbox'][@value='359']")
        self.driver.execute_script("arguments[0].click();", checkbox)
        time.sleep(0.5)
        self.driver.find_element(By.XPATH,"//a[text()='删除']").click()
        time.sleep(1)
        #StoreDriver.getScreenshot()
        # 浮窗的id动态生成,所以不能用XPATH来查询,而选择用CSS_SELECTOR来查询
        # self.driver.find_element(By.CLASS_NAME, "am-modal-btn").click()
        self.driver.find_element(By.CSS_SELECTOR, "[data-am-modal-confirm]").click()
        time.sleep(1)
        StoreDriver.getScreenshot()

启动文件

from common.utils import StoreDriver
from cases import registerTest, loginTest, homeTest, detailTest, shoppingTest

if __name__=="__main__":
    #注册
    register_test = registerTest.RegisterTest()
    register_test.SucessRegister()
    register_test.FailRegister()
    #登录
    login_test=loginTest.LoginTest()
    login_test.sucessLogin()
    login_test.failLogin()
    #商城首页
    home_test=homeTest.HomeStore()
    home_test.checkHome()
    #商品详情页
    detail_test=detailTest.DetailStore()
    detail_test.productDetail()
    #购物车功能
    shop_test=shoppingTest.ShoppingTest()
    shop_test.shoppingCart()


性能测试

注:使用jmeter进行性能测试

1.接口测试

对登录、首页、商品搜索框、商品详情页、加入购物车、购物车列表、创建购买订单、订单查询、个人中心、商品收藏这10个接口进行接口测试。


2.压力测试

对这10个接口进行压力测试。服务器 CPU 使用率,磁盘读写负载,内存占用, 网络收发流量通过对这4个压力测试的指标来查看测试情况。

从监听器、聚合报告的结果来看:

在接口层面,商品详情页和商品搜索框,这两个接口响应耗时远高于其他页面;

在硬件资源层面,监听器的监控图显示 CPU、内存、磁盘全程空闲,无硬件瓶颈。

出现接口慢的情况,不是电脑配置不够,是接口内部SQL 查询效率低;


3.稳定性测试

通过对接口进行稳定性测试,线程平稳加压至 8 个并发,全程稳定运行 1 小时,零报错、吞吐量平稳、内存无泄漏,系统长时间运行可用。

和压力测试一样出现了商品详情页和商品搜索 接口 SQL 查询低效框响应延迟高的情况。



bug管理

1.注册功能模块

手机注册

bug 编号:BUG-PHONE-001
当前模块:注册页面 -- 手机注册
测试场景:正确的手机号格式、密码格式和验证码,并点击注册
预期结果:注册成功并跳转到商城系统首页
实际结果:验证码更新,同时页面提示 “发送失败 [MissingAccessKeyId]”,无法完成注册
严重程度:阻塞

邮箱注册

bug 编号:BUG-EMAIL-002
当前模块:注册页面 - -邮箱注册
测试场景:输入正确电子邮箱格式、密码格式和验证码,并点击注册
预期结果:注册成功并跳转到商城系统首页
实际结果:验证码更新,页面提示 “提示:发送失败[SMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting]”,无法完成注册
严重程度:阻塞


2.首页功能模块

bug 编号:BUG-HOME-001
当前模块:系统首页 -- 轮播图
测试场景:在商城首页,观察轮播图切换,点击轮播图中的 “iPhone 14 pro” 宣传图。
预期结果:轮播图正常自动切换,点击宣传图后跳转至对应的商品的详情页面
实际结果:轮播图正常自动切换,但点击 “iPhone 14 pro” 宣传图后,无法跳转至对应商品详情页
严重程度:一般


3.业务管理功能模块

订单管理

bug 编号:BUG-BUSINESS-ORDER-001
当前模块:业务管理 -- 订单管理
测试场景:在订单确认页面选择支付方式并提交订单,后续在订单列表查看并管理订单
预期结果:可选择支付方式,提交订单后生成有效订单,在订单列表中可对订单进行管理(如查看、支付、取消等)
实际结果:订单确认页面无可用支付方式(提示 “没有支付方式”),无法提交订单,订单列表为空,无法验证订单管理功能
严重程度:严重


订单售后

bug 编号:BUG-BUSINESS-AFTERSALE-002
当前模块:业务管理 -- 订单售后
测试场景:生成订单后,在订单售后页面对订单进行售后处理(如申请退款、退换货)
预期结果:可在订单售后列表中找到对应订单,发起售后申请并进行管理
实际结果:因无支付方式无法提交订单,订单列表为空,无法进入售后处理环节,无法验证订单售后功能
严重程度:严重


商品评价

bug 编号:BUG-BUSINESS-COMMENT-003
对应模块:业务管理 -- 商品评论
测试场景:完成订单支付后,在商品评论页面对购买的商品进行评价
预期结果:可在商品评论列表中找到对应订单商品,填写并提交评价内容
实际结果:因无法提交订单,无有效订单商品,商品评论列表为空,无法验证商品评价功能
严重程度:严重



测试总结

1.bug统计

本次测试发现6个bug,按严重程度分类如下:

1.阻塞:2个(手机注册、邮箱注册功能失效)

2.严重:3个(订单管理、订单售后、商品评价功能失效)

3.一般:1个(轮播图点击无跳转)

4.轻微:0个

2.测试结论

本次测试商场系统,在在登录、商品详情、个人中心、商品收藏、界面正常等方面表现良好,但存在交易流程阻断、注册渠道受限、商品导流失效等关键问题,目前不具备上线条件

建议开发团队优先修复bug程度为阻塞和严重的功能模块,修复后进行回归验证,确保上线前核心链路稳定。待注册、交易等功能完全正常,数据计算准确,导流功能可用后,可再次评估系统上线可行性。

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐