• 1. 单元测试理论基础——培训材料
  • 2. 什么是单元测试 测试是软件开发的重要环节之一。按照软件开发的过程测试可分为:单元测试、集成测试、系统测试、域测试(Field test)等。我们这里将讨论面向程序员的单元测试。 单元测试定义 单元测试目的 单元测试的特点 单元测试的范畴 进行单元测试的时机 单元测试任务 单元测试方法 单元测试过程
  • 3. 什么是单元测试单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件(或者场景)下某个特定函数的行为。例如,你可能把一个很大的值放入一个有序list 中去,然后确认该值出现在list 的尾部。或者,你可能会从字符串中删除匹配某种模式的字符,然后确认字符串确实不再包含这些字符了。 2018/10/183
  • 4. 什么是单元测试 单元测试是由程序员自己来完成,最终受益的也是程序员自己。可以这么说,程序员有责任编写功能代码,同时也就有责任为自己的代码编写单元测试。执行单元测试,就是为了证明这段代码的行为和我们期望的一致。 2018/10/184
  • 5. 为什么要使用单元测试 我们编写代码时,一定会反复调试保证它能够编译通过。如果是编译没有通过的代码,没有任何人会愿意交付给自己的老板。但代码通过编译,只是说明了它的语法正确;我们却无法保证它的语义也一定正确,没有任何人可以轻易承诺这段代码的行为一定是正确的。     幸运,单元测试会为我们的承诺做保证。编写单元测试就是用来验证这段代码的行为是否与我们期望的一致。有了单元测试,我们可以自信的交付自己的代码,而没有任何的后顾之忧。2018/10/185
  • 6. 单元测试的优点它是一种验证行为它是一种设计行为它是一种编写文档的行为它具有回归性2018/10/186
  • 7. 单元测试的优点它是一种验证行为。     程序中的每一项功能都是测试来验证它的正确性。它为以后的开发提供支缓。就算是开发后期,我们也可以轻松的增加功能或更改程序结构,而不用担心这个过程中会破坏重要的东西。而且它为代码的重构提供了保障。这样,我们就可以更自由的对程序进行改进。2018/10/187
  • 8. 单元测试的优点它是一种设计行为。     编写单元测试将使我们从调用者观察、思考。特别是先写测试(test-first),迫使我们把程序设计成易于调用和可测试的,即迫使我们解除软件中的耦合。2018/10/188
  • 9. 单元测试的优点它是一种编写文档的行为。     单元测试是一种无价的文档,它是展示函数或类如何使用的最佳文档。这份文档是可编译、可运行的,并且它保持最新,永远与代码同步。2018/10/189
  • 10. 单元测试的优点它具有回归性。     自动化的单元测试避免了代码出现回归,编写完成之后,可以随时随地的快速运行测试。 2018/10/1810
  • 11. 单元测试的范畴如果要给单元测试定义一个明确的范畴,指出哪些功能是属于单元测试,这似乎很难。但下面讨论的四个问题,基本上可以说明单元测试的范畴,单元测试所要做的工作。 它的行为和我期望的一致吗?     这是单元测试最根本的目的,我们就是用单元测试的代码来证明它所做的就是我们所期望的。 2018/10/1811
  • 12. 单元测试的范畴它的行为一直和我期望的一致吗?     编写单元测试,如果只测试代码的一条正确路径,让它正确走一遍,并不算是真正的完成。软件开发是一个项复杂的工程,在测试某段代码的行为是否和你的期望一致时,你需要确认:在任何情况下,这段代码是否都和你的期望一致;譬如参数很可疑、硬盘没有剩余空间、缓冲区溢出、网络掉线的时候。2018/10/1812
  • 13. 单元测试的范畴我可以依赖单元测试吗?     不能依赖的代码是没有多大用处的。既然单元测试是用来保证代码的正确性,那么单元测试也一定要值得依赖。2018/10/1813
  • 14. 单元测试的范畴单元测试说明我的意图了吗?     单元测试能够帮我们充分了解代码的用法,从效果上而言,单元测试就像是能执行的文档,说明了在你用各种条件调用代码时,你所能期望这段代码完成的功能。 2018/10/1814
  • 15. 单元测试方法单元测试的依据是详细设计,单元测试应对模块内所有重要的控制路径设计测试用例,以便发现模块内部的错误。单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。2018/10/1815
  • 16. 单元测试任务单元测试任务包括: 1 模块接口测试; 2 模块局部数据结构测试; 3 模块边界条件测试; 4 模块中所有独立执行通路测试; 5 模块的各条错误处理通路测试。 2018/10/1816
  • 17. 单元测试任务模块接口测试是单元测试的基础。只有在数据能正确流入、流出模块的前提下,其他测试才有意义。测试接口正确与否应该考虑下列因素:   1 输入的实际参数与形式参数的个数是否相同;   2 输入的实际参数与形式参数的属性是否匹配;   3 输入的实际参数与形式参数的量纲是否一致;   4 调用其他模块时所给实际参数的个数是否与被调模块的形参个数相同;    2018/10/1817
  • 18. 单元测试任务5 调用其他模块时所给实际参数的属性是否与被调模块的形参属性匹配; 6调用其他模块时所给实际参数的量纲是否与被调模块的形参量纲一致; 7 调用预定义函数时所用参数的个数、属性和次序是否正确; 8 是否存在与当前入口点无关的参数引用; 9 是否修改了只读型参数; 10 对全程变量的定义各模块是否一致; 11是否把某些约束作为参数传递。2018/10/1818
  • 19. 单元测试任务 检查局部数据结构是为了保证临时存储在模块内的数据在程序执行过程中完整、正确。局部数据结构往往是错误的根源,应仔细设计测试用例,力求发现下面几类错误:   1 不合适或不相容的类型说明;   2变量无初值;   3变量初始化或省缺值有错;   4不正确的变量名(拼错或不正确地截断);   5出现上溢、下溢和地址异常。   除了局部数据结构外,如果可能,单元测试时还应该查清全局数据(例如FORTRAN的公用区)对模块的影响。 2018/10/1819
  • 20. 单元测试任务 在模块中应对每一条独立执行路径进行测试,单元测试的基本任务是保证模块中每条语句至少执行一次。此时设计测试用例是为了发现因错误计算、不正确的比较和不适当的控制流造成的错误。此时基本路径测试和循环测试是最常用且最有效的测试技术。计算中常见的错误包括:   1 误解或用错了算符优先级;   2混合类型或优先级;   3因计算机表示的局限性,运算;   3变量初值错;   4精度不够;   5表达式符号错。    2018/10/1820
  • 21. 单元测试任务比较判断与控制流常常紧密相关,测试用例还应致力于发现下列错误:   1不同数据类型的对象之间进行比较;   2错误地使用逻辑运算符期望理论上相等而实际上不相等的两个量相等;   4比较运算或变量出错;   5循环终止条件或不可能出现;   6迭代发散时不能退出;   7错误地修改了循环变量。2018/10/1821
  • 22. 单元测试任务一个好的设计应能预见各种出错条件,并预设各种出错处理通路,出错处理通路同样需要认真测试,测试应着重检查下列问题:   1输出的出错信息难以理解;   2记录的错误与实际遇到的错误不相符;   3在程序自定义的出错处理段运行之前,系统已介入;   4异常处理不当;   5错误陈述中未能提供足够的定位出错信息。 2018/10/1822
  • 23. 单元测试任务边界条件测试是单元测试中最后,也是最重要的一项任务。众所周知,软件经常在边界上失效,采用边界值分析技术,针对边界值及其左、右设计测试用例,很有可能发现新的错误。2018/10/1823
  • 24. 单元测试策略桩模块(Stub):用以模拟被测模块工作过程中所调用的模块,他们一般只进行很少的数据处理,例如打印入口和返回; 驱动模块(Driver):用以模拟被测模块的上级模块,它接受测试数据,把相关的数据传送给被测模块,启动被测模块,并打印相应的结果; 2018/10/1824
  • 25. 单元测试策略 由顶向下的单元测试策略; - 先对最顶层的单元进行测试,把顶层所调用的单元做成桩模块,其次对第二层进行测试,使用上面已测试的单元做驱动模块,以此类推; 由底向上的单元测试策略; - 先对模块调用层次图上最底层的模块进行单元测试,为该模块建立驱动模块,其次对上一层做单元测试,下面测试过的模块做桩模块,以此类推; 孤立测试 - 不考虑每个模块与其他模块之间的关系,为每个模块设计桩模块和驱动模块; 2018/10/1825
  • 26. 单元测试策略 为正向测试设计用例; - 验证设计说明书所对应的功能项或性能指标能否兑现; 为逆向测试设计用例; - 验证被测的软件单元有没有做它不应该做的事情; 为满足特殊需求设计用例; 为代码覆盖设计用例; 为覆盖率指标完成设计用例; 2018/10/1826
  • 27. 单元测试用例设计主要采用的方法: 等价类划分; 边界值分析; 定义/使用测试; 路径测试; 2018/10/1827
  • 28. Thank You !感谢聆听