JUnit入门

来源:互联网 发布:c语言中的库函数有哪些 编辑:程序博客网 时间:2024/04/29 23:12
 

JUnit介绍



一、JUnit简介
JUnit是基于面向对象构建的java单元测试框架。
JUnit是开放源代码项目,可按需要进行扩展。

二、安装

示例一
/**
*
这个类简单的包装了oracle对数据连接缓冲池的实现。
*
*/
public class DefaultConnectionProxy extends ConnectionProxy {
private static final String name = "Default Connection Proxy";
private static final String description =
"
这个类简单的包装了oracle对数据连接缓冲池的实现。
";
private static final String author = "Ion-Global.com";
private static final int major_version = 0;
private static final int minor_version = 9;
private static final boolean pooled = true;
private ConnectionBroker connectionBroker = null;
private Properties props;
private Properties propDescriptions;
private Object initLock = new Object();
// Test Code Begin...
/*
为了能够了解对象的状态变化,因此需要把表征对象内部状态变化的部分私有变量提供公共的访问接口
(或者提供让同一个类包的访问接口),以便使测试单元可以有效地判断对象的状态转变,
在本示例中对包装的OracleConnectionCacheImpl对象提供访问接口。
*/
OracleConnectionCacheImpl getConnectionCache() {
if (connectionBroker == null) {
throw new IllegalStateException("You need start the server
first.");
}

return connectionBroker.getConnectionCache();
}
// Test Code End...
  在公开内部状态数据后,我们就可以编写我们的测试单元了,单元测试的选择方法和选择尺度已经在本文前面章节进行了说明。但是仍然需要注意的是,由于assert方法会抛出一个error,你应该在测试方法的最后集中用assert相关方法进行判断,这样可以确保资源得到释放。   

对数据库连接池的例子,我们可以建立测试类DefaultConnectionProxyTest,同时建立数个test case,如下:

示例二
/**
*
这个类对示例一中的类进行简单的测试。
*
*/
public class DefaultConnectionProxyTest extends TestCase {
private DefaultConnectionProxy conProxy = null;
private OracleConnectionCacheImpl cacheImpl = null;
private Connection con = null;
/**
设置测试的fixture,建立必要的测试起始环境。
*/
protected void setUp() {
conProxy = new DefaultConnectionProxy();
conProxy.start();
cacheImpl = conProxy.getConnectionCache();
}
/**
对示例一中的对象进行服务启动后的状态测试,检查是否在服务启动后,
连接池的参数设置是否正确。
*/
public void testConnectionProxyStart() {
int minConnections = 0;
int maxConnections = 0;
assertNotNull(cacheImpl);
try {
minConnections =
Integer.parseInt(PropertyManager.getProperty
("DefaultConnectionProxy.minConnections"));
maxConnections =
Integer.parseInt(PropertyManager.getProperty
("DefaultConnectionProxy.maxConnections"));
} catch (Exception e) {
// ignore the exception
}
assertEquals(cacheImpl.getMinLimit(), minConnections);
assertEquals(cacheImpl.getMaxLimit(), maxConnections);
assertEquals(cacheImpl.getCacheSize(), minConnections);
}
/**
对示例一中的对象进行获取数据库连接的测试,看看是否可以获取有效的数据库连接,
并且看看获取连接后,连接池的状态是否按照既定的策略进行变化。由于assert方法抛出的是
error对象,因此尽可能把assert方法放置到方法的最后集体进行测试,这样在方法内打开的
资源,才能有效的被正确关闭。
*/
public void testGetConnection() {
int cacheSize = cacheImpl.getCacheSize();
int activeSize = cacheImpl.getActiveSize();
int cacheSizeAfter = 0;
int activeSizeAfter = 0;
con = conProxy.getConnection();
if (con != null) {
activeSizeAfter = cacheImpl.getActiveSize();
cacheSizeAfter = cacheImpl.getCacheSize();
try {
con.close();
} catch (SQLException e) {
}
} else {
assertNotNull(con);
}
/*
如果连接池中的实际使用连接数小于缓存连接数,检查获取的新的数据连接是否
从缓存中获取,反之连接池是否建立新的连接
*/
if (cacheSize > activeSize) {
assertEquals(activeSize + 1, activeSizeAfter);
assertEquals(cacheSize, cacheSizeAfter);
} else {
assertEquals(activeSize + 1, cacheSizeAfter);
}
}
/**
对示例一中的对象进行数据库连接释放的测试,看看连接释放后,连接池的
状态是否按照既定的策略进行变化。由于assert方法抛出的是error对象,因此尽可
能把assert方法放置到方法的最后集体进行测试,这样在方法内打开的
资源,才能有效的被正确关闭。
*/
public void testConnectionClose() {
int minConnections = cacheImpl.getMinLimit();
int cacheSize = 0;
int activeSize = 0;
int cacheSizeAfter = 0;
int activeSizeAfter = 0;
con = conProxy.getConnection();
if (con != null) {
cacheSize = cacheImpl.getCacheSize();
activeSize = cacheImpl.getActiveSize();
try {
con.close();
} catch (SQLException e) {
}
activeSizeAfter = cacheImpl.getActiveSize();
cacheSizeAfter = cacheImpl.getCacheSize();
} else {
assertNotNull(con);
}
assertEquals(activeSize, activeSizeAfter + 1);
/*
如果连接池中的缓存连接数大于最少缓存连接数,检查释放数据连接后是否缓存连接数比之前减少了一个,反之缓存连接数是否保持为最少缓存连接数
*/
if (cacheSize > minConnections) {
assertEquals(cacheSize, cacheSizeAfter + 1);
} else {
assertEquals(cacheSize, minConnections);
}
}
/**
释放建立测试起始环境时的资源。
*/
protected void tearDown() {
cacheImpl = null;
conProxy.destroy();
}
public DefaultConnectionProxyTest(String name) {
super(name);
}
/**
你可以简单的运行这个类从而对类中所包含的测试单元进行测试。
*/
public static void main(String args[]) {
junit.textui.TestRunner.run(DefaultConnectionProxyTest.class);
}
}
  当单元测试完成后,我们可以用Junit提供的TestSuite对象对测试单元进行组织,你可以决定测试的顺序,然后运行你的测试。

JUnit
首先获取JUnit的软件包,从http://www.junit.org下载最新的软件包。
将软件包在适当的目录下解包。
这样在安装目录下找到一个名为junit.jar的文件,将这个jar文件加入

CLASSPATH系统变量。

三、JUnit框架介绍:
一)TestCase--测试用例,对每个测试类,都要定义一个测试用例。
JUnit支持两种运行单个测试的方法:静态的和动态的方法。
1、静态的方法就是覆盖TestCase类的runTest()方法,一般是采用内部类的方式

创建一个测试实例:
TestCasetest01=newtestCar("testgetWheels"){
publicvoidrunTest(){
testGetWheels();
}
}
采用静态的方法要注意要给每个测试一个名字,这样你就可以区分哪个测试失败

了。

2、动态的方法是用内省来实现runTest()以创建一个测试实例。这要求测试的名

字就是需要调用的测试方法的名字:
TestCasetest01=newtestCar("testGetWheels");
JUnit
会动态查找并调用指定的测试方法。动态的方法很简洁,但如果你键入了错

误的名字就会得到一个令人奇怪的NoSuchMethodException异常。动态的方法和静

态的方法都很好,你可以按照自己的喜好来选择。

二)
TestSuite
一旦你创建了一些测试实例,下一步就是要让他们能一起运行。我们必须定义一

