简介:一份软件测试培训讲义PPT,系统梳理了软件测试从基础概念到实际方法的完整知识链,适合测试入门者、软件工程专业学生及质量保障工程师参考。压缩包内只有一个PPT文件,整体大小约2.76MB,方便直接阅读或导入课堂播放;当前已有86人学习。讲义先用1963年美国火星火箭爆炸等真实故障强调测试的重要性,再分析测试开销大、不能穷举、难度大三大特点,以及避免程序员自测、注重用例选择、长期保存用例等基本原则,并梳理模块测试到验收测试的主要阶段。测试方法部分既介绍桌面检查、代码会审等静态分析,也详解白盒法和黑盒法,重点展开语句覆盖、判定覆盖、条件覆盖、条件组合覆盖等常用标准,并搭配程序段实例演示如何设计测试用例。整体讲解简明,能帮助读者快速建立测试思维并上手设计基础用例。
1. 软件测试培训讲义:判定标准比操作步骤更重要
很多人以为软件测试培训讲义的核心是“怎么在系统里找bug”,实际翻完一圈新人面试和半年后的工作表现,我发现真正拉开差距的,是测试基础知识里最枯燥的那几页:流程怎么走、缺陷怎么分级、报告怎么写、用例怎么才算“设计过”。一份讲义如果只教操作,学员遇到“开发说这是需求如此,不算bug”就会卡住;如果教的是判定标准,他就能自己拆解问题:这个需求可测吗,边界在哪,缺陷级别该定P1还是P2。
下面拆开软件测试讲义的常见骨架:流程与V模型、用例设计方法、自动化工具,以及最后从讲义走向面试和简历的落地技巧。新手可以按顺序学一遍,有经验的人可以直接跳到中间的用例设计和最后的面试部分对照自己的体系。
2. 软件测试流程与V模型——培训讲义的第一页该写什么
培训讲义的第一章我会放流程,而不是放工具。原因很简单:测试不是一个“会点按钮、会写脚本”的岗位,它是一套有输入、有输出、有质量门禁的工程流程。新人如果不知道当前处于哪个阶段、该产出什么,给了他Selenium也是乱用的。下面按讲义顺序拆开讲。
2.1 测试阶段与开发阶段的对应关系
讲义里这页我会用一张V模型映射表讲清楚“测试活动什么时候开始设计、什么时候开始执行”。
| 开发阶段 | 对应测试活动 | 测试关注点 | 典型产出 |
|---|---|---|---|
| 需求分析 | 验收测试设计 | 业务规则可验证、验收标准明确 | 验收测试方案 |
| 概要设计 | 系统测试设计 | 端到端业务流程、跨模块交互 | 系统测试用例 |
| 详细设计 | 集成测试设计 | 模块间接口、数据流、异常处理 | 集成测试用例 |
| 编码 | 单元测试 | 分支、边界、局部数据结构 | 单元测试用例与脚本 |
这张表要传达的核心观念是:测试设计在开发左侧就开始了,执行只是把左侧的设计落到右侧。很多人误以为V模型是“开发完再测”的串行顺序,其实恰恰相反,测试设计是前置的。需求一旦冻结,验收测试方案就应该跟着产出,越晚补设计,发现需求歧义的成本越高,这也是需求评审要拉测试一起开的原因。
V模型的局限在于它假设需求相对稳定。放到迭代开发里,需求是滚动的,所以我们会在每个迭代的计划会议上,把验收用例拆到故事卡粒度,随做随补。讲义里我会加一句引导:流程不是用来背的,是用来回答“我现在该做什么”的。
2.1.1 敏捷模式下的流程变形
敏捷流程里的测试设计会薄很多:用例粒度变小,自动化回归用例占比提高,测试计划和测试报告浓缩成一页纸或一张看板。但不要因此不做测试设计,否则两周一个迭代,用例全靠在执行时现想,缺陷漏测率会明显抬升。培训时我会让学员做一个对比练习:同一个支付功能,用V模型和敏捷方式各写一版测试计划,看看哪一步被压缩了,哪一步其实没变。
2.2 测试计划、准入准出与风险
测试计划在培训讲义里容易被一带而过,实际它才是测试经理和面试官真正会问的东西。一份合格的测试计划至少包含六项:
- 测试范围:测什么、不测什么,不测的必须明说;
- 测试策略:功能、性能、安全、兼容性各用什么方法;
- 测试环境:环境地址、数据版本、依赖服务;
- 资源安排:谁负责哪些模块,时间区间;
- 风险与应对:阻塞项、缺失的测试数据、外部依赖不稳定;
- 准入准出条件。
准入条件建议写成可度量的门禁,而不是“功能基本可用”。例如:冒烟测试核心用例100%通过、阻断级别缺陷清零、测试环境版本号与待测版本一致。准出条件则要覆盖用例执行率、缺陷解决率和遗留缺陷处理结论。别把准出写成“测试人员觉得没问题”,一旦开发反问“觉得没问题是什么意思”,这张门禁就失效了。
2.3 缺陷流向与用SQL度量测试质量
缺陷管理是讲义中实操性最强的部分。基础流程是 New → Open → Fixed → Retest → Closed,中间还会出现 Rejected、Reopen、Deferred。每个流转都有责任人和时限要求。除了流程,更值得教的是怎么用数据判断“这个版本能不能发”。下面这段SQL是缺陷日报统计常见写法:
-- 按日期和严重级别统计最近 7 天新增缺陷 SELECT DATE(create_time) AS bug_day, severity, COUNT(*) AS bug_count FROM defect WHERE project_id = 1024 AND create_time >= DATE_SUB(CURRENT_DATE, INTERVAL 7 DAY) GROUP BY DATE(create_time), severity ORDER BY bug_day, severity;这段SQL会在两个地方用到。第一是测试周报,直接展示到趋势图里,看每日新增是收敛还是发散;第二是发布评审,如果临近准出节点S0级还在持续新增,说明测试设计存在缺口或者准入条件没有守住。参数上,project_id按实际项目改,severity取值以公司缺陷管理规范为准,常见是S0-S3或P0-P2;如果缺陷表里用priority而不是severity,就把分组字段换成对应的列名。能跑到这一步,流程章节就不只是概念了。
3. 软件测试用例设计方法——培训讲义里最厚的一章
流程讲完之后,讲义进入用例设计。这是软件测试面试题里出现频率最高的模块,也是刷“软件测试八股文”的人最熟悉但最容易讲不清的部分。面试官问“你怎么测一个登录框”,如果只背出等价类和边界值两个词,没有实际用例支撑,基本上就只能拿及格分。这一章把方法、参数、例子串起来讲。
3.1 等价类与边界值:核心思想与边界集合怎么生成
等价类划分要解决的问题是输入空间无限,用例数有限。把输入按是否被相同方式处理切成若干类,每一类取一个代表值。划分时要同时写有效等价类和无效等价类,实际工作中漏得最多的恰恰是无效类:小于最小长度的输入、含特殊字符的输入、空值。无效类决定系统的健壮性,也是面试官重点追问的点。
边界值是基于“缺陷集中在边界”这个经验事实的补充。业界常用五点法或七点法,以闭区间[lo, hi]为例,取lo-1, lo, lo+1, hi-1, hi, hi+1。用一小段Python可以把边界集合生成出来:
def boundary_values(lo: int, hi: int) -> list[int]: """生成闭区间 [lo, hi] 的边界值集合,含区间内外的相邻点""" if hi < lo: raise ValueError("上界不能小于下界") vals = {lo, hi} if lo > -10_000: # 防止无限下探,按业务实际下限收紧 vals.add(lo - 1) vals.add(lo + 1) vals.add(hi - 1) vals.add(hi + 1) return sorted(vals) print(boundary_values(18, 60)) # 输出: [17, 18, 19, 59, 60, 61]函数内部的lo - 1和hi + 1是区间外的值,lo + 1和hi - 1是为了覆盖边界内侧的合法值。lo > -10_000这种保护条件不是硬编码,而是提醒你根据业务语义决定“最小值减1”是否真的允许构造出来,比如年龄字段就不会出现负数边界。这段代码在讲义里是用来准备测试数据的,不是让你把边界值写死在脚本里;最终用例表里每个边界值都要有对应的期望结果。
3.2 一个登录页面的用例设计——从等价类到判定表
以一个经常在软件测试项目实战里出现的登录功能为例,规格是:用户名6-16位字母或数字,密码8-20位且必须包含大写字母、小写字母和数字。不要小看这个规格,它有至少四个字段级别的无效类,在执行和面试追问时都能展开。先做等价类划分:
| 字段 | 有效等价类 | 无效等价类 |
|---|---|---|
| 用户名 | 6-16位字母数字组合 | 长度<6、长度>16、含特殊字符、全空格、空值 |
| 密码 | 8-20位且含大小写字母和数字 | 长度<8、长度>20、缺大写、缺小写、缺数字、纯数字、空值 |
从等价类表里挑代表性的组合写正式用例,注意用例数不是越多越好,而是覆盖每个无效类且不重复:
| 用例编号 | 输入 | 预期结果 | 优先级 |
|---|---|---|---|
| TC001 | 合法用户名 + 合法密码 | 登录成功,跳转首页 | P0 |
| TC002 | 用户名6位边界值 | 登录成功 | P1 |
| TC003 | 用户名5位 | 提示“用户名应为6-16位字母或数字” | P1 |
| TC004 | 密码缺大写字母 | 提示“密码需包含大小写字母和数字” | P1 |
| TC005 | 用户名不存在 | 提示“用户名或密码错误” | P0 |
| TC006 | 连续5次输错密码 | 弹出图形验证码 | P1 |
TC005值得在培训时单独讲:提示语写的是“用户名或密码错误”而不是“用户名不存在”,原因是后者会泄露账号是否存在,给撞库提供了信息。这个属于安全维度的测试设计,也符合软件测试基础知识的考点。优先级字段建议结合业务定,P0定义为一轮冒烟必须执行的用例,P1为发布前必须通过,P2为可延后处理。
当规则条件有多个且互相组合时,等价类就不够了,改用判定表。登录场景可以抽取“用户名是否存在、密码是否正确、验证码是否正确”三个条件,得到八种组合,逐列写出动作结果。讲义里我会让学员把判定表真值表画一遍,再删掉不存在的组合(比如验证码错误且用户不存在的组合,系统只返回一种或两种结果),这样规则覆盖既完整又不冗余。判定表是银行软件测试里特别常用的方法,因为业务规则多、条件组合却有限,翻译成用例非常直接。
3.3 场景法与探索式测试的边界
场景法适合业务链路长的功能,核心是画基本流和备选流。基本流是主流程,备选流是每个分支。以“下单支付”为例,基本流是浏览商品→加入购物车→结算→支付→支付成功;备选流包括库存不足、优惠券过期、支付超时、余额不足。备选流的组合最终形成一张业务流程图,每条路径都是一条用例。
探索式测试在讲义里和场景法放在一起讲,因为两者容易混淆。场景法是在已知流程上做组合覆盖,探索式测试是在未知行为中做实时学习,适合新功能首次测试或者回归前快速摸底。做探索式测试必须有任务书和记录,否则报告里写不出“我测了哪些想法、发现什么风险”。团队里如果测试人员少,我会优先保流程测试,把探索式测试作为版本发布前的补充手段,两者不是二选一。
4. 测试工具链与自动化落地——从讲义到可执行的Selenium脚本
自动化这一章在所有软件测试培训讲义里都是“容易讲飘”的部分。讲师容易把重点放在“怎么写脚本”上,但学员回去后发现环境装不上、元素定位不稳定、跑完不敢信结果。讲到自动化,我一般先讲选型,再讲一个能跑通的最小脚本,最后讲定位失败时怎么看、怎么改。
4.1 自动化测试的选型边界
自动化不是越早越好,也不是覆盖越多越好。它适合三类场景:回归测试、冒烟测试、数据驱动测试。回归测试的价值在于“改动旧功能时,验证没被改坏”,自动化用例越多,回归速度优势越明显。数据驱动测试则是同一流程换不同的测试数据跑,比如用一百组账号密码做登录校验,人工跑一遍既慢又容易漏。
不适合自动化的场景同样要写进讲义:界面还在大改的模块、视觉与用户体验相关的主观检查、一次性验证。强行自动化这些场景,维护成本会吃掉收益。面试时如果被问“你的自动化项目有多少用例”,不要只报数量,要说维护成本、失败率和平均执行时间,面试官听到这几个指标会确信你真的跑过项目。
4.2 最小可运行的Selenium脚本
工具链我用Selenium作为主线,因为它覆盖主流浏览器、支持多语言、资料多。下面是一个最小可运行的登录脚本,包含显式等待和断言:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() try: # 打开被测系统,本地联调用 127.0.0.1,测试环境替换为对应域名 driver.get("http://127.0.0.1:8080/login") # 显式等待登录按钮可点击,避免用固定 sleep 造成不稳定 wait = WebDriverWait(driver, timeout=10) login_btn = wait.until(EC.element_to_be_clickable((By.ID, "login-btn"))) # 输入测试数据,定位策略用 name 属性 driver.find_element(By.NAME, "username").send_keys("tester01") driver.find_element(By.NAME, "password").send_keys("Passw0rd") login_btn.click() # 断言登录后页面标题,出现预期的关键字 assert "首页" in driver.title, "登录后页面标题不符合预期" finally: driver.quit() # 无论成功失败都释放浏览器进程这里的WebDriverWait(driver, timeout=10)表示最多等10秒,默认每0.5秒轮询一次,目标元素满足条件就立即继续。显式等待比sleep(3)可靠的原因在于它不浪费固定时间,也不会因为机器慢而超时。By.ID和By.NAME都比较稳定,如果页面结构里没有这两个属性,再退回By.CSS_SELECTOR或By.XPATH。断言不要只写成assert True,要断言和业务相关的标志,比如标题、URL、页面上的欢迎语,否则脚本跑绿也没有意义。
Selenium的环境有一个常见坑:浏览器驱动和浏览器版本不匹配。ChromeDriver的大版本号必须和Chrome一致,否则启动即报错。建议在讲义里让学员先跑通环境再学定位,不然脚本报错会被误以为是自己代码写错了。公司里如果环境限制不能装驱动,也可以先用WebDriverManager这类库做自动匹配,但生产环境的自动化框架一般会把驱动版本钉死,避免环境漂移问题。
4.3 元素定位失败的三个高频原因
| 错误现象 | 高频原因 | 排查思路 |
|---|---|---|
| NoSuchElementException | 页面没加载完就查找、元素在iframe里 | 先加显式等待;检查是否在iframe,用 switch_to.frame 进入 |
| StaleElementReferenceException | 页面局部刷新后旧元素引用失效 | 重新获取元素引用,不要反复使用同一个 webelement 变量 |
| 元素存在但点击不了 | 被遮挡、不可见、disabled | 先检查HTML属性,必要时用JS点击或先滚动到元素位置 |
定位失败时不要急着改代码,先在浏览器开发者工具里看真实DOM。如果id每次刷新都变,说明是动态id,改用稳定的class或data属性;如果元素在shadow DOM里,Selenium原生定位拿不到,需要借助JavaScript执行器处理。讲义里我通常会加一个提示:
提示:定位失败先看HTML,再改定位策略,最后才考虑加等待。顺序反了会把用例调得又慢又脆。
5. 从讲义到面试:软件测试面试题的标准拆法
培训讲义最后一节,我会教一个可以带走的能力:怎么把学到的知识点变成面试答案。以最经典的面试题“给你一个搜索框,你怎么测”为例,及格答案是背等价类、边界值、性能,高分答案是先锁需求再展开:
先问清楚搜索对象、允许的最大长度、是否支持特殊字符、搜不到内容时的交互预期;然后按五个维度分层:功能(正常搜索、空搜索、超长输入、特殊字符)、界面(布局、文案、输入状态)、兼容性(浏览器和操作系统)、性能(首字响应、大结果集)、安全(XSS注入、SQL注入)。这个结构在软件测试面试题里几乎可以套用到任意功能模块,回答时先“确认需求边界”再“分层展开”,比直接背八股文有区分度。
配套的还有简历写法。不要写“熟悉软件测试流程”,要写“负责XX模块的测试用例设计与执行,产出用例120条,发现缺陷35个,其中S1级缺陷2个,推动开发在发布前修复”。有数字的简历才经得起追问,也有利于面试官把问题引向你准备过的项目。
最后一个训练动作,也能用来消化讲义:把讲义里每个章节标题改写成一个“如果”问题。比如“如果需求文档只有一句话怎么办”“如果用例执行完只剩一天怎么办”。每道题逼自己用STAR结构过一遍:背景、任务、动作、结果。这比反复刷题更能把软件测试培训内容变成自己的经验。下一轮模拟面试时,拿其中一题练二十分钟,输出的答案会让你明显感觉到培训前后的差别。
本文还有配套的精品资源,点击获取