单元测试工具Junit

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


} 出现错误,原因??
一个例子

测试为空


public void testEmpty(){ try{ rgest(new int[]{}); fail("抛出一个异常"); }catch(RuntimeException e){ assertTrue(true); } }
3.4 JUnit 的软件结构

TestSuite(测试集合)——一组测试。一个test suite 是把多个相关测试归入一组的便捷方式。

如果你没有为 TestCase 定义一个 test suite,那么 JUnit 就会自动提供一个 test suite,包含 TestCase 中所有的测 试。
JUnit的目标

JUnit 就是为 Java 程序开发者实现单元测试 提供一种框架,使得 Java 单元测试更规范有 效,并且更有利于测试的集成
框架的三个目标




第一个是简化测试的编写,这种简化包括测试框架 的学习和实际测试单元的编写; 第二个是使测试单元保持持久性; 第三个则是可以利用既有的测试来编写相关的测试。
3.2 JUnit的各种断言


assertTrue([String message],boolean condition): 验证条件二元条件是否返回真值
3.2 JUnit的各种断言

Fail([String message]) 上面的断言会使测试立即失败 用于标记某个不该到达的分支,如一个 预期发生的异常。
3.1 构建单元测试

测试代码的准备工作



准备测试所需要的各种条件:创建对象、分 配资源 选择要测试的方法,设计测试用例。 验证被测试方法的行为与期望是否一致 完成后清理资源
3.2 JUnit的断言



JUnit给定的函数,帮助确定被测试函数 是否工作正常,这些函数统称为断言。 它是单元测试的最基本组成部分 每个函数都会记录失败或者错误,并通 过JUnit的类来包裹错误。 在控制台上将通过红色条及辅助信息来 说明。
3.4 JUnit 的软件结构

JUnit 共有七个包 核心的包就是junit.framework和 junit.runner

framework负责整个测试对象的构架 runner负责测试驱动。

TestCase、TestSuite 和 BaseTestRunner 是 JUnit 框架的骨干。一旦理解了这 3 个类 的工作方式,就可以随心所欲地编写测试了。
一个例子
完善独立静态方法largest, package TestOne; public class Largest { public static int largest(int[] list){ int index,max=Integer.MAX_VALUE; for (index=0;index<list.length-1;index++){ if (list[index]>max){ max=list[index]; }//end if }//end for return max; }//end function largest }
3.2 JUnit的各种断言

assertNull([String message],Object)) assertNotNull([String message],Object))

验证一个给定的对象是否为空或非空
3.2 JUnit的各种断言


assertSame ([String message],Object expected,Object actual): 两个对象是否引用同一对象

}
3.2 JUnit的各种断言




断言一旦失败,测试方法就停止,那么 该方法其他的断言就无法执行 只能修复好失败的测试,一步一步的前 进。 只有当所有的测试都通过了,你才能够 增加新的特性 那么如何运行一组测试呢?
3.3 JUnit框架

如何运行测试呢? 需要一个框架
测试框架
import junit.framework.*; public class TestSimplet extends TestCase { public TestSimple (String name) { super(name); } public void testAdd() { assertEquals(2, 1+1); assertEquals(-1, -3+2); } } 每一个测试都
一个例子

测试出现错误

