ECShop测试用例设计与执行:等价类、边界值与场景法实战

ECShop测试用例设计与执行:等价类、边界值与场景法实战 简介本资源是一份面向软件测试工程师、电商系统QA人员及高校计算机专业学生的ECShop电商平台专项测试用例文档聚焦功能验证与质量保障实践。文档结构完整覆盖商品前台展示含信息显示、搜索、分类、展示方式、留言板、全量商品、商品后台管理列表、新增、分类、评论及会员管理等核心模块每项均细化测试点与执行逻辑具备强实操性与复用价值。资源为单个Word文档.doc格式大小414KB内容详实、排版规范含版本修订记录、目录索引与多级测试条目便于直接导入测试管理流程或作为教学案例参考。目前已有1124人学习下载适合开展电商系统功能测试设计、新人测试岗实训或课程项目测试方案构建。1. 这不是一份普通文档ECShop测试用例是功能验证的「结构化执行蓝图」很多人看到《ECShop系统测试用例.doc》第一反应是“又一份过时的Word文档”但实际拆开来看它是一套可直接驱动手工执行、具备方法论支撑、覆盖前后台全链路的电商功能验证体系。它不依赖自动化框架却通过等价类划分、边界值分析、场景法三大经典测试设计技术在2016年就构建出对商品管理、会员体系、订单流程、权限控制四大核心模块的完整覆盖——这意味着哪怕今天你用PHP 8.2重装ECShop 4.x这份用例仍能精准定位“分类筛选失效”“库存扣减异常”“管理员权限继承断裂”等典型问题。适合两类人一是刚接手遗留ECShop项目的测试工程师需要快速建立验证基线二是开发自测阶段想绕过黑盒盲测、用结构化输入验证逻辑边界的后端同学。它不教你写Selenium脚本但教会你怎么把“用户登录”拆成3个等价类2个边界值1个异常流它不提AI生成却用真实字段如“精品推荐/新品上市/热卖商品”三栏并列展示告诉你什么叫可验证的业务语义。2. 测试用例设计方法落地从等价类到边界值的参数化实现2.1 等价类划分法在商品搜索中的参数建模ECShop商品搜索测试用例编号ECShop-Portal-SPGL-002并非简单输入关键词而是将输入域划分为有效等价类与无效等价类并映射到具体参数组合输入维度有效等价类示例无效等价类示例对应ECShop前端字段关键词长度2–20字符含中文空字符串、单字符、21字符keywords表单字段分类ID存在的分类ID如cat_id5不存在的IDcat_id9999、非数字cat_idabcURL参数cat或隐藏域价格区间min_price100max_price500min_price500max_price100逻辑倒置、负数表单min_price/max_price提示ECShop 2.7.3版本中搜索接口实际调用search.php?keywordsxxxcat5min_price100max_price500需在Postman中构造GET请求验证返回JSON是否含goods_list数组且goods_name匹配关键词。若返回空数组但HTTP状态码为200说明等价类未覆盖“分类下无商品”的边界场景。2.1.1 手动构造测试数据验证等价类有效性# 使用curl模拟有效等价类搜索关键词分类 curl http://localhost/ecshop/search.php?keywords手机cat5min_price100max_price500 \ -H Accept: application/json \ -s | jq .goods_list | length # 预期输出大于0的整数如32 # 模拟无效等价类空关键词 不存在分类ID curl http://localhost/ecshop/search.php?keywordscat9999 \ -H Accept: application/json \ -s | jq .error # 预期输出搜索关键词不能为空 或 指定分类不存在这段命令验证了两个关键点一是ECShop搜索逻辑对keywords为空有明确拦截而非静默返回空结果二是cat参数校验发生在数据库查询前。若实际返回goods_list: []而无错误提示则说明等价类设计遗漏了“参数存在但值无效”的分支需补充用例ECShop-Portal-SPGL-002-04。2.2 边界值分析法在商品列表分页中的精确控制商品后台列表用例ECShop-Admin-SPGL-001的分页测试不是点“下一页”那么简单。ECShop默认每页显示15条其分页逻辑依赖URL参数page和size边界值需覆盖page0→ 应重定向至page1或返回400错误page1→ 显示第1–15条假设总商品≥15page最大页数→ 显示最后不足15条的剩余记录page最大页数1→ 返回空列表或4042.2.1 用SQL预置边界数据验证分页健壮性-- 在ECShop数据库中插入恰好16条测试商品触发第2页仅1条记录的边界 INSERT INTO ecs_goods (goods_name, cat_id, shop_price, is_on_sale, add_time) VALUES (边界测试商品01, 5, 99.00, 1, UNIX_TIMESTAMP()-1000), (边界测试商品02, 5, 99.00, 1, UNIX_TIMESTAMP()-900), -- ... 插入14条省略 (边界测试商品16, 5, 99.00, 1, UNIX_TIMESTAMP()-1);执行后访问后台URLhttp://localhost/ecshop/admin/goods.php?actlistpage2size15检查HTML源码中table classlist_table内的tr数量若为1 → 分页逻辑正确第2页仅剩1条若为0或15 → 存在LIMIT偏移计算错误常见于LIMIT (page-1)*size, size未处理page1时的负偏移注意ECShop 2.7.x的goods.php中分页SQL为SELECT * FROM ecs_goods LIMIT .(($page-1)*$size)., $size当$page0时会生成LIMIT -15,15导致MySQL报错。因此用例中“点击第一页”必须验证page0被拦截而非等待DB层报错。2.3 场景法驱动的会员登录全流程验证会员登录用例ECShop-HYGL-001采用场景法将“用户成功登录→跳转首页→显示欢迎信息→同步购物车”作为原子场景而非割裂测试表单提交。其关键在于前置状态构造数据库中预置用户INSERT INTO ecs_users (user_name, password, email, is_validated) VALUES (testuser, e10adc3949ba59abbe56e057f20f883e, testecshop.com, 1);MD5密码123456清空session删除data/sessions/下所有文件手动设置cookiecurl -b PHPSESSIDabc123 http://localhost/ecshop/user.php?actlogin2.3.1 自动化验证登录后状态一致性# login_flow_test.py验证登录后3个关键状态 import requests import re session requests.Session() # 步骤1获取登录页CSRF tokenECShop 2.7.3需token login_page session.get(http://localhost/ecshop/user.php?actlogin) token re.search(rinput typehidden nametoken value([^]), login_page.text).group(1) # 步骤2提交登录模拟真实表单 login_data { username: testuser, password: 123456, remember: 0, token: token } resp session.post(http://localhost/ecshop/user.php?actact_login, datalogin_data) # 步骤3验证3个状态点 assert 欢迎回来 in resp.text, 首页未显示欢迎信息 assert session.cookies.get(ECS[user_id]), 未设置user_id cookie assert len(re.findall(rcart\.php\?actedit, resp.text)) 0, 购物车链接未渲染此脚本强制要求ECShop返回的HTML包含业务语义文本“欢迎回来”、关键cookieECS[user_id]和功能入口购物车链接比单纯检查HTTP状态码200更贴近真实用户感知。3. ECShop测试执行的关键路径与环境配置3.1 测试环境搭建避开PHP版本与扩展陷阱ECShop 2.7.x官方要求PHP 5.2–5.6但在实际测试中常需兼容更高版本。以下配置可避免常见失败组件推荐版本必须启用的PHP扩展关键配置项PHP7.4兼容ECShop 2.7.3补丁版mbstring,gd,curl,xmlmbstring.func_overload0,date.timezoneAsia/ShanghaiMySQL5.7—sql_modeSTRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTIONWeb服务器Apache 2.4—mod_rewrite启用.htaccess规则生效提示ECShop安装时若提示“您的服务器不支持GD库”需确认phpinfo()中gd模块状态为enabled且GD Version显示bundled (2.1.0 compatible)。若为2.3.3PHP 7.4默认需在includes/cls_image.php中注释掉image_type_to_extension()调用因其在新版GD中已被废弃。3.1.1 快速部署测试数据库并导入基础数据# 创建测试库并授权 mysql -u root -p -e CREATE DATABASE ecshop_test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; mysql -u root -p -e GRANT ALL PRIVILEGES ON ecshop_test.* TO ecshoplocalhost IDENTIFIED BY ecshop123; # 导入ECShop标准SQL从install/data/目录获取 mysql -u ecshop -pecshop123 ecshop_test /var/www/ecshop/install/data/mysql.sql # 插入测试用例必需的分类与商品简化版 mysql -u ecshop -pecshop123 ecshop_test -e INSERT INTO ecs_category (cat_id, cat_name, parent_id) VALUES (5, 手机配件, 0); INSERT INTO ecs_goods (goods_name, cat_id, shop_price, is_on_sale) VALUES (测试耳机, 5, 88.00, 1), (测试充电线, 5, 25.00, 1); 此步骤确保测试环境具备最小可行数据集避免因ecs_category为空导致“商品分类展示”用例直接失败。3.2 测试数据准备构造可复现的脏数据场景ECShop测试用例中大量依赖“脏数据”验证健壮性例如商品价格为负数UPDATE ecs_goods SET shop_price-10.00 WHERE goods_id1;→ 验证前台是否过滤显示会员邮箱格式异常UPDATE ecs_users SET emailinvalid-email WHERE user_id1;→ 验证后台编辑时是否拦截订单状态非法值UPDATE ecs_order_info SET order_status99 WHERE order_id1;→ 验证订单列表是否崩溃3.2.1 用Python批量生成测试商品数据# generate_test_goods.py生成100条带边界值的商品 import random import string from datetime import datetime def random_name(): return .join(random.choices(string.ascii_letters, k8)) str(random.randint(100, 999)) goods_sql [] for i in range(1, 101): price round(random.uniform(0.01, 9999.99), 2) # 注入边界价格0.01, 9999.99, -1.00脏数据 if i % 33 0: price 0.01 elif i % 33 1: price 9999.99 elif i % 33 2: price -1.00 goods_sql.append(f({random_name()}, 5, {price}, 1, {int(datetime.now().timestamp())})) with open(insert_goods.sql, w) as f: f.write(INSERT INTO ecs_goods (goods_name, cat_id, shop_price, is_on_sale, add_time) VALUES\n) f.write(,\n.join(goods_sql) ;)运行后执行mysql -u ecshop -pecshop123 ecshop_test insert_goods.sql即可获得含价格边界值的商品集直接用于“商品列表排序”“价格搜索”等用例验证。3.3 前后台测试执行要点绕过缓存与权限校验ECShop存在两级缓存模板缓存temp/caches/与SQL查询缓存data/caches/。执行测试前必须清除# 清除所有缓存避免旧模板干扰 rm -rf /var/www/ecshop/temp/caches/* rm -rf /var/www/ecshop/data/caches/* # 后台管理员登录后还需禁用浏览器缓存F12→Network→Disable cache # 或在URL后加时间戳admin/goods.php?actlistv1623456789注意ECShop后台权限管理用例4.1.3中“管理员权限分配”功能依赖ecs_admin_action表。若测试时发现勾选权限后不生效先检查该表是否存在catalog商品管理、users会员管理等action_code记录。缺失则需执行admin/includes/inc_menu.php中的初始化SQL。4. 测试结果分析从实际结果栏到缺陷根因定位4.1 实际结果记录规范超越“通过/失败”的三层断言ECShop测试用例文档中的“实际结果”栏常被简单填写“通过”或“失败”但专业做法应记录三层信息界面层DOM元素是否存在如div classrecommend是否渲染数据层数据库记录是否变更如订单创建后ecs_order_info新增记录协议层HTTP响应头与状态码如添加商品后返回Location: goods.php?actaddgoods_id1234.1.1 用Chrome DevTools捕获关键断言证据以“添加商品”用例ECShop-Admin-SPGL-002为例界面层验证在Elements面板搜索h2添加新商品/h2确认表单加载完整数据层验证在Console执行copy(JSON.stringify($$(input[namegoods_name])[0].value))复制商品名再查数据库SELECT goods_name FROM ecs_goods WHERE goods_name测试商品;协议层验证Network标签中找到goods.php?actinsert请求检查Response Headers中X-ECShop-Status: successECShop自定义头及Location重定向地址提示ECShop 2.7.3在admin/goods.php中对成功插入返回header(Location: goods.php?actlistgoods_id$goods_id);若重定向URL中goods_id为空说明$goods_id未正确获取需检查lib_goods.php中goods_add()函数的return $db-insert_id();是否被异常中断。4.2 缺陷分类与根因映射从现象反推代码位置当测试发现“商品分类展示错乱”用例1.1.3失败按以下路径定位现象可能根因检查文件验证命令分类树只显示一级category_tree()函数未递归includes/lib_main.phpgrep -n function category_tree includes/lib_main.php子分类商品不显示get_cat_goods()中SQL JOIN条件错误includes/lib_goods.phpgrep -A 10 FROM .*ecs_goods g includes/lib_goods.php分类图标丢失themes/default/category_tree.lbi中img src{$lang.img_path}/路径错误themes/default/category_tree.lbils -l themes/default/images/确认图标文件存在4.2.1 用SQL日志追踪分类查询逻辑开启MySQL慢查询日志捕获ECShop分类SQL-- 在MySQL中执行 SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 0; SET GLOBAL log_output TABLE; -- 执行前台分类页面访问 -- 查询日志 SELECT query_time, sql_text FROM mysql.slow_log WHERE sql_text LIKE %ecs_category% ORDER BY start_time DESC LIMIT 1;若日志中出现SELECT * FROM ecs_category WHERE parent_id0 AND is_show1但无子查询则说明category_tree()未触发递归需检查lib_main.php中该函数是否被if ($cat[is_show])提前退出。5. 进阶技巧将静态测试用例转化为可维护的验证脚本5.1 用Bash脚本自动化高频用例回归针对“商品前台展示”用例1.1.1编写可定时执行的回归脚本#!/bin/bash # ecshop_smoke_test.sh URLhttp://localhost/ecshop # 检查首页是否返回200且含三个推荐区块 if curl -s -o /dev/null -w %{http_code} $URL/index.php | grep -q 200; then INDEX_HTML$(curl -s $URL/index.php) if echo $INDEX_HTML | grep -q 精品推荐 \ echo $INDEX_HTML | grep -q 新品上市 \ echo $INDEX_HTML | grep -q 热卖商品; then echo $(date): Smoke test PASSED exit 0 else echo $(date): Missing recommendation blocks exit 1 fi else echo $(date): Homepage HTTP error exit 1 fi赋予执行权限后加入crontab0 2 * * * /opt/ecshop/ecshop_smoke_test.sh /var/log/ecshop_smoke.log 21每日凌晨2点自动验证首页核心功能。5.2 用正则表达式提取测试用例中的关键字段ECShop测试用例文档中用例编号如ECShop-Portal-SPGL-001隐含模块与类型编码编码段含义示例解析ECShop系统标识所有ECShop项目统一Portal/Admin前台/后台Portal用户端Admin管理后台SPGL模块缩写SP商品ShangPinGL管理GuanLi001用例序号按功能复杂度递增5.2.1 提取全部用例编号并统计模块分布# 从Word文档转为txt后执行需先用pandoc转换 pandoc ECShop系统测试用例.doc -t plain -o cases.txt # 提取所有用例编号并统计 grep -oE ECShop-[A-Za-z]-[A-Z]{2,4}-[0-9]{3} cases.txt | \ awk -F- {print $2,$3} | \ sort | uniq -c | sort -nr输出示例12 Admin SPGL 8 Portal SPGL 5 Admin HYGL 3 Portal HYGL这直接反映测试重心后台商品管理12个用例是最高优先级符合ECShop作为B2C后台系统的定位。5.3 权限测试的终极验证角色-操作矩阵表ECShop后台权限管理用例4.1.3需验证角色与操作的映射关系。手动测试易遗漏可用矩阵表驱动角色商品列表添加商品会员列表修改管理员预期结果超级管理员✓✓✓✓全部可见商品专员✓✓✗✗仅商品模块客服专员✗✗✓✗仅会员模块5.3.1 用curl验证权限拦截有效性# 以商品专员角色登录已知其admin_id5 # 获取其session ID SESSION_ID$(curl -s http://localhost/ecshop/admin/login.php \ -d usernameadmin5 -d password123456 \ -I | grep -i set-cookie | awk -FPHPSESSID {print $2} | cut -d; -f1) # 尝试访问会员列表应被拒绝 curl -s -b PHPSESSID$SESSION_ID \ http://localhost/ecshop/admin/users.php?actlist \ -I | head -1 # 预期输出HTTP/1.1 302 Found重定向到login.php若返回200 OK说明权限控制失效需检查admin/includes/init.php中admin_priv()函数是否正确调用sys_msg()拦截。ECShop测试用例文档的价值从来不在其Word格式而在于它把“商品能否被搜索”“会员能否修改地址”这些模糊需求翻译成可逐条执行、可逐行验证、可逐层归因的技术指令。当你把ECShop-Admin-SPGL-001中的“点击‘下一页’前往第二页”变成curl命令把“留言内容显示”变成grep正则你就已经完成了从文档阅读者到系统解构者的跨越。本文还有配套的精品资源点击获取