
每年到学期中后段后台和私信里就会出现同一类问题“第九章测验的答案能给我一份吗”问的人多了我一般会先反问一句你把选择题里C选项为什么错讲得出来吗对面多半就沉默了。软件工程这门课有个特点概念密度大、题型固定但几乎没有人能靠背答案应付过去尤其是章节测验老师最喜欢变着花样考同一个定义。这篇东西不是让你抄答案的而是帮你把第九章测验常见的题型、易错概念、综合题的得分逻辑全部拆开让你在考场上即使遇到没见过的新题也能靠一套稳定的分析框架拿到分。先说明一点不同学校、不同教材对第九章的划分并不完全相同。以吉林大学软件工程课程的常见编排来说第九章要么是软件测试相关的内容要么是面向对象方法学引论这取决于老师选用的教材版本。但不论章节序号对应哪个主题测验的出题逻辑都高度相似选择题、判断题考定义辨析简答题考过程性知识的完整性综合题考方法运用。所以下面这套解析按“题型逻辑”而不是“教材页码”来组织你对照自己的复习资料去用就行。1. 先搞清楚第九章到底考什么——别被教材版本带偏很多同学一上来就背“第九章标题”结果背了一整章考试发现题目全是下一个章节的白费功夫。正确的做法是先确认老师用的课件版本再对照版本确认第九章的实际主题。课程编排常见的第九章主题测验重点偏传统软件工程教材软件测试测试目的、测试方法、测试步骤黑盒/白盒方法、测试用例设计、单元到验收的层次面向对象教材面向对象方法学引论类与对象、封装/继承/多态、OO模型概念实践类课程软件测试工具与流程Junit等工具用法、测试计划撰写从近几年的测验反馈看吉林大学软件工程课更偏向前两行的组合也就是“测试基础面向对象基础概念”并行考察。尤其是测试一章出题面最宽选择、判断、简答、综合题都能出因此下面我会花大篇幅把测试类题目讲透。在讲具体题目之前要先建立一个认知章节测验的目标不是筛选你背了多少名词定义而是看你能否用软件工程的专业语言描述“过程”和“方法”。比如“什么是软件测试”人人都能答“发现错误”但阅卷老师期待的是你能说出“测试是为了发现错误而执行程序的过程它只能证明错误的存在不能证明错误不存在”。这个差别就是80分和60分的差别。另外一个容易被忽略的点测验中打包出现的概念常常互相干扰。比如“验证”和“确认”、“错误”和“故障”、“调试”和“测试”这些词在日常语境里意思差不多但在软件工程里是严格区分开的。选择题里最经典的坑就是拿日常语义替换专业术语。后面我会把这些对照组全部列出来。2. 选择与判断六个最容易丢分的基础概念章节测验的选择题和判断题考点高度集中在这六组概念辨析上。我把历年测验里高频出现的“坑”做成对照表建议你把这张表背下来再看下面的例题解析。容易混淆的概念关键区别经典错误表述验证 Verification每个阶段是否正确地完成了该阶段的工作“验证是确认软件是否符合用户需求”——注意这是确认确认 Validation是否满足了用户真正需求“确认是检查软件是否符合规格说明”——反了错误 Error人为产生的缺陷比如写错变量名把 Error 理解为程序崩溃的结果故障 Fault错误在代码中的具体体现把 Fault 理解为人的行为失败 Failure故障被执行时表现出的外部行为把 Failture 和错误混为一谈测试 Testing运行程序以发现错误的活动“测试是为了证明程序没有错误”调试 Debugging定位并改正错误的活动把调试当成测试的一部分判断题里最高频的一道是“软件测试的目的是证明软件没有错误。”答案是错误。理由很简单测试只能通过发现错误来证明软件有问题却永远无法穷举所有输入来证明一个程序完全正确。对于大型软件想通过测试证明“没有错误”在数学上不可行实际操作中更不可能。这个观念贯穿整个软件测试章几乎每个填空、判断都会绕回这一点。选择题里有一道反复出现的题“以下属于黑盒测试方法的是 。” A. 语句覆盖 B. 等价类划分 C. 判定覆盖 D. 路径测试答案是B。黑盒测试把程序看成一个不透明的盒子只关心输入和输出不关心内部逻辑结构。等价类划分、边界值分析、因果图、错误推测都属于黑盒。语句覆盖、判定覆盖、条件覆盖、路径覆盖都属于白盒它们需要依据程序内部的逻辑结构来设计用例。还有一道常见判断题“白盒测试不需要实际运行程序只需要阅读代码。”答案也是错误。白盒测试虽然基于代码逻辑设计用例但设计出来的用例仍然要实际执行才能观察覆盖情况不然“语句覆盖”里的“覆盖”根本无从谈起。很多同学看到“白盒”就联想到代码静态审查这是不对的代码审查属于静态测试而白盒测试本身是动态测试的一种两者并不等同。判断里的另一个高频考点是“错误聚类”原题通常是“经验表明程序中存在错误的概率与已经发现的错误数成正比。”答案是正确。这个观点出自软件测试的基本原则——测试中的群集现象一小段代码往往集中了大部分缺陷所以发现错误多的地方后面很可能还有更多错误。这条原则不是玄学而是基于大量项目统计得出的经验规律测验特别爱考它。如果你在做题时能把自己代入“出题人”的视角你会发现这些题全是同一个套路找一个容易混淆的日常词替换掉专业术语然后看你会不会中招。应对方法只有一个——把定义原文背准确不是背大意而是背关键限定词。3. 简答题阅卷老师到底在找什么关键词简答题是章节测验里最能拉开差距的题型。选择题不会还可以蒙简答题不会就真的一个字都写不出来。但从历届同学的反馈看简答题挂掉的原因往往不是没背而是背了却答不到点子上。我先把三道高频简答题的答题框架列出来每道题附带阅卷视角的“踩分点”。3.1 第一道软件测试的基本原则有哪些这道题的完整答案包括六条左右测试应尽早并持续进行。这不是喊口号而是因为缺陷发现得越晚修复成本越高。需求阶段的一个错误到维护阶段可能要花几十倍的代价去修正。测试用例应由测试输入数据和对应的预期输出结果两部分组成。很多同学漏掉后半句只说“输入数据”丢了预期结果这个关键要素。程序员应当避免测试自己的程序。原因是人对自己写的代码有思维定式很难跳出来故意挑错第三方测试相对更客观。充分注意测试中的群集现象。发现错误成堆的地方要重点继续测。严格执行测试计划排除测试的随意性。妥善保存测试计划、测试用例、出错统计和最终分析报告为维护提供方便。阅卷时老师看的是关键词是否提到“尽早”“预期结果”“尽量避免测试自己的程序”“群集现象”。只写一条“测试是为了发现错误”的最多给2分。3.2 第二道单元测试、集成测试、系统测试、验收测试有什么区别和联系这类题目要答出“层次结构”和“每个层次的目标”两层意思。单元测试针对每个模块重点是用白盒法测试模块内部的逻辑结构。集成测试是把模块组装起来重点测试模块之间的接口是否正确常见策略包括自顶向下、自底向上和混合策略。系统测试是把整个系统放在真实或模拟的运行环境中测试系统是否满足需求规格常用的有恢复测试、安全测试、压力测试、性能测试等。验收测试由用户参与确认软件是否满足用户需求是交付前的最后一道关卡。这四者的联系是一个层层递进的过程单元测试保证零件质量集成测试保证接口装配系统测试保证整机运行验收测试保证用户满意。漏掉“层次递进”这个逻辑只背单个概念得分会少一块。3.3 第三道什么是回归测试为什么它很重要回归测试是指修改软件之后重新执行之前已经做过的测试以确认修改没有引入新的错误。它的重要性在于软件修改往往具有连带效应——修好一个Bug的同时可能又制造出两个新Bug如果不做回归测试你根本不知道这次修改到底是改善了系统还是破坏了系统。这道题的踩分点是“修改后重新测试”和“为维护阶段提供安全网”这两层意思很多同学能说出前者说不出后者。回归测试贯穿测试和维护的始终它在教材里出现的位置恰恰是“软件维护”与“测试”的交叉地带简答题特别喜欢考。简答题的通用答题套路我总结成四步第一步写定义用教材原话第二步写过程或步骤按时间或逻辑顺序排列第三步写目的与作用第四步如果有多个要点用小序号隔开。这样写出来的答案即使和标准答案有出入阅卷老师也能快速找到给分点。4. 综合题实操黑盒测试用例设计的完整推演综合题是第九章测验里分值最高的一道常见形式是给你一个功能描述让你设计测试用例。很多同学觉得这种题没法准备其实恰恰相反它的解题套路比简答题更固定。只要掌握等价类划分和边界值分析这两板斧几乎能应付九成题目。我以下面这道经典题为例完整演示一遍推演过程。题目设计一个函数输入三个整数a、b、c判断它们能否组成三角形的三条边并输出三角形的类型等边三角形、等腰三角形、一般三角形或非三角形。请用等价类划分法设计测试用例并用边界值分析法补充用例。第一步是找出输入条件。这个函数的输入条件是“三个整数”隐含条件是每条边都要大于0且任意两边之和大于第三边。这些隐含条件就是从有效等价类划分到无效等价类的分界线。第二步划分有效等价类与无效等价类。有效等价类包括能构成等边三角形的情况如(3,3,3)能构成等腰三角形的情况如(3,3,4)能构成一般三角形的情况如(3,4,5)。无效等价类包括存在非数字或非整数的情况、存在负数或0的情况、不满足两边之和大于第三边的情况如(1,2,3)和(1,1,3)。第三步写出覆盖这些等价类的测试用例。每个等价类至少要有一个用例覆盖。这是评分的第一档等价类划分全不全。第四步用边界值分析法补充用例。边界值分析的核心是大量错误往往发生在输入的边界附近而不是在输入范围的中间区域。对于这个三角形函数边界情况包括边长为0的用例(0,3,3)验证非正数边界边长为负数的用例(-1,3,4)两边之和恰好等于第三边的用例(1,2,3)这是三角形成立与否的临界点两边之和略大于第三边的用例(2,3,4)这是合法区间的最小跨度三条边都相同的最小合法值(1,1,1)和三条边都相同的常规值(3,3,3)。最后把测试用例整理成表格每一条用例都要写清“输入”和“预期输出”两列不能只写输入。比如输入(3,3,3)时预期输出是“等边三角形”输入(1,2,3)时预期输出是“非三角形”。这一步特别重要因为测试用例的定义本身就包含输入和预期输出两部分漏掉预期输出这道题直接扣一半分。阅卷的时候老师看三样东西等价类划分是否覆盖了合法和非法情况边界值是否选在了临界点表格是否包含预期输出列。这也是你复盘时检查自己答题是否完整的三个维。5. 综合题实操白盒测试的路径覆盖是怎么给分的白盒测试的综合题通常是给你一小段程序或流程图让你设计测试用例满足某种覆盖标准。这类题看起来比黑盒复杂但只要理解了“覆盖”二字的本质它其实是一道机械题。先看一段经典程序很多教材的测试章都有类似的例子void example(int x, int y, int* z) { if (x 1 y 0) { *z *z / x; } if (x 2 || *z 1) { *z *z 1; } }题目问法通常有四种语句覆盖、判定覆盖、条件覆盖、路径覆盖。它们的难度是递进的逐一来看。语句覆盖要求每条可执行语句至少被执行一次。这里的可执行语句是两条赋值语句分别在两个if块内。要让第一个if里的赋值语句执行需要x 1且y 0要让第二个if里的赋值语句执行需要x 2或*z 1。取x 2y 0z 3就能同时覆盖两条语句。一个用例即可完成语句覆盖。判定覆盖要求每个判定的真分支和假分支都至少被执行一次。这个程序有两个判定所以至少需要两个用例一个让两个判定都为真如x 2y 0z 3另一个让两个判定都为假如x 1y 1z 1。注意这里z初始值也有讲究如果z取1则第二个判定的z 1为假加上x 2为假整个判定就是假。两个用例覆盖了四个分支。条件覆盖的要求更进一步每个判定中的每个条件的真和假都要出现一次。第一个判定包含两个条件x 1和y 0。第二个判定也包含两个条件x 2和z 1。要让这四个条件都取得真和假至少需要两个用例例如用例一x 2y 0z 3使得条件依次为真、真、真、真用例二x 1y 1z 1使得条件依次为假、假、假、假。这样就覆盖了所有条件的真假取值。最麻烦的是路径覆盖要求覆盖程序中所有可能的路径。这个程序的路径有四条两个if都不执行、只执行第一个if、只执行第二个if、两个if都执行。要覆盖这四条路径就需要四个用例两个if都不进x 0y 1z 1只进第一个if不进第二个x 2y 0z 1此时第一个if执行z/xz变成0第二个判定x 2为真……这个问题我后面再展开只进第二个if不进第一个x 0y 1z 2两个if都进x 2y 0z 3。从这道题能看出覆盖标准越严格需要的测试用例数量越多测试成本越高但发现缺陷的能力也越强。这是白盒测试综合题背后隐藏的核心考点。答题时一定要把每个用例的“输入”和“覆盖了哪些分支/条件/路径”写清楚只列输入不给解释等于没答。这类题有一个非常常见的失分点忘记考虑x、y、z之间的联动关系。比如用例“x 2y 0z 1”执行完第一个if后z变成了0这时走进第二个if条件x 2为真所以第二个if仍然会执行而不是你以为的“不执行”。编程题里的变量是会被修改的设计用例时必须把前一个操作的副作用考虑进去。这个细节十个答题的人里有三四个会栽在这上面。6. 面向对象考点在第九章里出现的频率和套路如果你的老师选的是面向对象教材或者测验里掺了一部分OO基础概念那你一定会碰到下面这批题。它们的特点是不考深但考得细尤其是几个基础概念的严格定义。类与对象这对概念几乎必考。类是对一类事物的抽象描述对象是类的实例。选择题最爱这么出“类是对象的____对象是类的____。”答案是“模板”和“实例”。还有一个同级别的坑“类与对象的关系是抽象与具体的关系。”这句话是对的。如果有人把对象理解成“类的另一个名字”那就完了。封装、继承、多态是面向对象的三大特性。封装指把数据和操作数据的方法捆绑在一起对外隐藏内部细节只暴露必要的接口。继承指子类可以复用父类的属性和方法同时可以增加自己的新特性。多态指同一个消息作用于不同对象时可以产生不同的行为。判断题高频考点是“多态就是指方法重载。”这个表述不严谨方法重载是编译时多态的一种实现方式但多态还包括运行时多态通过继承和虚函数实现把两者画等号就是典型的偷换概念。面向对象测试与传统测试的区别也是一个常考方向。传统测试在单元、集成、系统各阶段关注的是模块功能和模块间接口而面向对象测试中单元测试的对象是封装了数据和方法的类或对象集成测试更关注类之间通过消息传递实现的协作。这个区别可以概括成一句话传统测试以“功能”为中心面向对象测试以“类和对象间的交互”为中心。如果你的测验明确是面向对象这一章那么复习重点应该放在类与对象、属性与方法、消息、封装、继承、多态这几个术语的严格定义上再背几个经典的举例比如“把狗和猫都抽象成动物类它们都会叫但叫声不同这就是多态”。这类例子的好处是能在简答题里帮你说清楚抽象概念避免空对空。7. 考前一周和考场上真正决定分数的细节测试知识本身不难但很多人复习的节奏是错的。他们喜欢把时间花在反复看课件上看完一遍觉得“都会了”一合上课本什么都写不出来。正确的复习姿势是合上课件拿一张白纸用回忆的方式把测试的层次结构、黑盒白盒方法清单、覆盖标准定义一个个写出来写不出来的地方就是你的知识漏洞再翻书对照补漏。这个“主动回忆”的过程效率比被动看书高好几倍。考场上第九章测验的答题顺序也值得注意。我建议先做简答题再做综合题最后做选择题和判断题。原因很简单简答题和综合题考的是你对知识框架的整体把握趁记忆最清晰的时候先把大分拿到手选择和判断往往是细节辨析题很容易在一两个选项上纠结半天耗费大量时间。这不是我拍脑袋的建议而是很多高分同学共同验证过的时间分配方式简答加综合控制在50分钟以内选择和判断控制在30分钟左右剩下的时间用来检查判断题里有没有被偷换关键词的表述。书写细节上有一个容易拿分又容易被忽略的点综合题的测试用例一定要写“输入”和“预期输出”两列简答题一定要用小序号把多条要点分开。老师批卷不是看你的文采而是快速定位踩分点。你写得越结构化踩分点越明显得分就越稳定。还有一个很多人都不知道的联动逻辑如果你们课程还有配套的实验环节实验里通常会让写测试计划文档或者用某个工具跑测试用例测验题目往往会从实验内容里反推。比如实验里做了三角形判断的用例设计测验的综合题就极可能出同一道题的变体只是换一个功能需求。所以考前把你做过的实验文档重新翻一遍比盲目刷题库更有针对性。最后再说一个带复习时经常被问到的点。有人问我“第九章这么多概念到底哪些要背原文哪些理解就行”我的经验是所有由“是”或“是指”开头的关键定义尽量背原文所有带“过程”或“步骤”的理解顺序加记住首尾即可所有“分类”性质的内容比如测试方法的分类记住分类标准和每一类的典型例子就行。定义不背原文你会在简答题里写出“差不多对”但拿不到分的答案过程不背顺序你会把集成测试放在系统测试后面整道题逻辑崩塌。按照这套思路你再去翻第九章的课件会发现那些密密麻麻的知识点突然有了层次哪些要背原话哪些要会举例哪些要会画流程一目了然。测验考的不是智力而是有没有用对方法把时间花在真正会被考到的内容上。