【HIT】哈工大2021春软件构造复习(2)

Chapter 2: Process and Tools of Software Construction

软件测试与测试优先的编程

学会用等价划分和边界值分析方法为模块设计测试用例,用工具度量一组测试用例对代码的“覆盖度”,了解下列测试手段:

在这里插入图片描述

2.1 Software Testing

测试是提升软件质量的重要手段,可以确定软件是否达到可用级别(用户需求)。但是无法达到100%无错误。好的测试:能发现错误、不冗余、最佳特性、复杂度适中。

测试级别可以分为:单元测试、集成测试、系统测试以及回归测试。

Static vs. Dynamic testing

静态测试:肉眼检查。

动态测试:用测试用例进行实际测试。

Testing vs. Debugging

测试:发现是否错误。

调试:识别错误根源,消除错误。

White-box vs. black-box testing

白盒测试:对程序内部代码结构的测试。

黑盒测试:对程序外部表现出来的行为的测试。

在这里插入图片描述

软件测试的困难性:软件行为在离散输入空间中差异巨大,bug出现往往不符合特定概率分布,也没有统计分布规律可循。

tips:Pentium FDIV bug(奔腾浮点除错误),Ariane 5 launch vehicle

2.2 Test Case

测试用例是什么? 测试用例:输入+执行条件+期望结果

好的测试用例:最可能发现错误,不重复不冗余,最有效,既不简单也不复杂。

2.3 Test-First Programming

测试优先的编程(Test-First Programming):

先写spec,也就是specification,再写符合spec的测试用例,最后写代码、执行测试、有问题再改、再执行测试用例,直到通过它。

注:关于specification的详细介绍将在第三章中展现。

先写测试会节省大量调试时间。

测试驱动开发(Test-driven development TDD)

TDD的开发模式流程是:编写测试用例 ->运行测试用例 –>编写项目代码 ->运行测试用例 ->重构代码

在这里插入图片描述

2.4 Unit Testing

单元测试(Unit Testing):

针对软件的最小单元模型开展测试,隔离各个模块,这样容易定位错误和调试。

2.5 Automated Unit Testing with JUnit

JUnit是xUnit的一个子集,是Java语言的单元测试框架。在使用时要在方法前加上@Test的注释字样。一个单元测试方法通常包含多个测试模块,并且会运用assertion方法(比如 assertEquals, assertTrue, assertFalse)来检查结果。

例如:
在这里插入图片描述
在程序运行中创建新的JUnit测试:
在这里插入图片描述
在这里插入图片描述

2.6 Black-box Testing

黑盒测试(Black-box testing):用于检查代码的功能,不关心内部实现细节。

黑盒测试所用测试用例是检测程序是否符合规约。也就是用尽可能少的测试用例,尽快运行,并尽可能大的发现程序的错误。

1. 分区选择测试用例

等价类划分(Equivalence Partitioning):基于等价类划分的测试就是将被测函数的输入域针对每个输入数据需要满足的约束条件划分为等价类,再从等价类中导出测试用例。每个等价类代表着对输入约束加以满足/违反的有效 /无效数据的集合。

分为几种情况:输入数据限定了数值范围、 输入数据指明了特定的值、

输入数据确定了一组数值、输入数据是Y/N…
在这里插入图片描述
选择测试用例覆盖所有等价类。

2. 含边界分区(Include Boundaries in the Partition)

边界值分析(Boundary Value Analysis BVA):大量的错误发生在输入域的“边界 ”而非中央,边界值分析方法是对等价类划分方法的补充。在等价类划分时,将边界作为等价类之一加入考虑。

例如:测试max()
在这里插入图片描述
在这里插入图片描述
每个维度的每个取值至少被1个测试用例覆盖一 次即可。测试完备,但用例数量多,测试代价高;测试用例少,代价低,但测试覆盖度未必高,二者需要折中。

2.7 White-box Testing

Black-box vs. White-box testing: 黑盒测试完 全从函数spec导出测试用例,不考虑函数内部实现,而白盒测试要考虑内部实现细节,根据程序执行路径设计测试用例。白盒测试一般较早执行。

白盒测试方法

独立/基本路径测试:对程序所有执行路径进行等价类划 分,找出有代表性的最简单的路径(例如循环只需执行1次),设计测试用例使每一条基本路径被至少覆盖1次。

2.8 Coverage of Testing

代码覆盖度(Code coverage):已有的测试用例有多大程度覆盖了被测程序。

种类:函数覆盖、语句覆盖、分支覆盖、 条件覆盖、路径覆盖等。

测试效果:路径覆盖>分支覆盖>语句覆盖

测试难度:路径覆盖>分支覆 盖>语句覆盖

路径覆盖最完全彻底,但是路径数量多难度大。

EclEmma

EclEmma是Eclipse的一个检查代码覆盖率、查看代码调用情况的软件测试工具。

被覆盖的代码行会变绿,没有的变红。
在这里插入图片描述

2.9 Automated Testing and Regression Testing

自动测试(Automated testing):自动调用被测函数、自动判定测试结果、自动 计算覆盖度。例如JUnit

Automated testing vs. Automatic test generation

Automated testing只是“测试用例的自动执行”,并非“自动生成测试用例”。自动生成测试用例仍是一个难题。

回归测试(Regression testing )

回归测试:一旦程序被修改,重 新执行之前的所有测试。

自动化回归测试(Automated regression testing):一旦发现bug,要马上写一个可重现该bug的测试用例,并将其加入测试库。

tips:Travis-CI

2.10 Documenting Your Testing Strategy

记录测试策略(Documenting Testing Strategy):需要在程序中显式记录,让其他人可以理解并评判。

Summary

测试优先的编程:在写程序前先写测试用例;

写测试用例时注意分区和边界;

测试时白盒测试、语句覆盖一起进行;

每个模块都要进行模块测试,尽可能独立进行;

自动化回归测试减少bug;

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值