第一章 测试团队的发展之路
1.1 测试团队面临困局
测试自动化难
测试结果噪声大
测试不充分
测试人员对自身成长的焦虑
1.2建立代码门禁
1.2.1 什么是代码门禁
1.2.2 代码门禁的效果
1.2.3 落地和优化
优化
缩短时间
提高稳定性
1.2.4更多用途
Bug Jail:某人的bug太多,不允许开发新功能
代码围栏:核心代码。有经验人员检查
组件升级:公共jar包。每个小组强制升级
1.3 理解测试本质
缩短反馈弧(时间)关键
降低反馈成本
提高反馈可信度
1.4 缩短反馈弧(时间)
为什么要缩短反馈弧
如何才算缩短反馈弧
反馈不需要等
反馈本身耗时短
缩短反馈弧的成本和投入产出比
建立CI
1.5提升测试的稳定性
1.5.1高频
持续打包(每半个小时到一个小时对主干或分干进行打包)
发布 多次发布可以降低发布失败的频率
证书和秘钥的更新。可以验证证书是否容易过期,不可以自动化等问题
容灾演练
好处
缩短反馈弧
变主动验证为“消极等待”,减少测试人员的工作量
识别和确定小概率时间
暴露基建层不稳定因素
倒逼人工环节自动化
为分析提供更多数据
1.5.2 隔离
好处
减少噪音
提高效率
方法
硬隔离(物理隔离):适合规模较小的时候
软隔离(逻辑隔离):适合规模较大的时候
软隔离最终态:Test in Production(TiP)
TiP的必然存在原因
线下环境容量优先
上下游支持粒度不够
线下环境与生产环境不一致
1.5.3 用完即抛
测试环境是短暂的
好处
环境问题,脏数据
提高可复用性
倒逼各种优化和自动化及建设能力(建立环境,造数)
提高资源使用流动性
能力
测试环境搭建能力要强
测试策略和自动化设计不依赖一个长期存在的环境中
日志要妥善保管
行为
一个测试环境默认48h
可以延期,每次延期24h(newExpTime=now 24h and not newExpTime=currentRxpTime 24h)
最多可延期7天
1.5.4 不自动重跑
没有通过的自动化测试用例不让他自动重跑,避免丢失潜在Bug
1.6 提升测试的有效性
1.6.1测试有效性面临挑战
1)“注水”成功率和覆盖率:没有assert
加强代码审核
静态分析代码
靠价值观保障
2)谁来保证测试代码的质量
1.6.2 变异测试和Bug引入
1.6.3 更多注入类型
线下质量红蓝防控
报文注入 jvm-sandbox
1.7 提升测试的充分性
测试用例自动生成
1 从测试用例生成技术来的角度看
1)录制回放
2)基于符号执行(Sysmbolic Execution):
JBSE是用于自动程序分析,验证和测试生成的符号Java虚拟机。 JBSE允许使用符号输入执行任意Java方法。 符号输入代表JBSE在其上不进行任何初始假设的任意原始值或参考值。 在执行期间,JBSE在符号输入上引入了假设,例如,决定是否必须在某个点上遵循条件语句的“ then”或“ else”分支,或者决定是否使用符号引用访问字段会产生值或引发NullPointerException 。 在这些情况下,JBSE将可能的情况分解并分析所有情况,并在可能的情况下回溯。 通过这种方式,JBSE可以探索Java程序在馈入可能的无限类输入时的行为方式,这与程序测试始终受到限制,而程序测试始终限于一次调查单个行为。
JBSE是一个库,可以集成到需要对Java字节码程序的运行时行为进行分析的任何软件中。
JDart是一款较为成功的面向JAVA的符号执行工具,它提供了良好的模型和框架。然而,目前JDart只能支持基本简单的数据类型,如Int、Char的符号化,而对于复杂数据类型如Array、String、Object等还无法进行符号化,因而影响了其推广和应用。
SUSHI:未查到
3)基于模型
有限状态机(FiniteStateMachines):
有限状态自动机(FSM "finite state machine" 或者FSA "finite state automaton" )是为研究有限内存的计算过程和某些语言类而抽象出的一种计算模型。有限状态自动机拥有有限数量的状态,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。有限状态自动机可以表示为一个有向图。有限状态自动机是自动机理论的研究对象。
理论证明(TheoremProving)
约束逻辑编程(ConstraintLogicProgramming)首先介绍了s-语义方法的基本思想,然后采用这种方法讨论了约束逻辑程序一个重要的可观察性特征——多重回答约束,并给出相应的语义,使得从语义角度反映了约束逻辑程序的并行特征,而且引入了一个新的关于程序等价的定义,从更严格的角度分析了程序的等价,加深了对程序的理解,有助于程序员编写高效和简洁的程序,突出了约束逻辑程序设计系统作为程序设计语言的特征。
模型检查器(ModelChecking)
马尔可夫链(MarkovChain)是概率论和数理统计中具有马尔可夫性质(Markov property)且存在于离散的指数集(index set)和状态空间(state space)内的随机过程(stochastic process) 。适用于连续指数集的马尔可夫链被称为马尔可夫过程(Markov process),但有时也被视为马尔可夫链的子集,即连续时间马尔可夫链(Continuous-Time MC, CTMC),与离散时间马尔可夫链(Discrete-Time MC, DTMC)相对应,因此马尔可夫链是一个较为宽泛的概念。
4)基于搜索
基于搜索的测试用例自动生成技术(SBST)是基于搜索的软件工程(SBSE)的一个子领域。
全局搜索算法包括
遗传算法(Genetic Algorithm,GA)最早是由美国的 John holland于20世纪70年代提出,该算法是根据大自然中生物体进化规律而设计提出的。是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型,是一种通过模拟自然进化过程搜索最优解的方法。该算法通过数学的方式,利用计算机仿真运算,将问题的求解过程转换成类似生物进化中的染色体基因的交叉、变异等过程。在求解较为复杂的组合优化问题时,相对一些常规的优化算法,通常能够较快地获得较好的优化结果。遗传算法已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域
粒子群优化算法(Particle Swarm optimization,PSO)又翻译为粒子群算法、微粒群算法、或微粒群优化算法。是通过模拟鸟群觅食行为而发展起来的一种基于群体协作的随机搜索算法。通常认为它是群集智能 (Swarm intelligence, SI) 的一种。它可以被纳入多主体优化系统(Multiagent Optimization System, MAOS)。粒子群优化算法是由Eberhart博士和kennedy博士发明。
蚁群算法是一种用来寻找优化路径的概率型算法。它由Marco Dorigo于1992年在他的博士论文中提出,其灵感来源于蚂蚁在寻找食物过程中发现路径的行为。 这种算法具有分布计算、信息正反馈和启发式搜索的特征,本质上是进化算法中的一种启发式全局优化算法。
局部搜索算法包括
爬山算法是一种局部择优的方法,采用启发式方法,是对深度优先搜索的一种改进,它利用反馈信息帮助生成解的决策。 属于人工智能算法的一种。从当前的节点开始,和周围的邻居节点的值进行比较。 如果当前节点是最大的,那么返回当前节点,作为最大值(既山峰最高点);反之就用最高的邻居节点来,替换当前节点,从而实现向山峰的高处攀爬的目的。如此循环直到达到最高点。
模拟退火算法(Simulated Annealing,SA)最早的思想是由N. Metropolis 等人于1953年提出。1983 年,S. Kirkpatrick 等成功地将退火思想引入到组合优化领域。它是基于Monte-Carlo迭代求解策略的一种随机寻优算法,其出发点是基于物理中固体物质的退火过程与一般组合优化问题之间的相似性。模拟退火算法从某一较高初温出发,伴随温度参数的不断下降,结合概率突跳特性在解空间中随机寻找目标函数的全局最优解,即在局部最优解能概率性地跳出并最终趋于全局最优。模拟退火算法是一种通用的优化算法,理论上算法具有概率的全局优化性能,目前已在工程中得到了广泛应用,诸如VLSI、生产调度、控制工程、机器学习、神经网络、信号处理等领域。
Jtest:Parasoft的Jtest的是一个综合的发展广泛的实践证明,以提高开发团队的工作效率和软件质量的自动化测试解决方案。侧重于实践验证的Java代码和应用程序,无缝集成Parasoft的SOAtest以使最终结束今天的复杂的,分布式的应用和交易的功能和负载测试。
Jcrasher:JCrasher是一个用于Java代码的自动健壮性测试工具。JCrasher检查一组Java类的类型信息,并构造代码片段,这些代码片段将创建不同类型的实例,以测试随机数据下公共方法的行为。JCrasher试图通过使被测程序“崩溃”来检测bug,也就是说,抛出一个未声明的运行时异常。尽管一般来说,随机测试方法有许多局限性,但它也具有完全自动化的优点:除了对导致碰撞的测试用例进行离线检查外,不需要任何监督。与其他类似的商业和研究工具相比,JCrasher提供了一些新颖之处:它可传递地分析方法,确定每个测试方法的参数空间大小,并选择参数组合,从而随机选择测试用例,同时考虑分配给测试的时间;它定义了用于确定Java异常是否应被视为程序错误或JCrasher提供的输入是否违反了代码的先决条件的启发式方法;它包括支持有效撤销先前测试引入的所有状态更改;它为流行的Java测试工具JUnit生成测试文件;并且它可以集成在Eclipse IDE中。
eToc:没找到
Randoop:Randoop是一个为JAVA单元测试生成测试用例的框架(生成器),它基于Junit格式为编译后JAVA字节码(classes)自动生成测试用例.
andoop通过反馈式的随机测试来生成测试用例,由于测试数据的随机性,随机测试往往很难有较高的覆盖率。Randoop地址:http://randoop.github.io/randoop/
EvoSuite:EvoSuite是由Sheffield等大学联合开发的一种开源工具,用于自动生成测试用例集,生成的测试用例均符合JUnit的标准,可直接在JUnit中运行
GRT:没找到
Zest(The Eclipse Visualization Toolkit) 是在 Eclipse 平台基础上开发的一套可视化图形构件集合,方便开发和 UML 相关的图形应用程序,但范围不限于 UML 相关的应用,也可以用来开发工作流程图形化建模,树状结构图等。
RLCheck:没找到
基于覆盖率的模糊测试(Coverage-guidedFuzzing)
2 从测试过程的角度看
用例的自动生成=测试数据的自动生成 测试方法序列的自动生成 测试预言(TestOracle)的自动生成
1)测试数据的自动生成
符号执行(SymbolicExecution)
随机生成方法序列来产生对象状态
Randoop
AgitarOne是美国Agitar公司推出的一款Java自动化单元测试软件,这款软件在技术上处于世界上绝对的领先地位,牢牢的掌控了下一代单元测试软件的发展趋势。
Jtest通过人工撰写数据生成方法
JQF:https://github.com/rohanpadhye/JQF。JQF 是一个 Java 模糊测试库,通过改变参数的值对您的代码执行模糊测试,并可能发现您以前从未想过的错误。JQF Maven插件文件运行:mvn jqf:fuzz
Zest
RLCheck:https://github.com/sameerreddy13/rlcheck
基于搜索生成方法序列来产生对象状态
EvoSuite
2)测试预言的自动生成
Parasoft的Jtest
Agitar的AgitarOne
1.7.2业务覆盖率度量
1.8从测到不测
从测到不测的方法有很多,主要包括下面两类。
防错设计:在架构、代码、交互等层面优化和加固设计,减少人为错误发生的可能性,或者降低人为错误可能导致的影响。
代码扫描:不写任何测试用例、不执行任何测试,直接对代码进行分析,找到代码中的问题,甚至自动修复Bug
1.8.1防错设计
1.Poka-yoke:是精益制造(LeanManufacturing)领域的一个概念,意思是“防错”。Poka-yoke的概念最早是新乡重夫在丰田汽车引入的。
2.软件开发的Poka-yoke软件开发的Poka-yoke
3.支付系统防错设计的六类常见问题
第一类:没有第一时间校验输入值
第二类:线上线下权限隔离没做好
第三类:视觉辨识度不佳
第四类:代码容易写错
第五类:事情忘记做了
第六类:事情没按照正确的方式做
1.8.2 静态代码分析和Bug自动识别
1.静态代码分析
2.Bug自动识别