电商商城系统测试报告
项目背景
随着数字经济不断发展,线上购物已成为大众主要消费方式,电商行业发展日趋成熟。为满足日常线上交易需求,本次搭建了集商品浏览、购物下单、订单管理等功能于一体的电商商城系统。为保障系统稳定可靠、使用体验良好,我围绕功能、界面、性能、兼容性等多个维度开展全面测试,排查潜在问题,为系统正常运行提供质量保障。
测试范围
功能测试、界面测试、自动化测试、性能测试。
项目功能
电商商城系统主要实现了登录页面、首页功能、商品详情页、购物车功能、个人中心、业务管理、商品收藏页面功能。
- 登录页面:登录页面支持账号、手机、邮箱注册与登录,同时提供找回密码功能。登录和注册有格式、验证码等进行效验,保障用户账号安全与操作准确性。
- 首页功能:可在首页功能看到商品分类,展开分类栏可看到完整的子分类;轮播图图片展示完整,点击轮播图可成功跳转到其他页面,搜索框可精准搜索商品出来。为用户提供便捷的商品浏览与检索入口。
- 商品详情页:在首页能任意点击商品并成功跳转到商品详情页,能对商品进行收藏的添加和取消,点击商品可以看到商品细节放大图,还可以对商品进行购物车添加以及购买,未选规格时会提示用户,满足用户浏览与购买需求。
- 购物车功能:在首页顶部浏览框点击“购物车”,跳转到购物车功能页面,也可以对商品进行收藏,对商品的数量进行增加和减少,有结算下单功能。调整失败、操作成功时均有对应提示,可便捷管理待购商品,为结算下单提供支撑。
- 个人中心:在首页顶部浏览框点击“个人中心”,跳转到个人中心页面,可看到业务管理、财产中心和资料管理功能。可以对个人信息进行修改,修改操作会进行严格的格式与合法性校验。修改成功或失败均有对应提示,地址管理支持新增、编辑、删除收货地址,保障用户个人信息与收货信息的准确性和安全性。
- 业务管理和商品收藏页面功能:业务管理没有支持功能的实现。商品收藏页面可通过导航栏或个人中心进入,支持条数设置、页码跳转、商品搜索与删除功能。条数设置和页码跳转存在边界值校验,可自动修正无效输入,便于用户高效管理收藏商品。
设计测试用例

功能测试
登录功能
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程度为阻塞和严重的功能模块,修复后进行回归验证,确保上线前核心链路稳定。待注册、交易等功能完全正常,数据计算准确,导流功能可用后,可再次评估系统上线可行性。
更多推荐




所有评论(0)