C/C++单元测试培训0.落地·落地·落地:课程介绍王彤课程的适合对象企业内训个人学习程序员、测试员、开发测试管理人员基础要求:能看懂简单的C/C++代码自我介绍02年起:专注于单元测试技术支持与培训技术研究编码与单元测试贯穿课程始终的两个字落地基于现有条件在可承受的成本下追求最好的效费比落地落地技术上的落地课程的主体观念上的落地观念上的落地不要理想化不怕小白,最怕理想化理想化的特征很完美,做不到观念上的落地不要等待哪怕只测算法密集的代码也行下一个项目更没有条件拖一天,多一天遗留代码关于工具掌握一种工具领路工具:VisualUnit4深入廉价学工具,学的是思想扎实课程目录1.开始:单元测试入门2.领路工具:VisualUnit4入门3.把事情一次做好:eTDD基础6.耦合不是问题:底层输入4-5.降低成本的关键:表格驱动基础课程目录10.可贵的成果:测试输出与测试报告13.原来如此简单:测试思路11-12.一行数据构造出链表:表格驱动进阶7.解决疑难杂症:局部输入输出8-9.航空标准并不难:白盒覆盖课程目录22.一举多得:嵌入式单元测试15.舒服才是硬道理:开发过程改进14.她在灯火阑珊处:用例设计16-19.一起来做实际任务:综合应用20-21.测试自己的代码:测试工程学习建议必要的练习前17讲都可以直接做练习别着急测自己的代码学习前19讲后再测自己的代码C/C++单元测试培训1.开始:单元测试入门王彤wangtong@kailesoft.com什么是单元测试什么是单元测试什么是单元测试什么是单元测试????测试代码功能逻辑实现高质量高效率的编程这是代码的基本特性决定的代码基本特性代码基本特性代码基本特性代码基本特性对数据分类处理代码基本特性代码基本特性代码基本特性代码基本特性一个判定一次分类嵌套判定分类翻倍循环判定也是分类代码基本特性代码基本特性代码基本特性代码基本特性分类遗漏处理错误代码基本特性代码基本特性代码基本特性代码基本特性函数无错分类完整+处理正确功能逻辑正确如何检测功能逻辑如何检测功能逻辑如何检测功能逻辑如何检测功能逻辑????依分类列出数据检测是否作了处理处理是否正确单元测试如何做单元测试如何做单元测试如何做单元测试如何做单元测试????依数据分类列出输入执行被测程序判断输出是否符合预期单元测试方法实例单元测试方法实例单元测试方法实例单元测试方法实例intadd(inta,intb);什么是单元测试什么是单元测试什么是单元测试什么是单元测试????测试代码功能逻辑实现高质量高效率的编程这是代码的基本特性决定的单元测试单元测试单元测试单元测试::::保证代码质量保证代码质量保证代码质量保证代码质量函函函函数数数数函函函函数数数数只有单元测试全面检测功能逻辑单元测试单元测试单元测试单元测试::::提升过程管理提升过程管理提升过程管理提升过程管理改进代码的整体结构趋易避难的本能避免开发周期失控把事情一次做好,而不是一做再做提升代码的可维护性测试即文档适应频繁变化的需求回归测试,保证修改不破坏原功能单元测试单元测试单元测试单元测试::::大幅提升编程效率大幅提升编程效率大幅提升编程效率大幅提升编程效率什么输入执行哪些代码产生什么输出黑色为当前输入所执行代码单元测试单元测试单元测试单元测试::::大幅提升编程效率大幅提升编程效率大幅提升编程效率大幅提升编程效率黑色为当前输入所执行代码程序行为一目了然支持可视编程和eTDD真的没时间吗真的没时间吗真的没时间吗真的没时间吗????很好,没时间新增的工作?程序员的工作是编码和调试,没有时间做测试?程序员的工作程序员的工作程序员的工作程序员的工作测试:找错调试:排错程序员其实花很多时间找错单元测试:找错排错程序员的工作程序员的工作程序员的工作程序员的工作节约的时间(效益)增加的时间(成本)手工方式:持平(假如做得了的话)单元测试技术在快速进步使效益远大于成本:C/C++单元测试培训2.领路工具:VisualUnit4入门王彤wangtong@kailesoft.comVisualUnit4VisualUnit4VisualUnit4VisualUnit4简称VU4表格驱动的C/C++单元测试工具eTDD(easyTDD)工具不用写代码下载与安装下载与安装下载与安装下载与安装目前只有windows版本除windows项目外,可以测试多数嵌入式项目,与cygwin配合,也可以测试linux项目可在凯乐软件官网下载安装:一路“下一步”实例演示实例演示实例演示实例演示VU4VU4VU4VU4功能与操作功能与操作功能与操作功能与操作unsignedintpow(unsignedintg,unsignedinte);计算g的e次方C/C++单元测试培训3.把事情一次做好:eTDD基础王彤wangtong@kailesoft.comTDDTDD:测试驱动开发先写测试,再编程让测试通过TDD优势:设计先行,减少偏差增量验证,最快排错强制测试,保证质量eTDDeTDDeTDDeTDDTDD太难,成本太高消灭TDD主要成本放大TDD效益eTDD,easyTDD,易行版TDD自动化可视编程eTDD目标:编写合格代码的产能翻2番自动化与可视编程自动化与可视编程自动化与可视编程自动化与可视编程自动化除了测试数据,其他都由工具完成编程过程中,程序行为可视可视编程工具不可能自动了解代码功能,测试数据不可能自动生成什么是程序行为什么是程序行为什么是程序行为什么是程序行为????什么输入执行哪些代码产生什么输出黑色为当前输入所执行代码什么是可视编程什么是可视编程什么是可视编程什么是可视编程????编程过程中程序行为可视验证思路激发灵感发现错误实例演示可视编程过程实例演示可视编程过程实例演示可视编程过程实例演示可视编程过程char*strtrml(char*str);删除字符串左边空格可视编程小结可视编程小结可视编程小结可视编程小结多做了什么?记录“所想”,设计先行一盏明灯,照亮编程过程得到了什么?单元测试同步完成,质量效率双飞跃结果是什么?前三章总结前三章总结前三章总结前三章总结都是基础知识涉及的都是简单独立的函数复杂的数据,高度的耦合实际的代码复杂得多底层输入局部输入局部输出高标准覆盖……且听下回分解C/C++单元测试培训4.降低成本的关键:表格驱动基础之一王彤wangtong@kailesoft.com什么是表格驱动什么是表格驱动什么是表格驱动什么是表格驱动????编写测试代码代替在表格中填测试数据表格驱动是单元测试趋势吗?表格驱动的要求表格驱动的要求表格驱动的要求表格驱动的要求支持:复合类型数组空指针(多级)数组类型转换底层输入局部输入局部输出多次赋值/判断自定义接口表格驱动演示表格驱动演示表格驱动演示表格驱动演示一系列示例表格驱动的高级技术表格驱动的高级技术表格驱动的高级技术表格驱动的高级技术支持List、Map等利用现有代码快速构建复杂数据数据文件在表格进阶章介绍调用脚本C/C++单元测试培训5.降低成本的关键:表格驱动基础之二王彤wangtong@kailesoft.com什么是表格驱动什么是表格驱动什么是表格驱动什么是表格驱动????编写测试代码代替在表格中填测试数据表格驱动是单元测试趋势吗?表格驱动的要求表格驱动的要求表格驱动的要求表格驱动的要求支持:复合类型数组空指针(多级)数组类型转换底层输入局部输入局部输出多次赋值/判断自定义接口表格驱动演示表格驱动演示表格驱动演示表格驱动演示一系列示例表格驱动的高级技术表格驱动的高级技术表格驱动的高级技术表格驱动的高级技术支持List、Map等利用现有代码快速构建复杂数据数据文件在表格进阶章介绍调用脚本C/C++单元测试培训6.耦合不是问题:底层输入王彤wangtong@kailesoft.com函数调用对测试的影响函数调用对测试的影响函数调用对测试的影响函数调用对测试的影响无影响大影响如何解决耦合如何解决耦合如何解决耦合如何解决耦合????过去的方法:桩输出、模拟对象编写很多额外代码桩:使数据分散模拟对象:影响产品代码根源:大绕弯子要抓住本质要抓住本质要抓住本质要抓住本质底层函数产生的数据也是分类处理也要分类检测与参数输入无区别底层输入底层输入底层输入底层输入调用底层函数产生的数据测试意义与参数输入无区别设置、管理方式也应该类似实例演示实例演示实例演示实例演示底层输入设置实例C/C++单元测试培训7.解决疑难杂症:局部输入输出王彤wangtong@kailesoft.com局部输入输出局部输入输出局部输入输出局部输入输出局部输入局部输出内部设置变量的值内部判断变量的值,如计算一个报文并发送拼出一个sql语句并执行计算结果直接存文件计算结果传递给下级函数我想看看中间计算结果实例演示实例演示实例演示实例演示局部输出实例局部输入输出局部输入输出局部输入输出局部输入输出局部输入局部输出内部设置变量的值内部判断变量的值局部输入输出局部输入输出局部输入输出局部输入输出局部输入内部设置变量的值局部静态变量界面输入简化数据设置模拟中断对全局变量的修改死循环处理实例演示实例演示实例演示实例演示局部输入实例C/C++单元测试培训8.航空标准并不难:白盒覆盖之一王彤wangtong@kailesoft.com黑盒测试与白盒测试黑盒测试与白盒测试黑盒测试与白盒测试黑盒测试与白盒测试白盒:依据内部结构黑盒:依据外部功能软件测试分类软件测试分类软件测试分类软件测试分类依测试标的单元测试集成测试系统测试性能测试黑盒测试白盒测试依测试方法单元测试!=白盒测试黑盒方法白盒方法绝不能犯的错误绝不能犯的错误绝不能犯的错误绝不能犯的错误单元测试==白盒测试跟着代码走×软件测试分类软件测试分类软件测试分类软件测试分类依测试标的单元测试集成测试系统测试性能测试黑盒测试白盒测试依测试方法黑盒方法白盒方法白盒方法在单元测试中的应用主要在于白盒覆盖什么是白盒覆盖什么是白盒覆盖什么是白盒覆盖什么是白盒覆盖????测试对代码逻辑单位及其组合的执行状况代码基本逻辑单位代码基本逻辑单位代码基本逻辑单位代码基本逻辑单位语句条件判定分支≈≈≈≈判定判定判定判定白盒覆盖的意义白盒覆盖的意义白盒覆盖的意义白盒覆盖的意义未覆盖逻辑单位未测试数据衡量测试完整性找出遗漏用例白盒覆盖白盒覆盖语句及组合条件及组合语句覆盖分支覆盖路径覆盖条件覆盖条件组合覆盖判定覆盖判定条件覆盖(C/DC)修正判定条件覆盖(MC/DC)语句的组合欧美航空标准修正判定条件覆盖修正判定条件覆盖修正判定条件覆盖修正判定条件覆盖(MC/DC)(MC/DC)(MC/DC)(MC/DC)每个条件独立影响判定结果本身相反其他相同结果相反两个用例修正判定条件覆盖修正判定条件覆盖修正判定条件覆盖修正判定条件覆盖(MC/DC)(MC/DC)(MC/DC)(MC/DC)每个条件独立影响判定结果本身相反其他相同结果相反两个用例修正判定条件覆盖修正判定条件覆盖修正判定条件覆盖修正判定条件覆盖(MC/DC)(MC/DC)(MC/DC)(MC/DC)每个条件独立影响判定结果本身相反其他相同结果相反两个用例推荐标准推荐标准推荐标准推荐标准::::MC/DCMC/DCMC/DCMC/DC欧美航空标准,强度足够已包含语句、条件、判定覆盖用例数不太多(条件数+1)通用性好(代码结构造成的影响不大)路径覆盖:不相关的逻辑块会组合出海量无意义的路径。VU4VU4VU4VU4的覆盖标准的覆盖标准的覆盖标准的覆盖标准100%MC/DC可自行设定未达标的,称为欠缺,显示黄灯C/C++单元测试培训9.航空标准并不难:白盒覆盖之二王彤wangtong@kailesoft.com实例演示实例演示实例演示实例演示实例演示C/C++单元测试培训10.可贵的成果:测试输出与测试报告王彤wangtong@kailesoft.com实例演示实例演示实例演示实例演示实例演示C/C++单元测试培训11.一行数据构造出链表:表格驱动进阶之一王彤wan