前言
这篇文章原创于2021年5月左右,近日转移至博客。
JUnit – 概述
什么是单元测试?
单元测试是一个对单一实体(类或方法)的测试。单元测试是每个软件公司提高产品质量、满足客户需求的重要环节。
单元测试可以由以下两种方式完成:
人工测试 | 自动测试 |
---|---|
手动执行测试用例并不借助任何工具的测试被称为人工测试。 | 借助工具支持并且利用自动工具执行用例被称为自动测试。 |
– 消耗时间并单调:由于测试用例是由人力资源执行,所以非常缓慢并乏味。- 人力资源上投资巨大:由于测试用例需要人工执行,所以在人工测试上需要更多的试验员。 – 可信度较低:人工测试可信度较低是可能由于人工错误导致测试运行时不够精确。 – 非程式化:编写复杂并可以获取隐藏的信息的测试的话,这样的程序无法编写。 | – 快速自动化运行测试用例时明显比人力资源快。- 人力资源投资较少:测试用例由自动工具执行,所以在自动测试中需要较少的试验员。 – 可信度更高:自动化测试每次运行时精确地执行相同的操作。 – 程式化:试验员可以编写复杂的测试来显示隐藏信息。 |
什么是一个单元测试用例?
单元测试用例是一段代码可以确保另一端代码(方法)按预期工作的代码。为了迅速达到预期的结果,就需要测试框架。JUnit 是 java 编程语言理想的单元测试框架。
一个正式的编写好的单元测试用例的特点是:已知输入和预期输出,即在测试执行前就已知。已知输入需要测试的先决条件,预期输出需要测试后置条件。
每一项需求至少需要两个单元测试用例:一个正检验,一个负检验。如果一个需求有子需求,每一个子需求必须至少有正检验和负检验两个测试用例。
什么是JUnit,为什么是JUnit?
JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
JUnit 促进了测试优先的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比测试一点,编码一点,测试一点,编码一点……,增加了程序员的产量和程序的稳定性,可以减少程序员的压力和花费在排错上的时间。
JUnit的特性
- JUnit 是一个开放的资源框架,用于编写和运行测试。
- 提供注释来识别测试方法。
- 提供断言来测试预期结果。
- 提供测试运行来运行测试。
- JUnit 测试允许你编写代码更快,并能提高质量。
- JUnit 优雅简洁。没那么复杂,花费时间较少。
- JUnit 测试可以自动运行并且检查自身结果并提供即时反馈。所以也没有必要人工梳理测试结果的报告。
- JUnit 测试可以被组织为测试套件,包含测试用例,甚至其他的测试套件。
- JUnit 在一个条中显示进度。如果运行良好则是绿色;如果运行失败,则变成红色。
基本用法
下面,我们通过一个简单的例子,了解JUnit进行单元测试的基本方法。
创建一个Yahoo类
// Path: /src/yahooes/Yahoo.javapackageyahooes;publicclassYahoo{intx,y;Stringname;publicYahoo(Stringname){this.name=name;}publicStringgetName(){returnthis.name;}}
创建一个Test Case类
// Path: /src/yahooes/YahooTest.javapackageyahooes;import staticorg.junit.jupiter.api.Assertions.*;importjava.util.jar.Attributes.Name;importorg.junit.jupiter.api.Test;classYahooTest{Stringname="Bob";Yahooyahoo1=newYahoo("Bob");Yahooyahoo2=newYahoo("Jack");@TestvoidtestName(){assertEquals(name,yahoo1.getName());assertNotEquals(name,yahoo2.getName());}}
此时点击运行,就可以测试Yahoo类了。
软件测试
下面,我们正式来学习JUnit编写测试的方法。但在之前,我们先回顾一下软件构造课程中关于测试的知识点。毕竟JUnit只是工具,对软件测试的全面了解才是关键。
了解软件测试
虽然决定软件质量的是软件的设计而非软件测试,但它仍然是提高软件质量的重要手段。
软件测试的难点
不过软件测试并没有那么简单, 即使是最好的测试也无法证明系统不存在错误。原因如下:
- 暴力穷举不可取
- 偶然测试没意义
- 找不到统计规律
软件测试的目标
测试跟其它活动的目标相反,它需要破坏性地验证代码的错误性,越多越好,越早越好。
测试用例
测试用例
一组 { 输入+ (执行条件) + 期望结果 } 的集合
什么是好的测试用例
一个好的测试用例有以下4点品质:
- 最可能发现错误
- 不重复、不冗余
- 最有效
- 既不简单也不复杂
测试优先编程
过程
- 写规约、写符合规约的测试用例、(再改规约、写测试用例…)直到完善规约
- 写代码、执行测试、改代码、测试…直到通过测试
单元测试
分级测试
- 单元测试 – 在类中间进行测试,每个模块写一个测试。
- 集成测试 – 将不同开发者的多个模块集中测试。
- 系统测试 – 对整个系统进行测试,通常在软件开发的后期阶段进行。
单元测试
针对软件的最小单元模型开展测试,隔离各个模块,容易定位错误和调试。
在测试优先编程中,单元测试往往会视为编码过程的一部分。
单元测试的组成
- Driver
类似于主程序,可以接受测试用例,传递数据给需要测试的模块,获取运行的结果并输出。
- Stubs
代表模块进行测试的部分,比如由一个类模块创建出的对象。
黑盒测试
黑盒测试用于检查程序是否符合规约,追求用尽可能少的测试用例,尽快运行,尽可能发现程序的错误。
通过等价类划分和边界设计测试用例
将被测函数的输入域分为等价类,从每个等价类中选出一个测试用例即可。
- 输入数据限定了数值范围:分割
- 输入数据指明了特定的值:是或不是
- 输入数据确定了一组数值:其中之一或者不在其中
- 输入数据是Y/N: Y/N
- 输入的特殊情况: -1 0 1
- 输入的上下限及边界
- 考虑边界:合法输入内,边界和略微向内。合法输入外,略超出边界。
- 二维输入空间:一维等价类的笛卡尔积,覆盖每个区域最少一次即可。
白盒测试
黑盒测试是测试人员写的,而白盒测试是开发人员写的。黑盒测试完全来自规约,不考虑内部实现,而白盒测试要考虑内部实现细节。
白盒测试一般较早执行,它只能测试已经实现的功能是否正确,但无法保证是否符合用户的需求。
为白盒测试设计测试用例的原则
- 任何执行路径都要走
- 任何逻辑判定都要走,比如A&&B就是FF,FT,TF,TT。
- 循环路径测试1次即可。
- 测试效果:路径覆盖>分支覆盖> 语句覆盖。(条件覆盖和分支覆盖没有联系)
- 测试难度:路径覆盖>分支覆盖>语句覆盖。
为测试策略写文档
测试策略(根据什么来选择测试用例)非常重要,需要在程序中显式记录下来。目的是在代码评审过程中,其他人可以理解你的测试,并评判你的测试是否足够充分。
文档化描述测试策略
- 如何划分输入的每个参数?
- (如果有)如何划分参数之间的关系?
- 为什么要这样划分?
- 每个测试用例标注它包括了哪个区域(笛卡尔积)。
END
声明:本文部分素材转载自互联网,如有侵权立即删除 。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别
丞旭猿论坛
暂无评论内容