一.综述
1.测试优先
2.等价划分和边界值分析
3.代码覆盖度
4.黑盒(白盒)测试
二.软件测试(software testing)
1.以发现错误为目的(并不是证明一个程序正确),并验证是否适合使用
2.即使是最好的测试,也无法达到100%无错误
3.一个好的测试:能发现错误,不冗余,具有最佳特性,不复杂也不简单
4.测试等级(level)
(1)单元测试:针对方法和类进行的测试
(2)集成测试:针对外部接口进行的测试,每个单元测试完了之后合在一起对大单元测试
(3)系统测试:对整个完整系统的测试
(4)验收测试:客户端的测试
(5)回归测试:改之前测试发现的bug时可能会引入新的bug,所以在改完之后必须将之前的测试用例再跑一遍
5.静态测试 vs 动态测试
(1)静态测试:是在不实际执行程序的情况下执行,目的是尽早发现bug,借助编程工具或文本编辑器等检查代码结构,审查、浏览、检查等等
(2)动态测试:用一组测试用例来实际运行代码,可以在程序100%完成之前开始以测试指定模块、特定部分,例如使用存根、驱动器或从调试环境中执行
6.测试 vs 调试
测试是为了发现错误,调试是为了识别错误根源,消除错误
让代码尽快出错,以便消除
7.黑盒测试 vs 白盒测试
(1)白盒测试:对程序内部代码结构的测试
(2)黑盒测试:对程序外部表现出来的行为的测试
白盒测试关注的是程序内部的结构,黑盒测试关注的是程序的功能
黑盒测试可以放到外部测试里面去做,白盒测试由程序员完成
注:白盒测试和黑盒测试都无法做到完备性(覆盖所有测试用例)
三.测试用例
1.组成:输入+执行条件+期望结果,是输入和期望结果组成的一个点对,例如{2,4}、{0,0}等
2.好的测试用例:最可能发现错误,不重复不冗余,最有效,既不简单也不复杂
四.测试优先的编程
1.含义:先写测试,程序通过测试用例即正确
先写程序的功能需求,然后直接写全所有测试用例,写程序就是为了通过所有的测试用例。不推荐,只能保证正确性,不能保证其他特性
不要把测试留到最后,当你有一大堆未验证的代码时。把测试留到最后只会让调试变得更漫长、更痛苦,因为bug可能在你代码的任何地方。
2.过程:
(1)写规约(规范,specification,简称spec),规约由参数约束,返回值描述(输入输出),方法签名和注释(对输入输出的描述)构成
(2)写符合spec的测试用例
(3)写代码、执行测试、有问题再改、再执行测试用例,直到通过它
3.规约
一大段文字分三部分,先写输入的参数约束,作为前置条件,后来又写返回值以及返回异常时的处理作为后置条件,然后是方法签名
3.测试驱动的开发(TDD)
(1)将需求变为通过测试,以通过测试为目的
(2)先写测试用例,方便进行调试
五.单元测试
(1)针对类和方法的测试,隔离各个模块,易于发现错误和调试
(2)考虑因素:接口,测试输入输出;数据的一致性;所有语句都被执行到;边界值检查;异常处理路径本身
(3)驱动模块(调用模块)、桩模块(被调用模块)
六.JUnit
(1)自己写的程序叫被测试类/方法,@Test下的测试程序是测试类/方法
(2)参数顺序:期望在前,实际在后
(3)不同测试方法之间没有影响
七.黑盒测试
1.用于检查代码的功能,不关注具体实现细节,而白盒测试关注的是程序内部执行路径,将一个复杂的软件分解成不同块,就像黑盒测试和白盒测试一样,就是把整个测试分成2块,分别去做
2.黑盒测试能发现的问题:发现缺失的功能,发现接口的错误,发现数据类型的错误,程序行为的错误,初始化或终止的错误
3.黑盒测试的测试用例
(1)围绕是否符合规约建立的,测试用例一般来自于软件的外部描述,包括规格、要求和设计参数
(2)黑盒测试测不到代码界面
(3)用尽可能少的测试用例将尽可能所有测试功能都测到
7.1等价类划分
(1)基于等价类划分的测试:将被测函数的输入域划分为等价类,从等价类中导出测试用例(每个等价类里面选一个),针对约束条件划分等价类
(2)一般每个等价类的划分都是针对输入条件满足/不满足的数据集合,条件包含布尔值,数值(范围)…
(3)需要同时满足多个条件时,多个条件形成的多个等价类交集是有效测试用例,其余为无效
例如:大整数乘法 ab=c
(1)可以根据a,b的正负进行划分
(2)考虑特殊情况:a或b是0,1,-1
(3)若a或b大于long类型能表达的最大整数值(此时乘法形式不一样了)
针对序对(a,b)
注:有效的等价类:没有错误并且包含所有有效范围
7.2 包含边界值
1.边界值是对等价类划分方法的补充
例如:比较a和b的大小时,可以将min和max单独补充为两个等价类
2.多个划分维度上的多个取值要组合起来(笛卡尔积全覆盖),每个组合都有一个测试用例,测试完备,但用例数量多,测试代价高
(注意:并非所有组合情况都有可能)
3.每个维度每个取值至少覆盖一个测试用例,测试用例少,代价低,但测试覆盖度未必高
**注:这两者区别,比如说比较a和b谁大,笛卡尔积就需要对a,b分 >0,=0,<0,max,min这5种,55=25;后者就需要分a>b,a=b,a<b,min,max 5种即可**
八.白盒测试
1.黑盒测试完全从spec种导出测试用例即可,不用考虑函数内部实现
2.白盒测试要考虑内部实现细节
例如,一个输入有不同算法实现的时候,白盒测试可以观察各种算法实现得是否正确;白盒测试可以看内部缓存是否能存储有效结果
3.对执行路径的测试,根据执行路径设计测试用例,得看具体的程序,一般比较早执行
4.设计测试用例使每个语句,每个条件、每个分支、循环至少覆盖一次,每一条基本路径至少覆盖一次
九.代码覆盖率检测
1.代码覆盖度:已有的测试用例有多大程度覆盖了被测程序,高覆盖率意味着含有未被发现的软件缺陷的可能性较低
2.分为函数覆盖、语句覆盖、分支覆盖、条件覆盖、路径覆盖(任何一个程序执行的可能组合)等
注:代码覆盖度越低,测试越不充分,但要做到很高的代码覆盖度,需要更多的测试用例,测试代价高
3.测试效果:路径覆盖>分支覆盖>语句覆盖,分支覆盖和条件覆盖不可比
分支组合覆盖大于二者
4. 测试难度:路径覆盖>分支覆盖>语句覆盖
十.自动测试和回归测试
1.回归测试:一旦程序被修改,重新执行之前的所有测试
十一.记录你的测试策略
1.测试策略就是根据什么来选择测试用例
2.写测试策略就是写等价类划分,写这些测试用例是如何被选择的
第二章 软件测试和测试优先的编程
本文探讨了测试优先原则,等价划分与边界值分析在软件测试中的应用,涵盖了单元测试、集成测试、系统测试等各级别,并区分了静态与动态测试、测试与调试的区别。讲解了黑盒与白盒测试,以及如何通过等价类划分和边界值覆盖来设计高效测试用例。还涉及了代码覆盖率的概念及其衡量方式,以及自动测试与回归测试的重要性。
摘要由CSDN通过智能技术生成