TestSuite。在JUnit中,这就要求你在TestCase类中定义一个静态的suite()

法。suite()方法就像main()方法一样,JUnit用它来执行测试。在suite()方法中

,你将测试实例加到一个TestSuite对象中,并返回这个TestSuite对象。一个

TestSuite对象可以运行一组测试。
TestSuiteTestCase都实现了Test接口,而Test接口定义了运行测试所需的方法

。这就允许你用TestCaseTestSuite的组合创建一个TestSuite
publicstaticTestsuite(){
TestSuitesuite=newTestSuite();
suite.addTest(newtestCar("testGetWheels"));
suite.addTest(newtestCar("testGetSeats"));
returnsuite;
}
publicstaticTestsuite(){
returnnewTestSuite(testCar.class);
}

三)
TestRunner
有了TestSuite我们就可以运行这些测试了,JUnit提供了三种界面来运行测试
[TextUI]junit.textui.TestRunner
[AWTUI]junit.awtui.TestRunner
[SwingUI]junit.swingui.TestRunner
javajunit.textui.TestRunneryourTestclass

Fixture
如果需要在一个或若干个的类执行多个测试,这些类就成为了测试的context。在

JUnit中被称为Fixture。当你编写测试代码时,你会发现你花费了很多时间配置
/

初始化相关测试的Fixture。将配置Fixture的代码放入测试类的构造方法中并不

可取,因为我们要求执行多个测试,我并不希望某个测试的结果意外地(如果这

是你要求的,那就另当别论了)影响其他测试的结果。通常若干个测试会使用相

同的Fixture,而每个测试又各有自己需要改变的地方。
为此,JUnit提供了两个方法,定义在TestCase类中。

protectedvoidsetUp()throwsjava.lang.Exception
protectedvoidtearDown()throwsjava.lang.Exception

覆盖setUp()方法,初始化所有测试的Fixture,如建立数据库连接,将每个测试

略有不同的地方在testXXX()方法中进行配置。
覆盖tearDown(),释放你在setUp()中分配的永久性资源,如数据库连接。
JUnit执行测试时,它在执行每个testXXXXX()方法前都调用setUp(),而在执行

每个testXXXXX()方法后都调用tearDown()方法,由此保证了测试不会相互影响。

四)
Assert
Assert
类中定义了相当多的assert方法,主要有
assert(),assertEquals(),

assertNull(),assertSame(),assertTrue(),fail()
等方法。

Faile失败是一个期望的被assert方法检查到的结果。
Error错误则是意外的问题引起的,如ArrayIndexOutOfBoundsException


四、测试流程:
1.扩展TestCase类;
2.覆盖runTest()方法(可选);
3.对应测试目标类书写testXXXXX()方法;
4、扩展TestSuite类,重载suite()方法,实现自定义的测试过程;
5.运行TestRunner进行测试;
[url]http://www.chinaitlab.com/www/news/article_show.asp?id=24311[/url]
原创粉丝点击