收藏 分享(赏)

JUnit介绍.doc

上传人:hskm5268 文档编号:7057038 上传时间:2019-05-04 格式:DOC 页数:32 大小:189KB
下载 相关 举报
JUnit介绍.doc_第1页
第1页 / 共32页
JUnit介绍.doc_第2页
第2页 / 共32页
JUnit介绍.doc_第3页
第3页 / 共32页
JUnit介绍.doc_第4页
第4页 / 共32页
JUnit介绍.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

1、8.1 JUnit 介绍JUnit 是一个开源的 Java 单元测试框架,由 Erich Gamma 和 Kent Beck 开发完成。8.1.1 JUnit 简介JUnit 主要用来帮助开发人员进行 Java 的单元测试,其设计非常小巧,但功能却非常强大。下面是 JUnit 一些特性的总结: 提供的 API 可以让开发人员写出测试结果明确的可重用单元测试用例。 提供了多种方式来显示测试结果,而且可以扩展。 提供了单元测试批量运行的功能,而且可以和 Ant 很容易地整合。 对不同性质的被测对象,如 Class,JSP,Servlet 等,JUnit 有不同的测试方法。8.1.2 为什么要使用

2、JUnit以前,开发人员写一个方法,如下代码所示:/* AddAndSub.java*public Class AddAndSub public static int add(int m, int n) int num = m + n;return num;public static int sub(int m, int n) int num = m - n;return num;如果要对 AddAndSub 类的 add 和 sub 方法进行测试,通常要在 main 里编写相应的测试方法,如下代码所示:/* MathComputer.java*public Class AddAndSub p

3、ublic static int add(int m, int n) int num = m + n;return num;public static int sub(int m, int n) int num = m - n;return num;public static void main(String args) if (add (4, 6) = 10) System.out.println(“Test Ok”); else System.out.println(“Test Fail”);if (sub (6, 4) =2) System.out.println(“Test Ok”);

4、 else System.out.println(“Test Fail”);从上面的测试可以看出,业务代码和测试代码放在一起,对于复杂的业务逻辑,一方面代码量会非常庞大,另一方面测试代码会显得比较凌乱,而 JUnit 就能改变这样的状况,它提供了更好的方法来进行单元测试。使用 JUnit 来测试前面代码的示例如下:/* TestAddAndSub.java*import junit.framework.TestCase;public Class TestAddAndSub extends TestCase public void testadd() /断言计算结果与 10 是否相等assert

5、Equals(10, AddAndSub.add(4, 6);public void testsub() /断言计算结果与 2 是否相等assertEquals(2, AddAndSub.sub(6, 4);public static void main(String args) junit.textui.TestRunner.run(TestAddAndSub .class); 这里先不对 JUnit 的使用方法进行讲解,从上可以看到,测试代码和业务代码分离开,使得代码比较清晰,如果将 JUnit 放在 Eclipse 中,测试起来将会更加方便。8.2 建立 JUnit 的开发环境为了不使读

6、者在环节配置上浪费太多时间,这里将一步一步地讲解如何下载和配置 JUnit。具体步骤如下:8.2.1 下载 JUnit从 www.junit.org 可以进入到 JUnit 的首页,JUnit 的首页画面如图 8.1 所示。本书使用的版本是 4.3 版本,单击“Junit4.3.zip”即可进入下载 JUnit的画面,如图 8.2 所示。下载 Junit4.3.zip,下载后解压缩即可。8.2.2 配置 JUnit下载 Junit4.3.zip 完毕,并解压缩到 D 盘根目录下后,即可开始配置环境变量。用前面介绍的设定系统变量的方法,设定ClassPath,ClassPath=*;D:juni

7、tjunit.jar,如图 8.3 所示。图 8.1 JUnit 的首页画面图 8.2 下载 JUnit 的画面查看是否配置好 JUnit,在类里添加如下语句:import junit.framework.TestCase;图 8.3 设定系统变量 ClassPath如果编译没有错误,则说明配置成功。8.3 JUnit 的使用方法JUnit 的使用非常简单,共有 3 步:第一步、编写测试类,使其继承TestCase;第二步、编写测试方法,使用 test+的方式来命名测试方法;第三步、编写断言。如果测试方法有公用的变量等需要初始化和销毁,则可以使用 setUp,tearDown 方法。8.3.1

8、 继承 TestCase如果要使用 JUnit,则测试类都必须继承 TestCase。当然目前的最新版JUnit 是不需要继承它的,但并不是说 TestCase 类就没有用了,它仍然是JUnit 工作的基础。这里先讲述继承 TestCase 类的方式,稍后再介绍不继承的方式。下面是前面使用 JUnit 进行测试 AddAndSub 类的代码,这里进行详细的分析:/* TestAddAndSub.java*import junit.framework.TestCase;public Class TestAddAndSub extends TestCase public void testadd(

9、) /断言计算结果与 10 是否相等assertEquals(10, AddAndSub.add(4, 6);public void testsub() /断言计算结果与 2 是否相等assertEquals(2, AddAndSub.sub(6, 4);public static void main(String args) junit.textui.TestRunner.run(TestAddAndSub .class); 代码说明: 这里继承 TestCase,表示该类是一个测试类。 然后使用 junit.textui.TestRunner.run 方法来执行这个测试类。这里给出 Tes

10、tCase 的源代码:/* TestCase.java*package junit.framework;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.lang.reflect.Modifier;public abstract class TestCase extends Assert implements Test /*测试案例的名称*/private String fName;/*构造函数*/public TestCase() fName= null

11、;/*带参数的构造函数*/public TestCase(String name) fName= name;/*获取被 run 执行的测试案例的数量*/public int countTestCases() return 1;/*创建一个 TestResult* see TestResult*/protected TestResult createResult() return new TestResult();/*执行 run 方法,返回 TestResult* see TestResult*/public TestResult run() TestResult result= create

12、Result();run(result);return result;/*执行 run 方法,参数为 TestResult*/public void run(TestResult result) result.run(this);/*执行测试方法,包括初始化和销毁方法* throws Throwable if any exception is thrown*/public void runBare() throws Throwable Throwable exception= null;setUp();try runTest(); catch (Throwable running) excep

13、tion= running;finally try tearDown(); catch (Throwable tearingDown) if (exception = null) exception= tearingDown;if (exception != null) throw exception;/*执行测试方法* throws Throwable if any exception is thrown*/protected void runTest() throws Throwable assertNotNull(“TestCase.fName cannot be null“, fNam

14、e); / Some VMs crash when calling getMethod(null,null);Method runMethod= null;try /利用反射机制runMethod= getClass().getMethod(fName, (Class)null); catch (NoSuchMethodException e) fail(“Method “+fName+“ not found“);if (!Modifier.isPublic(runMethod.getModifiers() fail(“Method “+fName+“ should be public“);/

15、利用反射机制try runMethod.invoke(this);catch (InvocationTargetException e) e.fillInStackTrace();throw e.getTargetException();catch (IllegalAccessException e) e.fillInStackTrace();throw e;/*测试前的初始化方法*/protected void setUp() throws Exception /*测试后的销毁方法*/protected void tearDown() throws Exception /*返回测试案例的名称

16、* return the name of the TestCase*/public String getName() return fName;/*设定测试案例的名称* param name the name to set*/public void setName(String name) fName= name;代码说明: 该类继承了 Assert 类,实现了 Test 接口。 可以看出,TestCase 类正是通过 runBare 实现了在测试方法前初始化相关变量和环境,在测试方法后销毁相关变量和环境。8.3.2 编写测试方法测试方法名要以 test+方法名来命名,当然最新版的 JUnit

17、 支持直接以方法名来命名测试方法。这是通过 TestCase 类里的 runTest 方法来实现的,主要利用了 Java 的反射机制,runTest 方法的代码如下:protected void runTest() throws Throwable assertNotNull(“TestCase.fName cannot be null“, fName); / Some VMs crash when calling getMethod(null,null);Method runMethod= null;try / 获取要测试的方法runMethod= getClass().getMethod(

18、fName, (Class)null); catch (NoSuchMethodException e) fail(“Method “+fName+“ not found“);/判断要测试的方法是否为公用方法if (!Modifier.isPublic(runMethod.getModifiers() fail(“Method “+fName+“ should be public“);/Java 的反射机制try runMethod.invoke(this);/抛出调用异常catch (InvocationTargetException e) e.fillInStackTrace();thro

19、w e.getTargetException();catch (IllegalAccessException e) e.fillInStackTrace();throw e;8.3.3 编写断言JUnit 主要有以下断言: assertEquals(期望值,实际值),检查两个值是否相等。 assertEquals(期望对象,实际对象),检查两个对象是否相等,利用对象的 equals()方法进行判断。 assertSame(期望对象,实际对象),检查具有相同内存地址的两个对象是否相等,利用内存地址进行判断,注意和上面 assertEquals 方法的区别。 assertNotSame(期望对象,

20、实际对象),检查两个对象是否不相等。 assertNull(对象 1,对象 2),检查一个对象是否为空。 assertNotNull(对象 1,对象 2),检查一个对象是否不为空。 assertTrue(布尔条件) ,检查布尔条件是否为真。 assertFalse(布尔条件),检查布尔条件是否为假。这些断言主要定义在 JUnit 的 Assert 类里,Assert 类的示例代码如下:/* Assert.java*package junit.framework;/*一系列的断言方法*/public class Assert /*构造函数*/protected Assert() /*断言是否为真

21、,带消息*/static public void assertTrue(String message, boolean condition) if (!condition)fail(message);/*断言是否为真*/static public void assertTrue(boolean condition) assertTrue(null, condition);/*断言是否为假,带消息*/static public void assertFalse(String message, boolean condition) assertTrue(message, !condition);/

22、*断言是否为假*/static public void assertFalse(boolean condition) assertFalse(null, condition);/*断言是否为失败*/static public void fail(String message) throw new AssertionFailedError(message);/*断言是否为失败*/static public void fail() fail(null);/*是否相等的断言,带消息 Object*/static public void assertEquals(String message, Obj

23、ect expected, Object actual) if (expected = null if (expected != null failNotEquals(message, expected, actual);/*是否相等的断言,Object*/static public void assertEquals(Object expected, Object actual) assertEquals(null, expected, actual);/*是否相等的断言,带消息 String*/static public void assertEquals(String message,

24、String expected, String actual) if (expected = null if (expected != null throw new ComparisonFailure(message, expected, actual);/*是否相等的断言,String*/static public void assertEquals(String expected, String actual) assertEquals(null, expected, actual);/*是否相等的断言,带消息 double*/static public void assertEquals

25、(String message, double expected, double actual, double delta) if (Dpare(expected, actual) = 0)return;if (!(Math.abs(expected-actual) was not:“);/*不相等时失败*/static public void failNotEquals(String message, Object expected, Object actual) fail(format(message, expected, actual);/*格式化消息*/public static St

26、ring format(String message, Object expected, Object actual) String formatted= “;if (message != null)formatted= message+“ “;return formatted+“expected: but was:“;从上述代码中,读者可以研读 JUnit 中有关断言的实现方式,其实,最终都是使用后面的几个 static方法来实现的。8.4 JUnit 的新特性Java 5 的发布为 JUnit 带来了新的特性。自 JUnit 4.0 之后,JUnit 大量使用了 annotations 特

27、性,使编写单元测试变得更加简单。8.4.1 改变测试方法的命名方式前面讲过,使用 JUnit 4.0 以上版本可以不用遵循以前 JUnit 约定的测试方法命名方法,以前命名方法的示例代码如下:/* TestAddAndSub.java*import junit.framework.TestCase;public class TestAddAndSub extends TestCase public void testadd() /断言计算结果与 10 是否相等assertEquals(10, AddAndSub.add(4, 6);public void testsub() /断言计算结果与

28、2 是否相等assertEquals(2, AddAndSub.sub(6, 4);public static void main(String args) junit.textui.TestRunner.run(TestAddAndSub .class); JUnit 4.0 以上版本的命名方式,是在测试方法前使用Test 注释,示例代码如下:/* TestAddAndSub.java*import junit.framework.TestCase;import org.junit.*;public class TestAddAndSub extends TestCase Test publ

29、ic void add() /断言计算结果与 10 是否相等assertEquals(10, AddAndSub.add(4, 6);Test public void sub() /断言计算结果与 2 是否相等assertEquals(2, AddAndSub.sub(6, 4);这个时候,测试方法的命名将不再重要,开发人员可以按照自己的命名方式来命名。8.4.2 不再继承 TestCase新版本的 JUnit 将不再强制继承 TestCase,但需要 import org.junit.Assert 来实现断言,示例代码如下:/* TestAddAndSub.java*import stati

30、c org.junit.Assert.assertEquals;import org.junit.*;public class TestAddAndSubTest public void add() /断言计算结果与 10 是否相等assertEquals(10, AddAndSub.add(4, 6);Test public void sub() /断言计算结果与 2 是否相等assertEquals(2, AddAndSub.sub(6, 4);8.4.3 改变初始化和销毁方式以前,JUnit 使用 SetUp 和 TearDown 方法来进行初始化和销毁动作,JUnit 4.0 以上版本

31、将不再强制使用 SetUp 和 TearDown 方法来进行初始化和销毁,原来使用 SetUp 和 TearDown 方法的示例代码如下:/* TestAddAndSub.java*import junit.framework.TestCase;public class TestAddAndSub extends TestCase private int m = 0;private int n = 0;/初始化protected void setUp() m = 4;n = 6;public void testadd() /断言计算结果与 10 是否相等assertEquals(10, Add

32、AndSub.add(m, n);public void testsub() /断言计算结果与 2 是否相等assertEquals(2, AddAndSub.sub(n, m);/销毁protected void tearDown() m = 0;n = 0;不使用 SetUp 和 TearDown 方法的示例代码如下:/* TestAddAndSub.java*import static org.junit.Assert.assertEquals;import org.junit.*;public class TestAddAndSub protected int m = 0;protec

33、ted int n = 0;/初始化Before public void init() m = 4;n = 6;Test public void add() /断言计算结果与 10 是否相等assertEquals(10, AddAndSub.add(m, n);Test public void sub() /断言计算结果与 2 是否相等assertEquals(2, AddAndSub.sub(n, m);/销毁After public void destory() m = 0;n = 0;上面示例中的初始化和销毁都是针对一个方法来说的,每个方法执行前都要进行初始化,执行完毕都要进行销毁。而

34、 JUnit 的最新版本则提供了新的特性,针对类进行初始化和销毁。也就是说,该类中的方法只进行一次初始化和销毁,方法就是使用Before 和After,示例代码如下:/* TestAddAndSub.java*import static org.junit.Assert.assertEquals;import org.junit.*;public class TestAddAndSub protected int m = 0;protected int n = 0;/初始化BeforeClass public void init() m = 4;n = 6;Test public void a

35、dd() /断言计算结果与 10 是否相等assertEquals(10, AddAndSub.add(m, n);Test public void sub() /断言计算结果与 2 是否相等assertEquals(2, AddAndSub.sub(n, m);/销毁AfterClass public void destory() m = 0;n = 0;上述初始化和销毁动作,只执行一次即可。8.4.4 改变异常处理的方式以前,使用 JUnit 进行单元测试时,如果遇到异常情况,需要使用 trycatch 的形式来捕捉异常,示例代码如下:/* TestAddAndSub.java*impor

36、t junit.framework.TestCase;public class TestAddAndSub extends TestCase private int m = 0;private int n = 0;/初始化protected void setUp() m = 4;n = 6;public void testadd() /断言计算结果与 10 是否相等assertEquals(10, AddAndSub.add(m, n);public void testsub() /断言计算结果与 2 是否相等assertEquals(2, AddAndSub.sub(n, m);public void testdiv() /断言除数为 0try int n = 2 / 0;fail(“Divided by zero!“);catch (ArithmeticException success) assertNotNull(success.getMessage();

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报