ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Javaweb+MySQL+LoadRunner软件测试课程设计闭环

Javaweb+MySQL+LoadRunner软件测试课程设计闭环

简介:《软件测试课程设计.zip》面向计算机相关专业学生及软件测试入门者,围绕JavaWeb网上书店前台系统提供一套可对照的课程设计材料,解决测试用例设计、单元测试实施与性能测试落地等练习需求。压缩包共904个文件、约45.97MB,包含jsp与java源码、class和jar编译依赖、xml配置、js/css页面资源,以及大量gif、jpg界面截图,便于还原系统结构与测试对象。已有2350人学习下载,说明其在课程设计与测试练习场景中具有一定参考度。材料覆盖逻辑覆盖与基本路径测试的白盒用例设计,等价类、边界值黑盒分析,借助JUnit对核心功能开展单元测试,并通过手工或自动化方式完成功能验证;性能部分使用LoadRunner进行稳定性与逐步加压的压力测试,可帮助读者理解最大服务级别判定思路,并据此整理测试方案、用例与结果记录。

1. 软件测试课程设计包怎么落地:Javaweb 工程 + MySQL + LoadRunner 的一条闭环

软件测试课程设计.zip 这类资源,最容易被误读成一份报告模板合集,真正卡住复现的是 Javaweb 工程、MySQL 数据脚本和 LoadRunner 脚本能不能接上。有人先写用例,结果工程导入报错、数据库连不上、脚本回放登录失败,后面全在补环境。我的做法相反:先把 IDEA 里的工程跑出页面,再把 MySQL 测试数据固定下来,最后才让 LoadRunner 按事务压。适合正在做软件测试课程设计、手里有 Javaweb+MySQL 项目、需要交功能测试和压测报告的人。这份资源解决的不是“测试理论缺多少”,而是把一条能复现的测试链路串起来。

2. 环境与数据先跑通:IDEA 导入 Javaweb 工程、MySQL 初始化与冒烟验证

课程设计包最容易翻车的地方不是用例写得少,而是环境没对齐。同一份包,在别人的机器上能跑,换一台机器就出现依赖爆红、数据库连不上、页面 404,后面写的用例和压测脚本全成了空中楼阁。先把工程、数据库、启动入口三件事固定下来,再谈测试设计,后面会省掉很多返工。

2.1 拆包后先看三处:工程结构、数据库脚本、测试说明

拆包后不要先打开报告模板。先定位三个入口:源码根目录、数据库脚本、LoadRunner 脚本目录。源码根目录决定用哪种方式导入 IDEA;数据库脚本决定测试数据怎么造;脚本目录决定压测是重新录还是直接改。用一条命令把关键文件列出来,比在目录里来回点更快。

find . -maxdepth 3 -type f \ \( -name "*.sql" -o -name "pom.xml" -o -name "build.gradle" \ -o -name "web.xml" -o -name "*.c" -o -name "*.usr" \) \ | sort

这段命令做的是“入口定位”,不涉及编译。-maxdepth 3控制搜索深度,避免把依赖目录全扫一遍;-name过滤数据库脚本、构建描述、Web 部署描述和 LoadRunner 常用脚本文件;sort让输出稳定,方便对照说明文档。实际工程如果不用构建工具,可能没有pom.xml或build.gradle,那就按普通 Web 工程处理,重点看WEB-INF/web.xml和页面入口。

看到pom.xml或build.gradle时,优先按构建工具导入,让 IDEA 自己解析依赖。只有普通 Web 目录时,才手工配 SDK 和 Servlet 容器。数据库脚本先看建库语句和字符集,别急着执行;如果脚本里写死了库名,后面连接配置要跟它一致。测试说明里通常会给登录账号、页面路径和启动方式,这三样先抄到自己的笔记里,后面冒烟和脚本参数化都要用。

2.2 IDEA 导入与 Javaweb 运行配置:先让页面出来

IDEA 导入 Javaweb 工程,常见做法是“打开根目录而不是打开某个子目录”。如果根目录下有构建描述文件,等依赖索引跑完再动运行配置;如果没有,就在 Project Structure 里确认 SDK、模块依赖和 Web 资源目录。运行配置里选本地 Servlet 容器,部署方式用 exploded 或 war 都行,关键是上下文路径要和页面里的链接一致。上下文路径不一致,登录页能开,提交后照样 404。

