JUnit深入浅出

原创 2013年12月04日 09:45:37

JUnit是一个回归测试框架,是程序员测试——白盒测试,继承TestCase类就可以用JUnit进行测试了

import junit.framework.TestCase;
public class Test extends TestCase{
	public void testAdd(){
		assertEquals(1, 1);
	}
}

 

1、编写的测试类必须继承junit.framework.TestCase
2、里面的测试方法命名应该以test开头,必须是public void 而且不能有参数,否则不能使用junit
3、尽量一个testXXX方法对一个功能单一的方法进行测试
4、使用assertEquals等junit.framework.TestCase中的断言方法来判断测试结果正确与否

 

JUnit提供了一对方法,一个在运行测试方法前初始化一些必备的条件,而另外一个就是测试完毕后去掉初始化的条件
setUp()---->testXXX()---->tearDown()

import hb.util.SampleCalculator;
import junit.framework.TestCase;

public class TestSample extends TestCase {
	
	public SampleCalculator calculator = null;
	
	public void testAdd(){
		int result = calculator.add(50, 20);
		System.out.println(result);
		assertEquals(70, result);
	}
	
	public void testSubtration(){
		int abc = calculator.subtration(50, 20);
		System.out.println(abc);
		assertEquals(30, abc);
	}
	
	//每次测试一次的时候先执行setUp()这个方法
	@Override
	public void setUp(){
		calculator = new SampleCalculator();
		System.out.println("set up!");
	}
	//每次测试一次完成之后执行tearDown()这个方法
	@Override
	public void tearDown(){
		System.out.println("tearDown");
	}
}

 

Error和Failures的区别?
Errors:表示程序本身的错误(程序有逻辑问题)

import junit.framework.TestCase;
public class ErrorTest extends TestCase{
	public void testError(){
		assertEquals(3, 3);
		int result = 8 / 0;
	}
}

 Failures:表示测试失败(结果与期望的值不一致)

import junit.framework.TestCase;
public class TestFailure extends TestCase{
	public void testFailure(){
		assertEquals(5, 3);
	}
}

 

因此,我们在写测试程序的时候要先保证Errors是没有错误的,然后再来看Failures有没有错误

 

JUnit4.x利用了java5的特性(注释Annotation)的优势,比3.x使用起来更加方便简单,它不是简单的旧版本升级,它是一个全新的框架,整个框架的报结构已经彻底改变,但4.x版本任然能够很好的兼容旧版本的测试套件。

利用JUnit4.x的注解方式测试
import static org.junit.Assert.*;
import hb.util.Calculator;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

public class TTest {

	private Calculator calculator = new Calculator();
	
	//在所有方法运行之前运行
	@BeforeClass
	public static void beforeClass(){
		System.out.println("-----------beforeClass");
	}
	
	//在所有方法运行之后运行
	@AfterClass
	public static void afterClass(){
		System.out.println("---------afterClass");
	}
	
	//每个测试方法运行之前运行
	@Before
	public void before(){
		System.out.println("==============before");
	}
	
	//每个测试方法运行之后运行
	@After
	public void after(){
		System.out.println("===========after");
	}
	
	@Test
	public void testAdd(){
		int result = calculator.add(3, 6);
		assertEquals(9,result);
		System.out.println("testAdd() is OK");
	}
	
	@Test
	public void testDivision(){
		System.out.println("in test division");
	}
	
	@Ignore  //表示这个方法是不被运行的
	@Test
	(expected=java.lang.ArithmeticException.class,timeout=100) //timeout表示要求方法在100毫秒内运行完成,否则报错
    public void testDivide(){
        int z = calculator.subtration(8,2);
    }
}

运行结果:
-----------beforeClass
==============before
testAdd() is OK
===========after
==============before
in test division
===========after
---------afterClass

 

结论:@BeforeClass --> @Before --> @Test --> @After --> @AfterClass

1、注释before与方法setUp()方法类似
2、注释after方法与tearDown()方法类似
3、测试期望异常和超时时间,例如@Test(timeout=100),我们给测试函数设定一个执行时间,超过了这个时间(100毫秒),它们就会被系统强行终止,并且系统还会向你汇报该函数结束的原因是因为超时,这样就能发现Bug了;
同时还可以测试期望的异常@Test(expected=lllegalArgumentException.class)
4、@Ignore:忽略的测试方法,标注的含义——某些方法尚未完成,暂不参与此次测试
5、@BeforeClass:针对所有测试,在所有测试方法执行前执行一次,且必须为public static void
6、@AfterClass:针对所有测试,在所有测试方法执行结束后执行一次,并且必须为public static void


JAVA5新添加的新特性,可以使用import进来某个Class的静态members,主要有两种表现形式:
1、引进某个特定的静态成员
import static packageName.ClassName.staticMemberName;
2、引进所有的静态成员
import static packageName.ClassName.*;
这样引进后,就可以像自身成员那样使用import进来的成员,上面代码中assertEquals这个方法就是这么引用过来使用的。

