哈工大软件构造课程博客(一) 测试相关总结与扩展
本篇博客内容
本篇为2022春季学期软件构造相关课程的总结与扩展,本篇博客涵盖了课上所讲授的什么是软件的测试、软件测试的种类与扩展、JUnit单元测试工具基础语法扩展、以及黑盒测试和等价划分相关知识点
什么是软件的测试
- 软件测试是提高软件质量的重要(quality)手段,不是唯一手段,不是绝对性手段
- 确认是否达到可用级别(用户需求)
- 关注系统的某一侧面的质量特性
- 即使是最好的测试,也无法达到100%无错误
- 测试的特点
- 测试跟其他活动的目标相反:破坏、证错、“负能量”
- 再好的测试也无法证明系统里不存在错误
- 什么是好的测试
- 能发现错误
- 不冗余
- 最佳特性
- 别太复杂也别太简单
软件测试种类
- 单元测试
- 集成测试
- 扩展:集成测试的策略
- 大爆炸法
- Big Bang Testing是一种集成测试方法,其中所有组件或模块都立即集成在一起,然后作为一个单元进行测试。测试时,这组组合的组件被视为一个实体。如果单元中的所有组件均未完成,则集成过程将不会执行。
- 优点
- 适用于小型系统
- 缺点
- 故障定位很困难
- 考虑到在这种方法中需要测试的接口数量众多,很容易会漏掉一些要测试的接口链接。由于集成测试只能在设计完“所有”模块之后才能开始,因此测试团队在测试阶段的执行时间将减少
- 由于所有模块都经过一次测试,因此高风险关键模块不会被隔离并优先进行测试。处理用户界面的外围模块也不是隔离的,并且不会进行优先级测试。
- 增量方法
- 自上而下的方法
- 自下而上的集成测试是一种策略,其中首先测试较低级别的模块。然后,这些经过测试的模块将进一步用于促进更高级别模块的测试。该过程将继续进行,直到测试了所有顶层模块为止。一旦较低级别的模块经过测试和集成,便形成了下一个级别的模块
- 优点
- 故障定位更容易
- 不像Big-bang方法那样浪费时间等待所有模块的开发
- 缺点
- 控制应用程序流程的关键模块(在软件体系结构的最高级别)最后经过测试,并且可能容易出现缺陷
- 早期的原型是不可能的
- 自下而上的方法
- 自上而下的集成测试是一种按照软件系统的控制流程从上到下进行集成测试的方法。首先测试较高级别的模块,然后再测试和集成较低级别的模块,以检查软件功能。插桩用于测试某些模块是否尚未就绪
- 优点
- 故障定位更容易
- 有可能获得早期的原型
- 关键模块按优先级进行测试;可以发现并修复主要的设计缺陷
- 缺点
- 需要许多插桩
- 较低级别模块未充分测试
- 三明治方法-自上而下和自下而上的组合
- 三明治测试是一种策略,其中顶层模块与底层模块同时进行测试,同时底层模块与顶层模块集成在一起并作为系统进行测试。它是自顶向下和自底向上方法的组合,因此被称为混合集成测试。它同时使用了插桩和驱动程序
- 系统测试(在用户端进行测试)
- 概念:系统测试包括测试完全集成的软件系统。通常,计算机系统是通过软件集成制成的。换句话说,一组软件的计算机系统执行各种任务,但只有软件才能执行任务; 软件必须与兼容的硬件接口。系统测试是一系列不同类型的有目的的测试行使和审查针对需求的集成软件的计算机系统的全部工作,是黑盒测试的一种
- 系统测试验证什么
- 系统测试包括外部外围设备在内的完全集成的应用程序,以检查组件之间以及整个系统之间如何交互。这也称为端到端测试方案
- 验证对应用程序中每个输入的全面测试,以检查所需的输出
- 测试用户对应用程序的体验。
- 系统测试的一般类型
- 可用性测试:主要关注用户对应用程序的易用性,处理控件的灵活性以及系统满足其目标的能力负载测试-了解软件解决方案将在实际负载下运行的必要条件
- 恢复测试:已完成以证明软件解决方案可靠,可信赖并且可以成功地从可能的崩溃中恢复来进行
- 迁移测试:以确保可以将软件从较早的系统基础结构迁移到当前的系统基础结构,而不会出现任何问题
- 功能测试:也称为功能完整性测试,功能测试包括尝试考虑任何可能缺少的功能。测试人员可能会列出产品在功能测试期间可能需要改进的其他功能的列表。
- 硬件/软件测试:IBM将硬件/软件测试称为“硬件/软件测试”。这是测试人员在系统测试期间将注意力集中在硬件和软件之间的交互上的时候
- 验收测试
- 回归测试(一定要通过自动化的手段完成)
- 目的是进行测试以确保在开发过程中所做的任何更改都不会引起新的错误,由于每次修复手动测试工作量大,所以要借助自动化工具进行测试
- 从另一个角度来看,代码测试还可分为静态测试(不运行代码进行测试,出错位置和程序所在位置不一定在同一个位置)和动态测试;黑盒测试和白盒测试:对程序内部代码结构的测试、黑盒测试:对程序外部表现出来的行为测试
- 为什么测试难度高/测试的正确心态
- 做不到完备性的测试(穷举+暴力=不可能)
- 靠偶然测试没意义
- 基于样本的统计数据对软件测试的意义不大-软件与产品的巨大差异
- 软件行为在离散输入空间中差距巨大
- bug出现往往不符合概率分布
- 无统计规律可循
- 测试要让程序尽快的出错,学会对自己的代码暴力些
- 测试样例
- 测试用例:输出+执行条件+期望结果
JUnit单元测试工具基础语法
- JUnit单元测试的第三方库
- Junit使用说明
- 写在test目录下
- 测试的包名和被测试的包名相同
- 测试的方法名以test开头
- 测试方法上必须使用@Test进行修饰
- 测试方法必须使用public void进行修饰,不能带任何的参数
- 测试单元中的每个方法必须可以独立测试、测试方法间不能有任何的依赖
- 测试类使用Test作为类名的后缀
- 对被测试类右键创建新的Junitclass 可提高效率
- Junit运行结果
- Runs:经单元测试的方法
- Failures:一般由单元测试使用的断言方法判断失败引起的,表示测试点发现了问题,程序输出的结果和预期的不一样
- Errors:是由代码异常引起的,可能产生于测试代码本身的错误,也可以是被测试代码中的一个隐藏的bug
- Junit的运行流程
- 1、先执行@BeforeClass修饰的测试方法
- 2、再执行@Before修饰的方法
- 3、再执行@Test修饰的方法
- 4、再执行@After修饰的方法
- 5、再执行@AfterClass执行的方法。
- Junit的常用注解:
- @Test:将一个普通的方法修饰成为一个测试方法
- 可以在类上右键-Run With(Debugs With)-JUnit Test对这个类内所有标注@Test的方法进行单元测试
- 也可以在@Test标注的方法上右键-Run With(Debugs With)-JUnit Test ,此时只会对当前方法进行单元测试
- @Test(expected=XXX.class):期望异常测试
- 例如:@Test(expected=ArithmeticException.class)
如果测试该方法时产生一个ArithmeticException的异常,则表示测试通过,否则测试不通过,没有达到预期值。
- 例如:@Test(expected=ArithmeticException.class)
- @Test(timeout=毫秒):设置超时时间
- 若在设置的时间内方法没有执行完则测试失败
- @BeforeClass:它会在所有的方法运行前被执行,static修饰
- @AfterClass:它会在所有的方法运行结束后被执行,static修饰
- @Before:它会在每一个测试方法运行前被执行一次
- @After:它会在每一个测试方法运行结束后被执行一次
- @Ignore:所修饰的测试方法会被测试运行器所忽略
- 在类上执行Junit测试时,标注@Ignore的方法将不再执行
- @RunWith:可以更改测试运行器
- JUnit所有的测试方法都是由测试运行器负责执行,默认的测试运行器:BlockJUnit4ClassRunner
- 例如:@RunWith(Suite.class) 其作用是使用JUnit执行一个测试套件。
- @RunWith(SpringJUnit4ClassRunner.class):让测试运行于Spring测试环境
- @RunWith(Parameterized.class)参数化测试:对多组数据同时测试
- @Parameters:生成静态参数用于参数化测试
- @Test:将一个普通的方法修饰成为一个测试方法
- Junit4常用的断言函数:
- AssertEquals:断言两个结果相等
- AssertArrayEquals:断言两个数组相等
- AssertNotEquals:断言两个结果不相等
- AssertSame:判断两个对象是否为同一个,不同于equals这里是使用“==”判断
- AssertTrue:断言结果为真
- AssertFalse:断言结果为假
- AssertNull:断言结果为空
- AssertNotNull:断言结果不为空
- AssertThat:使用Matcher做自定义的校验
- Junit使用说明
黑盒测试
- 用于检查代码的功能,不关心内部实现细节(针对程序功能的测试)
- 黑盒测试能发现哪些错误
- 缺失的功能和函数
- 接口错误
- 数据类型错误
- 行为错误
- 初始化和终止错误
- 主要检查程序是否符合规约
- 用尽可能少的用例,尽快运行,尽可能大的发现程序的错误
等价划分
- 将被测函数的输入域划分成为等价类,从等价类中导出测试用例
- 例:乘法计算 BigInteger × BigInteger -> BigInteger 函数,可从正/负角度进行等价类划分,同时考虑边界条件—— 0,1,-1,很小的正整数,很小的负整数,很大的正整数,很大的负整数
- BVA(Boundary Value Analysis)边界值分析:是对等价类划分方法的补充,在等价类划分时,将边界作为等价类之一加入考虑