1. 软件生命周期=软件定义+软件开发+运行维护。
软件定义(问题定义,可行性研究,需求分析)|软件开发(总体设计,详细设计,编码和单元测试,综合测试)|运行维护(持久满足用户需要)
实现包括编码和测试两个阶段。
测试贯穿于软件定义与开发的整个期间。测试阶段的根本目标是采用少量高效的测试用例尽可能多的发现并排除软件中隐藏的错误,把一个高质量的软件交给用户。成功的测试是发现了至今尚未发现的错误。关键技术是设计测试方案(测试目的+测试用例【测试数据+预期的输出结果】)。
① 所有测试都应追溯到用户需求。从用户的角度看,是否满足用户的需求
② 远在测试之前就制定出测试计划。一旦完成需求模型就开始测试计划,建立设计模型后就制定出测试计划。为了防止错误的扩展。
③ 找出程序中可疑的模块并彻底的测试他们。
④ 从“小模块”测试开始,逐步进行“大规模”测试。先测试单个程序模块,再从集成的模块簇中,最后在整个系统中寻找错误。
⑤ 穷举测试不可能。把程序所有可能的执行路径都检查一遍,时间,人力,资源,不可能执行每个可能的路径。∴应当精心设计测试方案,才有可能充分覆盖程序逻辑。
3. 测试方法
测试任何产品都有两种测试方法,“黑”and“白”。
黑盒测试(功能测试)——已知产品应该具有的功能,检查程序功能是否能按照规格说明书的规定正常使用,程序是否能正确接受输入并产生正确的输出。 把程序看成一个黑盒子,不考虑程序的内部结构。在程序的接口处进行的测试。早期使用。
黑盒测试技术:
① 等价划分:把程序的输入划分成若干个数据类,比如有效输入的等价类有哪几种,无效输入的又有哪些情况,这样从每个类中抽一组数据即可测试。“输入XXXX,预期输出XXX”。
② 边界值分析:刚好等于,小于,大于(除了边界值还有边界值相邻的—健壮性测试)
③ 错误推测
④ 特殊值测试
⑤ 随机测试:随机数生成器生成的测试用例值
白盒测试(结构测试)——已知产品内部工作过程,检验产品内部动作是否按照规格说明书的规定正常运行,按照程序内部的逻辑测试程序,检验程序中的主要执行通路是否按照预定要求正常工作。把程序看作装在一个透明的白盒子里,完全知道程序的结构和处理算法。后期使用。
白盒测试典型技术:
① 逻辑覆盖:a.语句覆盖(只要每个语句能至少执行一次,但是检测不出逻辑上的问题eg.X>1写成X<1)b.判定覆盖(分支)(不仅每个语句要执行一次,每个判定的分支也要执行一次,但是也检测不出内部条件的错误eg.X>1写成X<1)c.条件覆盖(不仅每个语句一次,而且要求每个分支各种可能的结果都要取到)d.路径覆盖
② 控制结构测试:根据程序的控制结构设计,有基本路径测试。
4. 测试步骤
大型系统——若干个子系统——每个子系统有许多个模块。
①模块测试(单元测试):使用白盒测试方法。每个模块完成一个子功能。编写源代码并通过编译程序的语法检查后,用详细设计描述做指南,对重要的执行通路进行测试,以便发现模块内部错。
eg:检查重要的执行通路;检查边界条件,处理n元数组的第n个元素,i次循环的第i次,刚好<,>=。程序员本人进行代码审查。
②子系统测试,系统测试(集成测试):集成测试主要测模块的接口。每个模块都测试好了,但加在一起一旦出错就很难找出错误。而自顶向下集成解决了。
a. 自顶向下集成:在测试早期进行。从主模块开始,沿着程序的控制层次向下移动,逐渐把各个模块结合起来。按照怎么的顺序加进去可选用DFS,BFS策略。Eg.M1测试过了,再把M2集成到M1中再测试。∴不需要写驱动程序(主程序),只需要写存根程序(子程序)。
b. 自底向上集成:在测试的晚期进行。从底向上一点点累加成一个完整的主程序。需要写驱动主程序,不需要写存根子程序。
*回归测试:集成测试加入一个新模块,程序就会发生变化。∴回归测试是重新执行已经测试过的某个子集,以保证新的变化不会有非预期的副作用。
③验收测试(确认测试):属于黑盒测试。用户为主进行。
若一个软件是为许多客户开发的,进行Alpha和Beta测试。
a. Alaph测试:用户在开发者的场所进行。开发者对用户指导测试。
b. Beta测试:开发者不在,用户们在客户场所“真实”应用。
5. 调试(纠错)
测试发现错误之后排除错误的过程。 为了改正错误,首先必须确定错误的准确位置。测试和调试两个关系密切,交替进行。
面试题
1. 自动化测试为何重要?(答:提高工作效率,让测试人员从枯燥解放出来)
2. 一个测试结束的标准?(答:查看已提交的bug是否已全部解决并已验证关闭,bug验证率95%以上)
3. 一个测试计划中包括哪些内容?(答:产品的功能模块,测试工具的确认,测试方法的确定,确定每一阶段的任务和所需资源)
4. 功能测试和可用型测试的区别?(答:功能测试,又叫黑盒测试,一般从产品的界面,架构出发,按照需求编写出测试用例;可用型测试是用户和系统在交互时对用户体验质量的度量,eg:有效?效率如何)主观感受怎样?是由用户来进行。)
5. int FindMiddle ( int a,int b,int c )和int CalMiddle ( inta,int b,int c )他们都号称能返回三个输入int的中间大小的那个int,不给看源代码,如何判断哪个函数好?(答:先找些特殊值,eg 0 0 0, 0 0 1看测试结果;再随便输入一些非数字的,测下排错功能;若结果一样,测算法效率,eg:计算1000个数测试用时。)
6. 写一个函数测试输入数是否为回文数?(答:把输入的数按位存储。%10存在个位,/10循环;比较首位与末尾是否相同;不同直接退出,相同则继续比较,首位递增,末尾递减,直到首位不再小于末位)
7. 写一个电梯功能的测试用例和测试方案(答:电梯状态:上行;上行楼层暂停未开门;上行楼层暂停已开门;下行; ; ; 电梯类,根据请求转换自身状态,梯内关/开门请求;楼梯同/逆向请求; 测试可以考虑电梯环境是商场性还是公寓型)
8. 写一个测试用例和测试方案测试手机(答:对于功能Calling:①是否有拨打电话这个功能②拨打正常号码③拨打不正常号码,是否有提示。对于SMS:①是否有发送,接受短信功能;②输入正常号码发送短信③输入不正常号码是否有提示④发送短信能否保存在发件箱,能否删除; 对于Adress book:①是否有电话本这个功能;②新建联系人,信息填空是否提示③联系人重复是否提示④删除联系人是否提示)