ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

ECShop功能测试用例设计与自动化实践

ECShop功能测试用例设计与自动化实践 简介本资源是一份面向软件测试工程师、电商系统QA人员及高校计算机专业学生的ECShop电商平台专项测试用例文档聚焦功能验证与质量保障实践。文档结构完整覆盖商品前台展示含信息显示、多维度搜索、三级分类展示、留言板及全量商品校验、商品后台管理列表查看、新增商品、分类维护、用户评论处理及会员管理等核心模块每项均配有细化测试点与执行逻辑具备强实操指导性。资源为单个Word文档.doc格式文件大小414KB轻量易读适合作为测试用例设计参考模板或教学案例直接复用。内容预览显示其采用标准测试文档规范含版本记录、目录索引与模块化编号体系便于团队协作与迭代更新。目前已有1124人学习下载适合初学者建立电商系统测试思维也便于资深测试人员快速提取关键场景用例。1. ECShop系统测试用例不是文档模板而是功能验证的执行契约很多人拿到“ECShop系统测试用例.doc”第一反应是找现成用例直接跑但实际工作中这份文档的价值不在于“有没有”而在于它是否能精准映射ECShop v2.7.3主流稳定版的真实业务路径——比如商品发布后能否被搜索命中、会员积分在订单结算时是否实时扣减、后台导出订单Excel时中文字段是否乱码。这些都不是通用测试点而是ECShop特有的数据流闭环。它面向的是三类人刚接手ECShop二次开发的测试工程师需快速建立业务敏感度、负责验收外包商城项目的QA负责人需判断用例覆盖是否兜住核心交易链路、以及做兼容性加固的运维人员需验证PHP 7.4MySQL 5.7环境下缓存权限变更对测试结果的影响。本文不讲抽象理论只拆解如何从零构建一份可执行、可回溯、能进CI流水线的ECShop测试用例集——重点落在“功能测试用例怎么写”这个高频痛点上所有步骤均基于真实ECShop源码结构和数据库表设计如ecs_goods、ecs_order_info拒绝脱离上下文的空泛模板。2. 用等价类边界值法覆盖ECShop核心功能模块的最小用例集ECShop的功能测试不能靠穷举必须抓住其业务模型的关键约束。以“商品价格输入”为例前端表单看似简单但后端校验逻辑嵌套在admin/goods.php的handle_goods()函数中涉及market_price市场价、shop_price本店价、promote_price促销价三者关系校验。若仅按UI字段罗列用例会漏掉“当market_price0时shop_price允许为负数”这类反直觉分支。因此我们采用等价类划分边界值强化的组合策略先锁定ECShop的6个高风险模块再为每个模块生成可落地的测试用例。2.1 商品管理模块价格字段的三重校验边界ECShop对价格字段的校验逻辑集中在includes/lib_common.php的is_valid_price()函数它要求shop_price必须大于0且小于market_price当market_price 0时promote_price必须介于shop_price与market_price之间所有价格字段均需通过floatval()强制转换小数位超过2位会被截断。据此设计等价类输入类型等价类描述典型值预期结果有效价格market_price100,shop_price80,promote_price75100,80,75保存成功数据库ecs_goods中对应字段存入精确值边界失效shop_price0低于下限100,0,75前端提示“本店价不能为空”$_POST[shop_price]未进入handle_goods()处理流程类型越界shop_priceabc非数字字符串100,abc,75floatval(abc)返回0触发下限校验失败同上小数精度shop_price80.123超2位小数100,80.123,75数据库存入80.12需在用例中明确检查SELECT shop_price FROM ecs_goods WHERE goods_idXXX提示执行时需开启ECShop后台的“显示错误信息”admin/includes/init.php中设置error_reporting(E_ALL)否则floatval()截断不会报错仅静默处理。2.2 会员注册模块邮箱唯一性与密码强度的场景法组合ECShop的会员注册逻辑分散在user.php前台和admin/users.php后台批量导入但共用includes/lib_passport.php的register()方法。该方法对邮箱校验分两层前端JS正则/^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$/后端SQL查询SELECT user_id FROM ecs_users WHERE email xxx。若仅测试单个邮箱无法暴露“大小写敏感导致重复注册”的缺陷ECShop默认MySQL配置下email字段为utf8_general_ci不区分大小写。因此采用场景法设计用例2.2.1 注册流程全链路验证# 步骤1用curl模拟注册请求绕过前端JS校验 curl -X POST http://localhost/ecshop/user.php?actact_register \ -d usernametestuser1 \ -d emailTESTEXAMPLE.COM \ -d password123456 \ -d confirm_password123456 \ -i # 预期返回HTTP 200响应体含注册成功 # 步骤2立即用相同邮箱但小写形式重试 curl -X POST http://localhost/ecshop/user.php?actact_register \ -d usernametestuser2 \ -d emailtestexample.com \ -d password123456 \ -d confirm_password123456 \ -i # 预期返回HTTP 200但响应体含Email地址已经存在 —— 证明邮箱去重生效注意上述命令需在ECShop根目录下执行且确保data/config.php中$db_host指向本地MySQL。若返回500错误检查data/目录权限是否为755ECShop缓存权限问题常导致此错误。2.2.2 密码强度规则逆向推导ECShop未在代码中明确定义密码强度但通过分析lib_passport.php的genpwd()和check_user()调用链发现其实际依赖md5($password.$ec_salt)生成密文且$ec_salt由rand(1000,9999)生成。这意味着密码本身无长度/字符类型限制空密码也可注册但登录时因md5(.$salt)固定而被拦截真正的强度控制在前端JSif (pwd.length 6) { alert(密码不能少于6位); }。因此用例必须包含password123455位→ 前端拦截不发请求password1234566位纯数字→ 后端接受但安全性低需在用例备注中标注“建议增加大小写字母校验”。2.3 订单结算模块库存扣减与支付状态的事务一致性验证ECShop订单创建的核心逻辑在flow.php的do_submit_order()函数它在一个MySQL事务中完成检查商品库存SELECT store_count FROM ecs_goods WHERE goods_idXXX FOR UPDATE插入订单主表ecs_order_info插入订单商品明细ecs_order_goods更新库存UPDATE ecs_goods SET store_count store_count - XXX WHERE goods_idXXX。若第4步失败如触发store_count 0的CHECK约束整个事务应回滚。但ECShop v2.7.3默认未启用严格模式UPDATE失败时仅返回警告事务继续提交导致“订单已生成但库存未扣减”的脏数据。为此设计边界用例场景操作验证点库存临界点将商品A库存设为1同时发起2个并发下单请求使用Apache Bench检查ecs_order_info中是否仅1条订单ecs_goods.store_count是否为0支付超时创建订单后手动将ecs_order_info.pay_status设为PS_UNPAYED再调用payment_return()验证order_status是否仍为OS_UNCONFIRMED避免“未付款订单被标记为已完成”# 并发下单压测验证库存扣减原子性 ab -n 2 -c 2 -p order_data.txt -T application/x-www-form-urlencoded \ http://localhost/ecshop/flow.php?stepdone # order_data.txt内容 # shipping1payment1invoice_noconsignee张三country1province2city3district4addressXX路1号zipcode100000tel13800138000mobile13800138000sign_buildingemailtestecshop.combest_timepostscripthow_oos1need_inv0inv_payeeinv_contentbill_country1bill_province2bill_city3bill_district4bill_addressXX路1号bill_zipcode100000bill_tel13800138000bill_emailtestecshop.comaccept_name张三shipping_addrXX路1号shipping_zipcode100000shipping_tel13800138000shipping_mobile13800138000shipping_emailtestecshop.comshipping_best_timeshipping_postscriptshipping_how_oos1shipping_need_inv0shipping_inv_payeeshipping_inv_contentshipping_bill_country1shipping_bill_province2shipping_bill_city3shipping_bill_district4shipping_bill_addressXX路1号shipping_bill_zipcode100000shipping_bill_tel13800138000shipping_bill_emailtestecshop.comshipping_accept_name张三goods_id1goods_number1spec0extension_codeparent0is_gift0goods_attr0goods_price100goods_amount100goods_weight0.5goods_volume0.1goods_number1goods_attr_id0goods_attr_value0goods_attr_price0goods_attr_weight0goods_attr_volume0goods_attr_number1goods_attr_spec0goods_attr_extension_codegoods_attr_parent0goods_attr_is_gift0goods_attr_goods_price0goods_attr_goods_amount0goods_attr_goods_weight0goods_attr_goods_volume0goods_attr_goods_number1提示ab命令需提前安装apt install apache2-utilsorder_data.txt中的goods_id1需替换为实际测试商品ID。执行后检查MySQLSELECT COUNT(*) FROM ecs_order_info WHERE order_status1; SELECT store_count FROM ecs_goods WHERE goods_id1;—— 两者应严格对应。3. 将测试用例转化为可自动执行的PHP脚本并集成到CI环境手工执行上述用例效率低下且不可追溯。ECShop虽无原生API测试框架但可利用其内置的init.php加载机制构建轻量级自动化验证脚本。关键在于绕过Session校验、复用ECShop数据库连接并捕获trigger_error()抛出的异常。3.1 构建基础测试执行器复用ECShop核心类在ECShop根目录创建test_runner.php内容如下?php // test_runner.php - ECShop功能测试执行器 define(IN_ECS, true); require_once includes/init.php; // 加载ECShop全局环境 require_once includes/lib_main.php; require_once includes/lib_order.php; // 关闭Session避免测试干扰用户登录态 session_write_close(); ini_set(display_errors, On); class EcshopTestRunner { private $db; public function __construct() { $this-db $GLOBALS[db]; // 复用ECShop数据库连接 } // 测试商品价格边界验证shop_price0是否被拦截 public function testGoodsPriceZero() { $goods_id 1; // 假设测试商品ID为1 $sql SELECT market_price, shop_price FROM . $GLOBALS[ecs]-table(goods) . WHERE goods_id $goods_id; $row $this-db-getRow($sql); if ($row[shop_price] 0) { trigger_error(商品ID $goods_id 的shop_price为0违反ECShop价格校验规则, E_USER_ERROR); } echo ✓ 商品价格校验通过\n; } // 测试会员邮箱唯一性插入重复邮箱 public function testUserEmailUniqueness() { $email test_duplicateecshop.com; $sql SELECT COUNT(*) FROM . $GLOBALS[ecs]-table(users) . WHERE email $email; $count $this-db-getOne($sql); if ($count 0) { trigger_error(邮箱 $email 在ecs_users表中重复存在, E_USER_ERROR); } echo ✓ 会员邮箱唯一性校验通过\n; } } // 执行测试 $runner new EcshopTestRunner(); $runner-testGoodsPriceZero(); $runner-testUserEmailUniqueness(); ?逻辑说明该脚本直接引入ECShop的init.php获得完整的数据库连接$GLOBALS[db]和表名前缀$GLOBALS[ecs]-table()避免重复配置数据库参数。trigger_error()用于在条件不满足时抛出致命错误使脚本退出并返回非0状态码便于CI工具如Jenkins识别失败。3.2 在Jenkins中配置ECShop测试流水线将test_runner.php纳入版本管理后在Jenkins中创建新任务配置构建步骤3.2.1 构建环境准备# Jenkins执行Shell脚本 # 1. 清理旧环境 rm -rf /var/www/ecshop-test # 2. 部署最新ECShop代码假设从Git拉取 git clone https://github.com/ecshop/ecshop.git /var/www/ecshop-test cd /var/www/ecshop-test # 3. 配置数据库连接 sed -i s/localhost/mysql-host/g data/config.php sed -i s/root/ecshop_user/g data/config.php sed -i s//ecshop_pass/g data/config.php # 4. 初始化测试数据库使用ECShop自带SQL mysql -h mysql-host -u ecshop_user -pecshop_pass ecshop_test install/data/mysql.sql3.2.2 执行自动化测试# 运行测试脚本 php /var/www/ecshop-test/test_runner.php # 检查退出码非0则构建失败 if [ $? -ne 0 ]; then echo ECShop功能测试失败详情见日志 exit 1 fi echo ECShop功能测试全部通过参数说明sed命令用于动态替换数据库配置适应不同环境开发/测试/预发。mysql命令导入install/data/mysql.sql确保测试库结构与ECShop版本一致。Jenkins会捕获php命令的退出码exit 1触发构建失败并发送告警邮件。3.3 用SQL查询验证测试结果的可靠性自动化脚本只能验证“是否抛错”但真实业务中需确认数据状态。例如订单结算测试后必须验证ecs_order_info与ecs_goods的数据一致性。为此在test_runner.php末尾添加SQL断言// 断言订单商品数量等于库存扣减量 public function assertOrderStockConsistency() { // 查询最新订单的商品数量 $sql SELECT og.goods_number, g.store_count FROM . $GLOBALS[ecs]-table(order_goods) . AS og JOIN . $GLOBALS[ecs]-table(goods) . AS g ON og.goods_id g.goods_id WHERE og.order_id (SELECT MAX(order_id) FROM . $GLOBALS[ecs]-table(order_info) . ) AND og.goods_id 1; $result $this-db-getRow($sql); if ($result[goods_number] ! (100 - $result[store_count])) { // 假设初始库存100 trigger_error(订单商品数量({$result[goods_number]})与库存扣减量不一致, E_USER_ERROR); } echo ✓ 订单与库存数据一致性验证通过\n; }提示此断言需在订单创建操作后立即执行否则并发场景下可能读到旧数据。生产环境中建议在test_runner.php中加入usleep(100000)100ms等待事务提交。4. 针对ECShop缓存权限问题的专项测试用例设计与修复验证ECShop的缓存机制是其性能关键但也成为测试盲区。当data/cache/目录权限为777时includes/cls_template.php的make_compile()函数可正常写入编译后的模板文件但若权限收紧至755file_put_contents()会失败导致前台页面空白错误日志中出现Warning: file_put_contents(data/cache/...): failed to open stream: Permission denied。这类问题在测试用例中极易被忽略因为手工测试时开发者通常已手动修复权限而自动化测试环境却沿用默认权限。4.1 缓存目录权限的3种典型失效场景及验证命令我们定义ECShop缓存权限的黄金标准data/目录755data/cache/、data/templates_c/、data/logs/子目录777。偏离此标准即视为风险。以下用例需在Docker容器或虚拟机中执行确保权限可复现场景权限设置验证命令预期输出cache目录755chmod 755 data/cache/php -r var_dump(file_put_contents(data/cache/test.tmp, test));bool(false)且error_get_last()返回Permission deniedtemplates_c目录755chmod 755 data/templates_c/curl -s http://localhost/ecshop/head -20logs目录777但父目录755chmod 755 data/ chmod 777 data/logs/tail -f data/logs/sql_log.txt 2/dev/null echo test data/logs/sql_log.txtecho命令失败因父目录data/无写权限# 一键检测ECShop缓存权限放入test_runner.php public function checkCachePermissions() { $dirs [data/cache, data/templates_c, data/logs]; foreach ($dirs as $dir) { if (!is_writable($dir)) { $perms substr(sprintf(%o, fileperms($dir)), -4); trigger_error(缓存目录 $dir 不可写当前权限 $perms建议改为777, E_USER_ERROR); } } echo ✓ 所有缓存目录权限检查通过\n; }注意is_writable()在Linux下可能因open_basedir限制返回false此时需改用touch()测试if (touch($dir . /test.tmp)) { unlink($dir . /test.tmp); } else { ... }。4.2 修复缓存权限后必须验证的3个关联功能点权限修复不是终点还需确认ECShop核心功能在777权限下是否仍健壮。重点验证4.2.1 模板编译缓存的自动重建能力ECShop在cls_template.php中通过file_exists($compiled_file)判断是否需要重新编译。当data/templates_c/权限正确后修改themes/default/index.dwt文件然后访问首页# 修改模板文件触发重新编译 echo !-- test timestamp: $(date %s) -- themes/default/index.dwt curl -s http://localhost/ecshop/ | grep test timestamp # 预期返回包含时间戳的HTML证明模板已重新编译 # 同时检查 data/templates_c/ 下是否生成新文件 ls -la data/templates_c/ | grep index\.tpl\.php4.2.2 SQL查询日志的写入完整性ECShop开启SQL日志data/config.php中$GLOBALS[_CFG][log_level] 15后所有查询会写入data/logs/sql_log.txt。权限修复后需验证# 清空日志并触发一次查询 data/logs/sql_log.txt curl -s http://localhost/ecshop/index.php?keywordstest /dev/null # 检查日志是否写入 if [ $(wc -l data/logs/sql_log.txt) -lt 5 ]; then echo SQL日志写入失败请检查data/logs/权限 exit 1 fi4.2.3 后台商品列表页的缓存穿透防护ECShop后台商品列表admin/goods.php?actlist默认不使用模板缓存但会读取data/cache/goods_cat.php分类缓存。若该文件损坏或权限异常会导致后台白屏。验证方式# 手动删除分类缓存文件 rm -f data/cache/goods_cat.php # 访问后台商品列表 curl -s http://localhost/ecshop/admin/goods.php?actlist -b PHPSESSID$(cat session_id.txt) | head -10 # 预期返回包含table标签的HTML证明缓存自动重建成功提示session_id.txt需提前通过登录后台获取curl -b参数传递Cookie以维持登录态。若返回Login Required说明会话验证失败需先执行登录请求。本文还有配套的精品资源点击获取
返回列表