批量处理的学习?
方法引入一种“测试套件”的概念,JUnit提供了一种批量运行测试类的方法,叫做测试套件。
测试套件的写法需要遵循一下原则:
1、创建一个空类作为测试套件的入口,
2、使用注解org.junit.runner.RunWith和org.junit.runners.Suite.SuitClasses修饰这个空类
3、将org.junit.runners.Suite作为参数传入给注解RunWith,以提示JUnit为此类测试使用套件运行器执行
4、将需要放入此测试套件的测试类组成数组作为注解SuiteClasses的参数
5、保证这个空类使用public修饰,而且存在公开的不带任何参数的构造函数

//该类是用来测试User类这个方法的
import static org.junit.Assert.*;
import hb.util.User;
import org.junit.Test;

public class TestUser {
	@Test
	public void testGetName(){
		assertEquals("黄彪", new User().getName());
	}
}

//该测试类是用来测试类T这个方法的
import hb.util.T;
import static org.junit.Assert.*;
import org.junit.Test;

public class TTest {

	@Test
	public void testAdd(){
		int result = new T().add(5, 3);
		assertEquals(8,result);
	}
}

//将TestUser、TTest这个两个测试类一并处理
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)  //告知JUnit此类测试使用套件运算至星器
@SuiteClasses({TestUser.class,TTest.class})//需要测试的类的方法
public class AllTest {
}

 代码规范?
1、单元测试的代码应位于单独的Source Folder下,即与src同一级别
2、测试类应该与被测试类位于统一package,即src和自己建立的测试folder目录相同
3、选择有测试意义的测试方法名,单元测试方法名均需使用test<待测试方法名>[概要描述],例如public void testDivdeDivisorZero(),这样很容易知道测试方法的含义
4、保持测试的独立性
5、为暂时未实现的测试代码抛出失败(fail)或者是忽略(ignore),例如使用fail("not yet implemented")或是@Ignore("not yet implemented")
6、在调用断言(assert)方法时给出失败的原因

 

  • hb.rar (1.7 KB)
  • 下载次数: 2

JUnit深入浅出

JUnit是一个回归测试框架,是程序员测试——白盒测试,继承TestCase类就可以用JUnit进行测试了 Java代码   import junit.framework.Te...
  • feifei20081014
  • feifei20081014
  • 2013年10月01日 11:47
  • 387

Android、JUnit深入浅出(三)

通过前面2篇文章的学习,我们对JUnit有了初步的认识,下面我们将深入的解析JUnit数据包。整个JUnit的数据包应该是很强大的,但是一般来说,不一定每个工程都需要这些数据包,而是在JUnit部分数...
  • zhaoweixing1989
  • zhaoweixing1989
  • 2013年01月23日 13:33
  • 423

Android、JUnit深入浅出(二)——JUnit例子分析

By: 海市蜃楼 | In: Android开发 21十2009 在前一篇文章JUnit初步解析中,我们简要了解了JUnit的主要功能: 管理测试用例;定义测试代码;定义测试环境;检测测...
  • zhaoweixing1989
  • zhaoweixing1989
  • 2013年01月23日 13:32
  • 541

即将出版《Spring Boot入门与实践》

即将出版《深入浅出Spring Boot》,先来广告一波
  • ykzhen2015
  • ykzhen2015
  • 2017年12月01日 09:54
  • 484

评侯捷的《深入浅出MFC》和李久进的《MFC深入浅出》

侯捷的<深入浅出MFC>相信大家都已经很熟悉了,论坛上也有很多介绍,这里我就不多说了。        而李久进的<MFC深入浅出>,听说的人可能就少得多。原因听说是这本书当时没有怎么宣传,而自从1...
  • softfox
  • softfox
  • 2013年02月18日 15:22
  • 3292

《深入浅出统计学》总结

《深入浅出统计学》总结
  • qq229873466
  • qq229873466
  • 2017年05月08日 09:33
  • 529

DPDK分析--深入浅出

概述 随着互联网的高速发展,云产业的快速突起,基础架构网络逐渐偏向基于通用计算平台或模块化计算平台的架构融合,来支持多样化的网络功能,传统的PC机器在分布式计算平台上的优势更为明显。在这些针对海...
  • Tomstrong_369
  • Tomstrong_369
  • 2017年03月01日 20:08
  • 2577

Java深入浅出系列(一)——浅析Java反射机制

一、反射的理解        反射类似于我们平时见到的平面镜的反射:被反射的目标(任意一个已知名称的类),反射出来的“镜像”(我们的类对象中任意一个类都对应有一个类对象>),通过这个“镜像”,类对象,...
  • liutengteng130
  • liutengteng130
  • 2015年06月19日 17:03
  • 1464

深入浅出struts2

1.struts2简介 2.struts2流程 3.struts2核心概念 一、struts简介 struts2是由Apache软件基金会开发的一个基于MVC模式的轻量级Java EE框架,str...
  • z137657747
  • z137657747
  • 2016年08月30日 16:02
  • 380

深入浅出Extjs4.1.1视频教程

百度网盘下载:链接:http://pan.baidu.com/s/1mg5ZKLE 密码:cn4s 第1讲.ExtJs初识及其环境搭建 第2讲.开始ExtJs梦想之旅 第3讲.ExtJS工具栏、菜单...
  • ejdyneifys
  • ejdyneifys
  • 2015年09月25日 09:27
  • 776
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:JUnit深入浅出
举报原因:
原因补充:

(最多只允许输入30个字)