修改 独立静态方法,查找list中的最大值
一个例子:
package TestOne; public class Largest { public static int largest(int[E; 0 for (index=0;index<list.length-1;index++){ if (list[index]>max){ max=list[index]; }//end if }//end for return max; }//end function largest
测试与异常


虽然你可以自己捕捉部分异常,但建议 有些出乎意料异常还是让JUnit来完成 可以写出

public void testData() throws FileNoFoundExcepiton e{

FileInputStream f=new fileInputStream(“data.txt”);
package TestOne; import junit.framework.*;
public class TestLargest extends TestCase{ public TestLargest(String name){ super(name); } public void testSimple(){ assertEquals(9,rgest(new int[]{7,8,9})); } }

TestRunner(测试运行器)——执行 test suite 的程 序。
单元测试工具Junit
本章目标

单元测试的目的 掌握如何利用Junit编写简单测试 了解Junit的基本框架
引入

测试驱动开发(”(Test-Driven Development, 简称TDD) 是极限编程(Extreme programming 简称XP)的重要特点



以持续性的测试来推动代码的开发,即可以简化代 码,又可以保证质量。它改变了先编写代码,后编 写测试,而是先编写测试,然后在编写代码来满足 测试的方法。 这样使得测试工作不仅仅是单纯的测试,而成为了 设计的一部分。当你习惯了这种编程方式之后,你 会发现,TDD会成为你的得力助手。 Junit可以成为一个TDD或单元测试很好的工具
if (list.length==0){ throw new RuntimeException("Empty list"); }

修改考虑数组为空的情况抛出异常

Lesson Learned

Code a little, test a little
三 使用JUnit进行单元测试

3.4 JUnit 的软件结构



TestCase (测试用例)——扩展了JUnit 的 TestCase 类的类。 它以 testXxx 方法的形式包含一个或多个测 试。一个 test case 把具有公共行为的测试归 入一组。 当提到测试的时候,指的是一个 testXxx方法; 当提及 test case 的时候,指的是一个继承自 Testcase 的类,也就是一组测试。

数组只有一个数

public void testOne(){


}
assertEquals(9,rgest(new int[]{9}));
一个例子

数组中有负数

public void testNegative(){

assertEquals(-3,rgest(new int[]{-6,-5,-3}));
}
一个例子

【思考】用哪些数组来进行测试 考虑:

最大数的位置变化:最左、中间、最右 数组只有一个数 数组中有负数、相同的数 测试为空
一个例子

最大数的位置变化:最左、中间、最右

Public void testOrder(){


} 出现错误,原因??
assertEquals(9,rgest(new int[]{7,8,9})); assertEquals(9,rgest(new int[]{7,9,8})); assertEquals(9,rgest(new int[]{9,7,8}));
JUnit和异常

两种需要关注的异常

从测试代码抛出的可预测异常 由于模块发生严重错误而抛出不可预测异常

例如 测试实例中数值为空的情况
public void testEmpty(){ try{ rgest(new int[]{}); fail("抛出一个异常"); }catch(RuntimeException e){ assertTrue(true); } }
是一个方法 判断是否相等
导入所需的 JUnit类
创建 TestCase类 的子类
创建以String为参 数的构造函数,调 用super方法
实例一
junit
TestCase
Foo
1..*
exercise
FooTest
test1 test2 …
测试相关规则





按照框架规定:编写的所有测试类,必须继承自 junit.framework.TestCase类; 里面的测试方法,命名应该以 Test 开头,必须是 public void 而且不能有参数; 为了测试查错方便,尽量一个 TestXXX 方法对一个 功能单一的方法进行测试; 使用 assertEquals等 junit.framework.TestCase 中的断言方法来判断测试结果正确与否。 在这个测试类中有加入多少个测试方法,就会运行多 少个测试方法。
JUnit 的断言




assertEquals(Object expected,Object actual):两个对象是否相同 assertEquals(int expected,int actual): 原始类型是否相同。 assertNull:指针是否为空 assertSame assertEquals(Object expected,Object actual): 两个对象的结 构是否相同 assertTrue(boolean condition):是否返 回真值

构建单元测试 JUnit的各种断言 Junit的框架 Junit软件结构 自定义JUnit断言 JUnit和异常
3.1 构建单元测试

命名习惯


如果有一个需要测试的createAccount方 法,则相应的测试方法应取名为 testCreateAccount 当然还有很多其他相关的测试方法,也必须 取名为testXxx
一个例子
一个例子: 独立静态方法,查找list中的最大值 package TestOne; public class Largest { public static int largest(int[] list){
} assertTrue(a==2); assertEquals(a,b);
一个例子
3.2 JUnit的各种断言
assertEquals([String message], expected, actual,[tolerance]) 比较两个对象是否相等




expected是期望值,actual是被测试代码实际产 生的值 特殊:数字组(引用本身),浮点数需要格外的误 差参数 assertEquals(“shoule be 3 1/3”, 3.33, 10.0/3.0, 0.01)
相关文档
最新文档