1, junit的安装和调试原则java
1)导入junit的jar包,这里使用junit4.10, 不建议使用Eclipse自带的.sql
2)建立测试类的原则:数据库
在Eclipse中建立一个source folder 命名为testapi
建立测试类所在的包,包名与要测试的类的包名一致ide
3)Junit3 和Junit4的区别是比较大的工具
在Junit3中,若是某个类是测试类,必须继承TestCase,若是某个方法是测试方法,这个方法必须是testXXX的形式;性能
在Junit3中,若是但愿指定某个测试方法运行以前运行某个初始化方法,这个方法的名称必须是setUp(),若是但愿在某个测试方法运行以后运行某个释放资源的方法,这个方法的名称必须是 tearDown.测试
在Junit4中,一个Pojo类就是一个测试类,测试方法经过@Test标识,初始化方法经过@Before标识,释放资源的方法经过@After标识。可是为了让Junit4中的测试类在Junit3中也可使用,习惯上把初始化方法命名为setUp,释放资源的方式命名为tearDown,测试方法也一样以test开头.spa
3)断言的使用调试
在Junit4中提供了一个Assert的类,这个类中有大量的方法进行断言处理,在Junit3中因为继承了TestCase类,TestCase类提供了大量的assert方法.
2, 第一个简单的Junit测试例子
package com.yangw.util; public class Calcuate { public int add(int a,int b){ return a+b; } public int divide(int a,int b){ return a/b; } }
package com.yangw.util; import static junit.framework.Assert.*; import org.junit.Before; import org.junit.Test; public class TestCalcuate { Calcuate cal; // 执行任意测试方法以前都会执行该方法 @Before public void setUp(){ cal = new Calcuate(); } @Test public void testAdd(){ /** * 简单断言的编写 * 参数1: 表示若是出差给出的错误信息 * 参数2:表示方法执行完成以后预期的一个值 * 参数3:表示实际值 */ //Assert.assertEquals("加法有问题", cal.add(1, 2),3); // 将Assert全部的静态方法静态导入,这样不用添加类名从而有效兼容junit3 assertEquals("加法有问题", cal.add(1, 2),3); } @Test public void testDivide(){ assertEquals("除法有问题", cal.divide(4, 2),2); } //表示这个方法应该抛出ArithmeticException异常,若是不抛出就报错 @Test(expected=ArithmeticException.class) public void testDivideException(){ cal.divide(4, 0); } //表示这个方法要在300毫秒之内完成. // 能够进行简单的性能测试. @Test(timeout=300) public void testTime() throws Exception{ Thread.sleep(500); } }
3,dbunit的使用.
1), 导入 dbunit-2.4.9.jar、slf4j-api-1.6.1.jar
2), 建立dbunit的测试数据xml文件
<?xml version="1.0" encoding="UTF-8"?> <!-- dataset根标签 --> <dataset> <!-- 表信息 --> <!-- 第一种方式 基于节点的方式--> <!-- <t_user> <id>1</id> <username>yangw</username> <password>123456</password> </t_user> --> <!-- 第二种方式 --> <!-- 基于属性的方式 --> <t_user id="1" username="yangw" password="123456" /> </dataset>
3), 建立dbunit的Connection
dbunit的Connection是用来对数据文件进行操做的,这个Connection必须依赖于目前项目中所使用的Connection.
IDatabaseConnection conn=new DatabaseConnection(DBUtil.getConnection());
4), 建立IDataSet,经过DataSet来获取测试数据文件中的数据
//若是xml是基于节点的使用XmlDataSet ,若是是基于属性的使用 FlatXmlDataSet IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(TestDbunit.class.getClassLoader().getResourceAsStream("t_user.xml"))));
5), 初始化数据而且完成测试
// 清空数据库中的数据,插入xml中的数据 DatabaseOperation.CLEAN_INSERT.execute(conn, ds); //DatabaseOperation.DELETE 删除数据库中存在的xml数据 //DatabaseOperation.DELETE_ALL 删除数据库中全部的数据 //DatabaseOperation.INSERT 插入xml中的测试数据 //DatabaseOperation.NONE 什么都不作 //DatabaseOperation.REFRESH 刷新数据库中的数据 //DatabaseOperation.TRUNCATE_TABLE 清空数据库表中的数据 //DatabaseOperation.UPDATE 把数据库中的数据更新为xml中目前指定的数据 //从Dao中获取数据并完成测试 IUserDao ud = new UserDao(); User u = ud.load("yangw"); Assert.assertEquals(u.getId(), 1); Assert.assertEquals(u.getUsername(), "yangw"); Assert.assertEquals(u.getPassword(), "123456");
6) 备份和还原数据库
6.1. 备份:
/** * 备份数据库中全部的表 */ @Test public void testBackup(){ try { IDatabaseConnection conn=new DatabaseConnection(DBUtil.getConnection()); //根据Conn来建立DataSet,这个DataSet包含了全部的表 IDataSet ds =conn.createDataSet(); //将ds中的数据经过FlatXmlDataSet格式写到文件中 FlatXmlDataSet.write(ds, new FileWriter("d://test.xml")); } catch (DataSetException e) { e.printStackTrace(); } catch (DatabaseUnitException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
/** * 备份某些指定的表 */ @Test public void testBackupOne(){ try { IDatabaseConnection conn=new DatabaseConnection(DBUtil.getConnection()); //根据Conn来建立DataSet,这个DataSet包含了全部的表 QueryDataSet qds =new QueryDataSet(conn); //添加t_user这张表为要备份的表 qds.addTable("t_user"); //将ds中的数据经过FlatXmlDataSet格式写到文件中 FlatXmlDataSet.write(qds, new FileWriter("d://test.xml")); } catch (DataSetException e) { e.printStackTrace(); } catch (DatabaseUnitException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } }
6.2 还原
/** * 还原数据库 */ @Test public void testResume(){ try { IDatabaseConnection conn=new DatabaseConnection(DBUtil.getConnection()); //根据备份文件建立dataset IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(new FileInputStream("d://test.xml")))); // 清空数据库中的数据,插入xml中的数据 DatabaseOperation.CLEAN_INSERT.execute(conn, ds); } catch (DatabaseUnitException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
将备份、还原操做写成一个工具测试类,之后其它测试类只要继承它便可.
package frame.base.util; import static org.junit.Assert.assertNotNull; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.sql.SQLException; import org.dbunit.DatabaseUnitException; import org.dbunit.database.DatabaseConnection; import org.dbunit.database.IDatabaseConnection; import org.dbunit.database.QueryDataSet; import org.dbunit.dataset.DataSetException; import org.dbunit.dataset.IDataSet; import org.dbunit.dataset.xml.FlatXmlDataSet; import org.dbunit.dataset.xml.FlatXmlProducer; import org.dbunit.operation.DatabaseOperation; import org.junit.AfterClass; import org.junit.BeforeClass; import org.xml.sax.InputSource; /** * 基于DBunit的测试工具类 * @author yangw@eastcom.com * */ public class AbstractDBUtilTestCase { // dbunit的数据库链接 public static IDatabaseConnection dbunitConn; private File tempFile; @BeforeClass // 在构造以前执行,仅仅执行一次 public static void init() throws DatabaseUnitException, SQLException{ dbunitConn = new DatabaseConnection(JdbcUtil.getDBConnection()); } /** * 根据指定的测试文件(xml)获取IDataSet * @param tname ,通常状况下,测试的xml文件就用表名命名. * @return * @throws DataSetException * @throws IOException */ protected IDataSet createDataSet(String tname) throws DataSetException, IOException{ InputStream is=AbstractDBUtilTestCase .class .getClassLoader() .getResourceAsStream("dbunit_xml/"+tname+".xml"); assertNotNull("dbunit的基本数据文件不存在!", is); //若是xml是基于节点的使用XmlDataSet ,若是是基于属性的使用 FlatXmlDataSet return new FlatXmlDataSet(new FlatXmlProducer(new InputSource(is))); } /** * 备份数据库全部的表 * @throws DataSetException * @throws IOException * @throws SQLException */ protected void backupAllTable() throws DataSetException, IOException, SQLException{ IDataSet ds = dbunitConn.createDataSet(); writeBackupFile(ds); } /** * 备份数据库指定的表 * @param tNames 表名 * @throws DataSetException * @throws IOException * @throws SQLException */ protected void backupCustomTable(String[] tNames) throws DataSetException, IOException, SQLException{ QueryDataSet qds =new QueryDataSet(dbunitConn); for(String tName:tNames){ qds.addTable(tName); } writeBackupFile(qds); } /** * 备份一张指定的表 * @param tName 表名 * @throws DataSetException * @throws IOException * @throws SQLException */ protected void backupOneTable(String tName) throws DataSetException, IOException, SQLException{ backupCustomTable(new String[]{tName}); } private void writeBackupFile(IDataSet ds) throws DataSetException, IOException{ //将ds中的数据经过FlatXmlDataSet格式写到文件中 tempFile = File.createTempFile("back", "xml"); FlatXmlDataSet.write(ds, new FileWriter(tempFile)); } /** * 还原数据库 * @throws FileNotFoundException * @throws DatabaseUnitException * @throws SQLException */ protected void resumeTable() throws FileNotFoundException, DatabaseUnitException, SQLException{ InputStream is = new FileInputStream(tempFile); IDataSet ds = new FlatXmlDataSet(new FlatXmlProducer(new InputSource(is))); // 清空数据库中的数据,插入xml中的数据 DatabaseOperation.CLEAN_INSERT.execute(dbunitConn, ds); } @AfterClass public static void destory(){ if(dbunitConn!=null){ try { dbunitConn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }