一、简介JUnit

JUnit是一个开源的java单元测试框架。在1997年,由 Erich Gamma 和 Kent Beck 开发完成。这两个牛人中 Erich Gamma 是 GOF 之一;Kent Beck 则在 XP 中有重要的贡献(你觉得眼熟一点都不奇怪)。

       正如常言道:“麻雀虽小,五脏俱全。” JUnit设计的非常小巧,但是功能却非常强大。

什么是单元测试?
    写了个类,要给别人用,会不会有bug?怎么办?测试一下。
    
用main方法测试好不好?不好!
    1.    不能一起运行!
    2.    大多数情况下需要人为的观察输出确定是否正确
    
为什么要进行单元测试?
    1.    重用测试,应付将来的实现的变化。
  2.    提高士气,明确知道我的东西是没问题的。

       下面是JUnit一些特性的总结:

1)         提供的API可以让你写出测试结果明确的可重用单元测试用例

2)       提供了三种方式来显示你的测试结果,而且还可以扩展

3)       提供了单元测试用例成批运行的功能

4)       超轻量级而且使用简单,没有商业性的欺骗和无用的向导

5)       整个框架设计良好,易扩展

对不同性质的被测对象,如Class,Jsp,Servlet,Ejb等,Junit有不同的使用技巧。由于本文的性质,以下仅以Class测试为例。

下面我们就开始学习JUnit!

二、下载JUnit.jar和hamcrest.jar

许多IDE都自带了JUnit,但是并不推荐使用,  我们自己动手下载Jar包(不推荐使用的原因后面会说明)

点击http://www.junit.org可以下载到最新版本的JUnit,目前最新版本是4.11。进入官网选择Download and Install guide,

然后选择Plain-old JAR下的junit.jar,找到最新的4.11版本,下载jar包.
  点击http://code.google.com/p/hamcrest/downloads/list下载最新的hamcrest-1.3.zip,解压.找到hamcrest-core-1.3.jar

然后在项目中引用junit-4.11.jar和hamcrest-core-1.3.jar,这样你就可以使用JUnit编写单元测试代码了.

三、简单的例子

记得在几乎每本语言教学书上都能找到HelloWorld这个入门代码。今天在这里,我们也从一个简单到根本不用单元测试的例子入手。四则运算。

第一步:建立项目引用junit-4.11.jar和hamcrest-core-1.3.jar

第二步:编写Calculator类,代码如下:

  1. package com.zjw.junit4;
  2. public class Calculator {
  3. public int plus(int x, int y) {
  4. return x + y;
  5. }
  6. public int subtraction(int x, int y) {
  7. return x - y;
  8. }
  9. public int multiplication(int x, int y) {
  10. return x * y;
  11. }
  12. public int division(int x, int y) {
  13. return x / y;
  14. }
  15. }

第三步:编写单元测试类,代码如下:

  1. package com.zjw.junit4.test;
  2. import static org.junit.Assert.*; //注意这边,静态导入
  3. import org.junit.Ignore;
  4. import org.junit.Test;
  5. import com.zjw.junit4.Calculator;
  6. public class TestCalculator {
  7. @Test
  8. public void testPlus() {
  9. Calculator cal = new Calculator();
  10. assertEquals(cal.plus(5, 5), 10);
  11. }
  12. @Test
  13. public void testSubtraction() {
  14. Calculator cal = new Calculator();
  15. assertEquals(cal.subtraction(5, 5), 0);
  16. }
  17. @Ignore
  18. @Test
  19. public void testMultiplication() {
  20. Calculator cal = new Calculator();
  21. assertTrue(cal.multiplication(5, 5) > 20);
  22. }
  23. @Test(expected = java.lang.ArithmeticException.class, timeout = 50)
  24. public void testDivision() {
  25. Calculator cal = new Calculator();
  26. assertEquals(cal.division(8, 0), 4); //大家注意看,除数是0
  27. }
  28. }

第四步:测试,在这里,我用的是MyEclipse,在TestCalculator类上右键找到Run As 下的JUnit Test,点击然后就开始测试了

第五步:观察测试结果,在这里我测试都是正确的,我们来分析测试结果和代码:

1.         Failure是指测试失败

2.         Error是指测试程序本身出错

3.         由于我在testMultiplication方法上加了@Ignore 所以该方法会被忽略

4.         testDivision为什么报测试异常?

  1. @Test(expected = java.lang.ArithmeticException.class, timeout = 50)

看这个@Test expected后面指定你希望抛出的异常,timeout的意思是 如果测试没有在50ms内完成,那么就算测试失败.

5.       大家有没有觉得在每个测试方法下都new一个Calculator对象很浪费资源,假如有80个测试方法呢?所以接下来我们要使用@BeforeClass,代码如下:

  1. package com.zjw.junit4.test;
  2. import static org.junit.Assert.*;
  3. import org.junit.BeforeClass;
  4. import org.junit.Ignore;
  5. import org.junit.Test;
  6. import com.zjw.junit4.Calculator;
  7. public class TestCalculator {
  8. private static Calculator cal;
  9. @BeforeClass
  10. public static void beforeClass(){ //静态方法
  11. cal=new Calculator();
  12. }
  13. @Test
  14. public void testPlus() {
  15. assertEquals(cal.plus(5, 5), 10);
  16. }
  17. @Test
  18. public void testSubtraction() {
  19. assertEquals(cal.subtraction(5, 5), 0);
  20. }
  21. @Ignore
  22. @Test
  23. public void testMultiplication() {
  24. assertTrue(cal.multiplication(5, 5) > 20);
  25. }
  26. @Test(expected = java.lang.ArithmeticException.class, timeout = 50)
  27. public void testDivision() {
  28. assertEquals(cal.division(8, 0), 4);
  29. }
  30. }

为什么@BeforeClass下的方法必须是静态的?因为它在类初始化之前就运行了 .

为什么需要@BeforeClass,因为有的测试需要在测试之前需要取得一些很耗费时间的资源或者要搭建比较耗时间的环境例如建立数据库连接,搭建数据库连接池.
与之对应的还有@AfterClass,用于释放资源,这边我就不写了.

四、JUnit的Annoation:

1.         @Test: 测试方法

a)        (expected=XXException.class)

b)        (timeout=xxx)

2.         @Ignore: 忽略测试方法

3.         @Before: 每一个测试方法之前运行

4.         @After: 每一个测试方法之后运行

5.         @BeforeClass: 所有测试开始之前运行,别忘了方法是静态的.

6.         @AfterClass: 所有测试结束之后运行

五、注意

a)        测试类放在test包中

b)        类名用TestXXX

c)        方法用test方法名命名

六、总结

本文简单的介绍了JUnit使用的入门知识,以后会讲同时测试多个类以及JUnit4的新特性...

未完待续...

junit入门的更多相关文章

  1. JUnit 入门

    JUNIT了解学习 转自:关于Java单元测试,你需要知道的一切 转自:JUnit 入门教程 JUnit高级用法之@RunWith @RunWith 关于@RunWith注解,官方文档是这么描述的: ...

  2. [置顶] JUnit入门教程(二)

    一:介绍 接着上次的课程,今天我们学习JUnit4的新特性 assertThat()方法,这种方式和其余的assert方法比起来,更加接进英语. 二:分析API API中的例子: 参数 T Actua ...

  3. Android接口测试-JUnit入门

    1.下载:http://www.junit.org 2.配置AndroidManifest.xml,在application节点加入 <!--使用单元测试库-->        <u ...

  4. Junit 入门使用教程

    1.Junit 是什么? JUnit是一个Java语言的单元测试框架.它由Kent Beck和Erich Gamma建立,逐渐成为源于Kent Beck的sUnit的xUnit家族中最为成功的一个JU ...

  5. 【软件测试】Junit入门

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

  6. Android JUnit 入门指南

    自动化单元测试可以做许多的事,并帮你节省时间.它也可以被用作快速检验新建工程或进行冒烟测试.始终,单元测试是作为一种有效的.系统的检验应用程序各功能执行的方式.Android SDK支持JUnit的自 ...

  7. Junit入门教程

    做开发的时候,完成一个接口.方法.函数或者功能等,需要测试,是否有bug,有逻辑错误.这里有两种方案测试 1. 在main中写测试方法 2. 使用开源框架,这里使用的junit main写测试方法优点 ...

  8. Ant, JUnit以及Sonar的安装+入门资料

    Ant 感觉是个和Make/Grunt类似的东东,build一个项目用的.安装很容易,跟装JDK类似,就是解压->设环境变量->没了.注意装之前要先确认Java装好了(有点废话). 下载地 ...

  9. Java Junit测试框架

    Java    Junit测试框架 1.相关概念 Ø JUnit:是一个开发源代码的Java测试框架,用于编写和运行可重复的测试.它是用于单元测试框架体系xUnit的一个实例(用于java语言).主要 ...

随机推荐

  1. 【CodeForces 672B】Different is Good

    题 字符串所有子串要不同.求修改最少多少个字符. 因为只能是26个字母,显然大于26的不可能有答案,其它情况ans+=u[i]-1:u[i]是字母出现的次数. #include<cstdio&g ...

  2. 由多线程引起的map取值为null的分析

    昨天写了一个多线程的程序,却发现了一个很奇特的问题,就是我的map对象明明put了,可是get的时候竟然会取到null,而且尝试多次,有时候成功,有时候取到null,并不确定. 程序代码如下: pub ...

  3. vmware安装ubuntu卡在install vm-tools

    vmware,安装ubuntu或者centos,都有这个问题:vmware自作聪明,提示说"快速安装",然后会使用一个autoinst.iso文件来快速安装,并且装完系统后该重启了 ...

  4. springMVC-HelloWorld

    1.加入包 2.web.xml 3.利用spring-tool来新建一个springmvc的配置文件 关键步骤,选择创建一个Spring Bean Definition filer 然后next,然后 ...

  5. dedecms /include/helpers/archive.helper.php SQL Injection Vul

    catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述 Dedecms会员中心注入漏洞 Relevant Link: http: ...

  6. Linux WebServer WebRoot Path Identification

    目录 . HTTPD(Apache) . NGINX . TENGINE . JBOSS . TOMCAT . LIGHTTPD 1. HTTPD(Apache) 0x1: 启动参数 Usage: . ...

  7. Oracle 查询今天、昨日、本周、本月和本季度的所有记录

    Oracle 查询今日.昨日.本周.本月和本季度的所有记录 字段类型为date 今日 select * from 表名 where to_char(字段名,'dd')=to_char(sysdate, ...

  8. 偶然发现的Unity3d,两点之间的距离计算。

    无意间查了一下Vector3的API,发现了一个方法. magnitude  Returen the length of vector(Read Only). 然后就试了一下这个方法. Vector3 ...

  9. UVa 437 The Tower of Babylon(经典动态规划)

    传送门 Description Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details ...

  10. python合并2个字典

    2种方式,update()和items()方式 In [14]: a Out[14]: {'a': 1, 'b': 2, 'c': 3} In [15]: c = {'d': 4} In [16]: ...