grep -n "<servlet-name>\|<url-pattern>\|<context-param>" \ src/main/webapp/WEB-INF/web.xml 2>/dev/null || true

这段命令用来确认 Servlet 映射和上下文参数。grep -n输出行号,方便回到文件里改;2>/dev/null屏蔽文件不存在时的报错;|| true防止命令中断后续检查。路径要按实际工程改,普通 Web 工程可能是WebContent/WEB-INF/web.xml或web/WEB-INF/web.xml。看到url-pattern后,把登录、列表、提交的入口路径记下来,后面 curl 和 LoadRunner 都用同一套路径。

依赖爆红时先别急着加 jar。Javaweb 工程里javax.servlet相关依赖经常是provided作用域,编译时需要、运行由容器提供。IDEA 里如果模块没有挂容器库,代码就会整片爆红。处理顺序是:先重新导入构建工具,再检查依赖作用域,最后才手工加库。运行配置里还要确认端口和上下文路径,页面能打开但静态资源 404,多半是资源目录没打进部署包。

提示:先跑通一个登录页或列表页,再配数据库。页面都出不来时,数据库连接池的报错会掩盖真正的部署问题。

2.3 MySQL 初始化:建库、建表、测试数据一次写清

数据库初始化要围绕测试用例造数据,不要只导一份“能跑就行”的库。登录需要正常账号、错误密码、禁用账号;列表查询需要空结果、边界值、特殊字符;新增修改需要重复数据和必填缺失。下面这段 SQL 用两张最小表覆盖这些场景,实际表名按工程脚本替换。

