第一关
任务描述
本关任务:使用Junit对给定的计算器类(Calculator.java)进行单元测试。
相关知识
单元测试的定义
单元测试(Unit testing)是对最小的软件设计单元(模块或源程序单元)的验证工作。
在设计得好的软件系统中,每个模块完成一个清晰定义的子功能,而且这个子功能和同级其他模块的功能之间没有相互依赖关系。因此,有可能把每个模块作为一个单独的实体来测试,而且通常比较容易设计检验模块正确性的测试方案。
目的:保证每个模块作为一个单元能正确运行。
所发现的错误:往往是编码和详细设计的错误。
单元测试的测试重点
单元测试集中检测软件设计的最小单元——模块。
在单元测试期间着重从下述5个方面对模块进行测试。
1.模块接口
首先应该对通过模块接口的数据流进行测试,如果数据不能正确地进出,所有其他测试都是不切实际的。
在对模块接口进行测试时主要检查下述几个方面:参数的数目、次序、属性或单位系统与变元是否一致;是否修改了只作输入用的变元;全局变量的定义和用法在各个模块中是否一致。
2.局部数据结构
对于模块来说,局部数据结构是常见的错误来源。应该仔细设计测试方案,以便发现局部数据说明、初始化、默认值等方面的错误。
3.重要的执行通路
由于通常不可能进行穷尽测试,因此,在单元测试期间选择最有代表性、最可能发现错误的执行通路进行测试就是十分关键的。应该设计测试方案用来发现由于错误的计算、不正确的比较或不适当的控制流而造成的错误。
4.出错处理通路
好的设计应该能预见出现错误的条件,并且设置适当的处理错误的通路,以便在真的出现错误时执行相应的出错处理通路或干净地结束处理。不仅应该在程序中包含出错处理通路,而且应该认真测试这种通路。当评价出错处理通路时,应该着重测试下述一些可能发生的错误:
(1) 对错误的描述是难以理解的;
(2) 记下的错误与实际遇到的错误不同;
(3) 在对错误进行处理之前,错误条件已经引起系统干预;
(4) 对错误的处理不正确;
(5) 描述错误的信息不足以帮助确定造成错误的位置。
5. 边界条件
边界测试是单元测试中最后的也可能是最重要的任务。
软件常常在它的边界上失效。
例如,处理n元数组的第n个元素时,或做到i次循环中的第i次重复时,往往会发生错误。使用刚好小于、刚好等于和刚好大于最大值或最小值的数据结构、控制量和数据值的测试方案,非常可能发现软件中的错误。
单元测试的局限性
单元测试不能捕获程序中的每一个错误。根据定义,单元测试只测试单元自身的功能。
因此它不捕获集成错误、性能问题或其它任何系统范围的问题。
另外,要预料现实中被测程序可能接受到的输入的所有特殊情况是一项不易之事。
对于任何非平凡的软件块要测试所用的输入组合是不现实的。
Junit是什么
JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
几乎所有的IDE工具都集成了JUnit,这样我们就可以直接在IDE中编写并运行JUnit测试。
Junit好处及作用
好处:
1.可以书写一系列的测试方法,对项目所有的接口或者方法进行单元测试。
2.启动后,自动化测试,并判断执行结果, 不需要人为的干预。
3.只需要查看最后结果,就知道整个项目的方法接口是否通畅。
4.每个单元测试用例相对独立,由Junit 启动,自动调用。不需要添加额外的调用语句。
5.添加,删除,屏蔽测试方法,不影响其他的测试方法。 开源框架都对JUnit 有相应的支持。
作用:
通常我们写完代码想要测试这段代码的正确性,那么必须新建一个类,然后创建一个 main() 方法,之后再编写测试代码。如果需要测试的代码很多呢?那么要么就会建很多main() 方法来测试,要么将其全部写在一个main()方法里面。这也会大大的增加测试的复杂度,降低程序员的测试积极性。而 Junit 能很好的解决这个问题,使用Junit后,可以非常简单地组织测试代码,并随时运行它们,Junit就会给出成功的测试和失败的测试,还可以生成测试报告。
Junit使用规范
一是单元测试代码本身必须非常简单,能一下看明白,决不能再为测试代码编写测试;
二是每个单元测试应当互相独立,不依赖运行的顺序;
三是测试时不但要覆盖常用测试用例,还要特别注意测试边界条件,例如输入为0,null,空字符串""等情况。
Junit断言
使用JUnit进行单元测试,我们可以使用断言(Assertion)来测试期望结果,即使用断言方法判断期望值和实际值差异,返回Boolean值。这样一来,可以方便地组织和运行测试,并方便地查看测试结果。
Junit所有的