zoukankan      html  css  js  c++  java
  • Junit的使用

    1, junit的安装和调试原则

      1)导入junit的jar包,这里使用junit4.10, 不建议使用Eclipse自带的.

      2)创建测试类的原则:

        在Eclipse中创建一个source folder 命名为test

        创建测试类所在的包,包名与要测试的类的包名一致

      3)Junit3 和Junit4的区别是比较大的

        在Junit3中,如果某个类是测试类,必须继承TestCase,如果某个方法是测试方法,这个方法必须是testXXX的形式;

        在Junit3中,如果希望指定某个测试方法运行之前运行某个初始化方法,这个方法的名称必须是setUp(),如果希望在某个测试方法运行之后运行某个释放资源的方法,这个方法的名称必须是 tearDown.

        在Junit4中,一个Pojo类就是一个测试类,测试方法通过@Test标识,初始化方法通过@Before标识,释放资源的方法通过@After标识。但是为了让Junit4中的测试类在Junit3中也可以使用,习惯上把初始化方法命名为setUp,释放资源的方式命名为tearDown,测试方法也同样以test开头.

      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();
                }
            }
        }
    }

      

        

      

    ----------- 赠人玫瑰,手有余香     如果本文对您有所帮助,动动手指扫一扫哟   么么哒 -----------


    未经作者 https://www.cnblogs.com/xin1006/ 梦相随1006 同意,不得擅自转载本文,否则后果自负
  • 相关阅读:
    74. Search a 2D Matrix(js)
    73. Set Matrix Zeroes(js)
    72. Edit Distance(js)
    71. Simplify Path(js)
    兼容各种浏览器版本的事件绑定函数?
    浏览器兼容性问题
    柯里化函数
    token登录验证机制
    vue懒加载
    在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效??
  • 原文地址:https://www.cnblogs.com/xin1006/p/5007632.html
Copyright © 2011-2022 走看看