CREATE DATABASE IF NOT EXISTS course_test DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE course_test; DROP TABLE IF EXISTS test_user; CREATE TABLE test_user ( id BIGINT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64) NOT NULL UNIQUE, password_hash VARCHAR(128) NOT NULL, status TINYINT NOT NULL DEFAULT 1, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; DROP TABLE IF EXISTS test_item; CREATE TABLE test_item ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, title VARCHAR(128) NOT NULL, amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, KEY idx_user_id (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO test_user (username, password_hash, status) VALUES ('test01', '123456', 1), ('test02', '123456', 1), ('test03', '123456', 0); INSERT INTO test_item (user_id, title, amount) VALUES (1, '边界值-0.01', 0.01), (1, '边界值-0.00', 0.00), (2, '常规记录', 99.99);

这段 SQL 先统一库表字符集,再建用户表和记录表。utf8mb4用来覆盖中文和特殊字符;username加唯一约束,方便做重复注册用例;status用 0/1 区分禁用和正常;amount用DECIMAL避免浮点误差;测试数据里放了 0.00、0.01 和常规值,直接对应边界值用例。执行前先确认工程自己的 SQL 脚本有没有外键和字段差异,别把示例表硬套到业务表上。

测试数据要留“可识别前缀”。功能用例用test01这类账号,压测账号用lr_前缀,压测产生的记录用压测-前缀。后面清理数据时按前缀删,不会误伤功能用例。数据库连接串、账号密码写到本地配置里,别提交到公开仓库;课程设计答辩时只展示配置项名称,不展示真实密码。

2.4 冒烟验证:页面、接口、日志三条线

页面能打开只算一半,接口能返回数据才算跑通。先用 curl 走一遍登录和列表查询,把会话 cookie 保存下来,再带 cookie 请求业务接口。这样后面写 LoadRunner 脚本时,请求方法、参数名、上下文路径都有据可查。

BASE="http://127.0.0.1:8080/course" curl -i -s -c /tmp/cookie.txt \ -d "username=test01&password=123456" \ "$BASE/login" curl -i -s -b /tmp/cookie.txt \ "$BASE/item/list?page=1&size=10"

第一条请求模拟表单登录,-c把会话写入/tmp/cookie.txt;第二条请求用-b带上会话,访问列表接口。-i用来查看响应头,登录成功常见 200 或 302;-s静默输出,避免进度条干扰。BASE里的上下文路径必须和 IDEA 运行配置一致,不一致就改成实际路径。判断标准是:状态码正常、响应体里能看到test01或测试标题、后台日志没有 SQL 异常。

三条线要一起看。页面线看登录、列表、新增能不能点通;接口线看请求参数和响应结构;日志线看 SQL 报错、连接池超时、空指针。冒烟阶段不要追求用例全覆盖,先把“能登录、能查询、能新增一条测试数据”跑通。这一步稳了,第 3 章的功能用例才有意义,第 4 章的 LoadRunner 脚本才不会录出一堆无效请求。

3. 功能与接口测试:把登录、查询、新增流程拆成可执行用例

功能测试最容易写成“页面点一遍,截图交差”。课程设计要的是可复现:同样的输入,换个人也能得到同样的结果;失败时能拿出请求、响应、数据快照。把页面流程拆成用例,再把关键用例落到接口层校验,报告里的证据链才立得住。

3.1 从页面流程拆用例:登录、列表查询、新增修改

先按页面入口划分模块,再按输入维度拆等价类和边界值。登录看账号状态、密码正确性、空值和超长;列表查询看正常结果、空结果、分页边界、特殊字符;新增修改看必填缺失、金额边界、重复标题。下面这张表可以直接改成自己的用例表,优先级按答辩展示顺序排。

用例编号场景输入预期优先级
LOGIN-01正常登录test01 / 正确密码进入首页,会话建立高
LOGIN-02密码错误test01 / 错误密码提示失败,不建会话高
LOGIN-03禁用账号test03 / 正确密码拒绝登录,提示状态异常高
LOGIN-04空用户名空 / 任意密码前端或后端拦截中
LIST-01正常查询页码 1,每页 10返回测试数据,总数正确高
LIST-02空结果关键词“不存在-xx”返回空列表,不报错中
LIST-03分页边界页码 0、负数、超大值回到合法页或明确提示中
ADD-01必填缺失标题为空拦截提交,提示必填高
ADD-02金额边界0.00、0.01、超大值按业务规则接受或拒绝高

用例表里不要只写“登录成功”。输入要写到字段级,预期要写到页面提示或接口状态。优先级高的是答辩时能现场复现的,优先级低的是补充覆盖。列表查询的空结果和分页边界最容易被忽略,但这两类用例最能暴露后端参数校验问题。

3.2 接口层校验:用 curl 固定请求与断言

页面用例靠人眼判断,接口用例靠响应内容判断。课程设计里不一定有时间搭完整测试框架,用 curl 加最小断言就够。把登录后的 cookie 固定下来,查询接口返回后直接匹配总数和关键字段,失败就输出原因并退出非零状态。

BASE="http://127.0.0.1:8080/course" resp=$(curl -s -b /tmp/cookie.txt "$BASE/item/list?page=1&size=10") echo "$resp" | grep -q '"total":3' \ || { echo "total 断言失败"; exit 1; } echo "$resp" | grep -q '边界值-0.01' \ || { echo "测试数据断言失败"; exit 1; }

这段脚本先取列表响应,再用grep -q做静默匹配。||后面是失败分支,输出具体断言名并退出非零,方便放进回归脚本。total和标题字段要按实际响应结构改,JSON 字段名不要照抄示例。断言不要太多,先保证“总数对、关键数据在、状态码正常”三条,后面再补字段类型和排序。

接口校验的价值在于定位。页面提示“查询失败”时,接口响应可能已经告诉你参数名错了或会话过期。把每次请求的 URL、参数、响应码、响应体片段记下来,缺陷记录就不用靠回忆。

3.3 缺陷记录:让开发能复现的最小信息集

缺陷记录不是写作文。标题要含模块、条件和现象,比如“列表查询-页码为 0 时返回 500 而非空页”。正文按“复现步骤、期望结果、实际结果、证据”四块写。复现步骤从登录开始编号,每一步写清输入和点击位置;证据放请求响应片段、后台日志、数据库快照,截图只做辅助。

字段写法作用
缺陷标题模块 + 条件 + 现象一眼定位
复现步骤1 登录 2 进入列表 3 页码输 0开发能照着走
期望结果返回空页或提示页码非法判断标准
实际结果500,日志报参数越界现象证据
证据请求 URL、响应体、日志行号减少来回沟通

缺陷描述里不要写“有时候”“偶尔”。说不清复现条件时,先固定数据、固定账号、固定请求顺序再试。课程设计答辩现场,老师最常问的是“你怎么证明这个问题存在”,不是“你写了多少条缺陷”。

3.4 回归顺序与数据清理

回归顺序按“冒烟、接口、页面、压测”排。先跑登录和列表冒烟,确认环境没坏;再跑接口断言,确认数据没被污染;然后走页面用例;最后才压测。压测会产生大量记录,压完不清理,下一轮功能用例的总数断言就会失败。清理脚本按前缀删,先子表后主表。

DELETE FROM test_item WHERE title LIKE '压测-%'; DELETE FROM test_user WHERE username LIKE 'lr_%';

这两条删除语句靠前缀识别压测数据。LIKE '压测-%'对应压测脚本里的标题前缀,LIKE 'lr_%'对应参数化账号前缀。执行前先用同样的条件SELECT COUNT(*)确认范围,别在业务库上直接跑。有外键时先删子表,再删主表;没有外键也建议按这个顺序,迁移到别的库时不容易出错。

清理完再跑一遍总数断言,确认功能数据回到基线。基线数据要单独留一份 SQL 快照,答辩前重新导入,避免演示时列表里全是压测垃圾数据。

4. LoadRunner 压测脚本:录制、参数化、事务和场景设计

LoadRunner 在课程设计里最容易变成“录一遍、跑一遍、截个图”。真正影响报告质量的是事务边界、参数化和场景参数。脚本只跑一次就失败,多半是会话没关联;TPS 看着很高但页面很慢,多半是事务拆得太细或没加思考时间。

4.1 录制前先定事务边界:登录、查询、提交各算一个事务

事务边界按用户可感知的操作切,不要把整个脚本包成一个大事务。登录算一个事务,列表查询算一个事务,提交新增算一个事务。这样报告里能看出是登录慢还是查询慢。录制时先走一遍完整流程,再回到脚本里删掉静态资源请求和不必要的跳转。

Action() { lr_start_transaction("login"); web_submit_data("login", "Action=http://{host}/course/login", "Method=POST", "RecContentType=text/html", "Referer=http://{host}/course/login", "Snapshot=t1.inf", "Mode=HTML", ITEMDATA, "Name=username", "Value={username}", ENDITEM, "Name=password", "Value={password}", ENDITEM, LAST); lr_end_transaction("login", LR_AUTO); lr_think_time(2); lr_start_transaction("list"); web_url("list", "URL=http://{host}/course/item/list?page=1&size=10", "Resource=0", "RecContentType=text/html", "Referer=http://{host}/course/item/list", "Snapshot=t2.inf", "Mode=HTML", LAST); lr_end_transaction("list", LR_AUTO); return 0; }

这段脚本把登录和列表拆成两个事务。lr_start_transaction和lr_end_transaction包住业务请求,LR_AUTO根据响应状态自动判定事务成功或失败。{host}、{username}、{password}都是参数,后面用参数文件替换。lr_think_time(2)放在两个事务之间,模拟用户看页面再点下一步;如果放在事务里面,响应时间会被思考时间污染。

录制后先删掉图片、样式、脚本这类静态资源请求。课程设计压的是业务接口,静态资源会拉低 TPS、拉高命中率,报告里不好解释。事务名用英文短名,别用“事务1”“事务2”,后面图表对照时看不出含义。

4.2 参数化与关联:账号、查询词、会话令牌

参数化解决“多个虚拟用户抢同一个账号”的问题。登录账号必须唯一,查询关键词可以循环。参数文件用 CSV,首行写字段名,下面每行一组数据。账号用lr_前缀,方便压完清理。

username,password,keyword lr_01,123456,边界值 lr_02,123456,常规 lr_03,123456,空结果

这份参数文件里,username和password给登录事务用,keyword给查询事务用。参数更新方式按场景选:账号建议每次迭代取唯一值,避免同一账号反复登录被锁;查询词可以每次出现都换,制造不同查询条件。参数文件不要放在脚本根目录之外,换机器容易丢路径。

会话关联是 LoadRunner 回放失败的高频原因。登录后服务端返回会话 cookie 或 token,后续请求必须带上。用web_reg_save_param在登录请求前注册提取规则,把值存到SESSION,后面请求用{SESSION}引用。

web_reg_save_param("SESSION", "LB=JSESSIONID=", "RB=;", "Search=Headers", LAST);

这段关联函数要放在登录请求之前。LB和RB是左右边界,Search=Headers表示从响应头里找。实际工程可能用自定义 token,边界要按响应内容改;找不到时先打印登录响应头,别靠猜。关联值提取不到,后面请求会跳登录页,事务失败但脚本不报语法错,这是最隐蔽的一类翻车。

4.3 场景设计:并发梯度、思考时间、集合点

场景不要一上来就 100 并发。先跑 5、10、20 的梯度,每档持续几分钟,观察响应时间和错误率的变化。并发数按机器配置和课程设计目标定,不要拿生产指标套课程项目。思考时间按真实操作填,登录后看页面 2 到 5 秒,查询后停顿 1 到 3 秒;不加思考时间,虚拟用户会像机器人一样连点,TPS 虚高。

场景并发持续时间思考时间集合点目标
基线55 分钟2 秒不开确认脚本稳定
梯度一105 分钟2 秒不开看响应时间变化
梯度二205 分钟2 秒不开找拐点
瞬时并发103 分钟1 秒登录前开看峰值承受

集合点只放在需要瞬时并发的场景,比如登录前统一释放。日常梯度压测不开集合点,否则所有用户同时冲一个接口,响应时间曲线会很难看。Ramp up 逐步加压,别一秒内起全部用户;Duration 至少覆盖一轮完整业务,太短的数据没有统计意义。

4.4 指标判读:TPS、平均响应、错误率、命中率

报告里不要只贴 TPS 截图。TPS 高但平均响应时间也高,可能是事务拆得太细,一个页面操作被拆成很多小事务;错误率高先看失败请求的响应码,401/302 多半是会话失效,500 多半是服务端异常;命中率异常高,检查是不是压了静态资源。数据库连接池打满时,响应时间会突然抬升,TPS 反而下降,这种拐点比单看峰值更有价值。

指标看什么异常信号
TPS随并发变化的趋势并发增加 TPS 不升反降
平均响应时间各事务分别看登录事务远高于查询事务
错误率按响应码分类401/302 集中出现
命中率是否压到静态资源接近全命中但业务无压力

压测结果要和功能用例对得上。功能用例里列表总数是 3,压测后总数变成几千,说明数据污染了,下一轮断言必失败。压测账号和压测数据都带前缀,压完先统计再清理,报告里写清数据基线。

5. 避坑与常见问题排查:从导入失败到压测失真的五条血泪记录

课程设计包的坑大多不是高深问题,而是环境、数据、脚本三处没对齐。下面五条按“现象、原因、解决”记,都是我在复现这类包时反复遇到的。排查顺序建议从环境到脚本再到报告,别一上来就改脚本。

5.1 环境与数据类:导入报错、乱码、连接失败

现象一:IDEA 导入后javax.servlet整片爆红,页面类编译不过。原因通常不是 JDK 坏了,而是依赖作用域和容器库没配。Javaweb 工程的 Servlet API 往往由容器提供,构建工具里标了provided,IDEA 模块没挂容器库时就找不到类。解决顺序是:先重新导入构建描述,让依赖重新解析;再打开模块依赖,确认 Servlet API 的作用域;最后在运行配置里挂本地容器。不要第一反应就手工下载 jar 塞进lib,塞进去容易和容器版本冲突,运行时报类加载错误。

现象二:数据库能连上,页面查询中文全是问号或乱码。原因一般有三层:数据库字符集、连接串字符集、页面编码。先看建库建表是不是utf8mb4,再看连接串有没有指定字符集,最后看页面和过滤器编码。三层里有一层是utf8或默认字符集,中文就可能坏。解决时统一改成utf8mb4,建库、建表、连接串、页面编码一起改;已经写入的乱码数据要重新导入,不要指望改配置后自动恢复。测试数据里放一条中文标题,冒烟时就能提前发现。

现象三:工程启动报连接池初始化失败,但用命令行能连数据库。原因多半是配置文件里的地址、端口、库名或账号和实际不一致,也可能是驱动依赖没打进部署包。IDEA 里能跑、部署后连不上,先看部署产物里有没有数据库驱动;再看连接串是不是指向了另一个库。解决时把连接配置集中到一个本地文件,启动前打印实际生效的库名和地址,别靠记忆。课程设计答辩换机器时,这一步能省很多时间。

5.2 脚本与压测类:回放失败、参数不生效、TPS 虚高

现象四:LoadRunner 录制脚本回放时登录失败,手动登录却正常。最常见原因是会话没关联。录制时工具自动带了 cookie,回放时没有,服务端把后续请求重定向到登录页。解决是在登录请求前加关联函数,把会话值提取出来,后续请求引用。另一个原因是参数化账号被锁或密码错误,先拿一个账号手工跑一遍,再检查参数文件列名和脚本里的{username}是否一致。回放日志里看请求 URL 和响应码,302 集中出现基本就是会话问题。

现象五:压测 TPS 很高,但页面打开很慢,报告数据对不上。原因通常是脚本把静态资源也算进事务,或者事务拆得太细、没加思考时间。静态资源请求快,TPS 被拉高,业务接口的真实响应被掩盖。解决时删掉图片、样式、脚本请求,只保留登录、查询、提交这类业务事务;事务内不要放思考时间;场景里按真实操作加停顿。压测前先跑 5 并发基线,对比手工操作的响应时间,差距太大就回头查脚本。

5.3 报告与复现类:结果对不上、截图不可信

现象六:报告里的用例结果和压测后的数据对不上,总数断言全失败。原因是压测数据没清理,或者功能用例和压测共用了同一批账号。解决是给压测数据加固定前缀,压完先统计再删除;功能用例使用独立账号和独立数据快照;每轮回归前重新导入基线 SQL。报告里写清数据基线、清理条件和使用的前缀,别人复核时才能复现。

排查时先固定变量:同一台机器、同一个数据库、同一份脚本、同一组账号。变量没固定就反复改配置,最后不知道是哪一步生效。血泪经验是:环境问题先看日志和部署产物,脚本问题先看请求和响应,报告问题先看数据基线。顺序对了,大多数坑十分钟内能定位。

6. 报告可复现技巧:把用例、脚本、压测数据串成证据链

报告里最值钱的不是截图数量,而是别人能按你的记录复现。用例编号要能对应到接口请求,接口请求要能对应到数据库数据,压测事务要能对应到场景参数。下面这张表可以直接放进报告的测试实施章节,把证据类型和复核方式写在一起。

证据类型放在报告哪一节复核方式
用例表功能测试设计按编号逐条执行,记录实际结果
接口请求接口测试执行保留 URL、参数、响应码片段
数据库快照测试数据说明导入基线 SQL 后核对总数
压测脚本性能测试脚本检查事务名、参数文件、关联函数
场景参数性能测试场景对照并发、持续时间、思考时间
结果曲线性能测试结果标注拐点和错误率变化

复核时先跑两条命令:一条数脚本里的事务,一条数压测产生的数据。事务数量和报告里的事务列表对不上,说明脚本删改后没同步;数据量和基线对不上,说明清理没做干净。

grep -R "lr_start_transaction" lr_script/ | wc -l mysql -uroot -p course_test \ -e "SELECT COUNT(*) FROM test_item WHERE title LIKE '压测-%';"

第一条按脚本目录统计事务开始标记,wc -l输出行数;第二条统计带压测前缀的记录数。路径和数据库连接按本地环境改,命令里的-p会提示输入密码,不要把密码写进脚本。两条结果都记进报告附录,答辩时被问“数据哪来的”,直接翻到这一页。

我后来养成了一个习惯:每次交报告前,把用例表、接口请求、数据库快照、压测脚本和场景参数按编号对一遍,对不上就停下来改,不靠记忆补。这个习惯救过好几次现场演示,也让我少写了很多“看起来有图、实际复现不了”的段落。这套课程设计包的入口放在文末,拿到后先按第 2 章的冒烟顺序跑一遍,再动 LoadRunner,能少走不少弯路。希望帮到你。

本文还有配套的精品资源,点击获取

返回列表