美文网首页
Android-针对Dao层的单元测试

Android-针对Dao层的单元测试

作者: Jeremy_Ji | 来源:发表于2018-07-30 09:06 被阅读92次

    Android的单元测试大家都不陌生,必要的单元测试可以提高工作效率,省去大量的在Android真机或者虚拟机上的调试,提高代码质量。尤其是在团队项目开发中,为自己写的代码负责,提高项目后期的可维护性。这篇文章算是个人心得体会吧。
    前几天接了一个任务就是对团队中现有的一个项目的dao层写单元测试(数据访问对象),该项目中的数据库适配器(MyDataBaseAdapter)中集成了大量的关于数据库中增,删,改,查的方法,现在要测试这些函数的功能。然后就遇到了一些问题,比如说不能对原有的数据库带来脏数据,而且要测试这些方法还必须要在数据库中测试。搜集了一些资料比如Spring结合junit利用对数据库的回滚操作进行测试。但还是找到了更好的方法,就是robolectric框架。
    有关Robolectric测试框架的详细知识个人感觉简书:键盘男https://www.jianshu.com/u/0ef3dc77079c他的博客写的是很不错的有关其他的测试可以参考一下。
    接下来总结一下对dao层的测试。

    添加依赖,(3.3.2并不是最新版本)

    testCompile 'org.robolectric:robolectric:3.3.2'
    

    定义数据工具类

    定义的字段对应之前数据库的字段(比如原数据库需要测试id或name的删除更新等,根据需求定义)
    如果数据库表字段较少,可以直接插入数据,不用定义该类

    public class BaseInfo {
       
        private int id(字段1);
        private String name(字段2);
                   ·
                   ·
                   ·
                   ·
                   ·
        private int 字段13;
        private String 字段14;
    
      
    
        public BaseInfo(int id,String name,``````,) {
            super();
        this.id=id;
        this.name=name;
                `
                `
                `
         this.XX=XX;
          
        }
    
    设置geter和seter
    
    }
    
    

    定义各表字段

    
    

    定义测试用的insert函数(将数据插入数据库)

    public Long insertTestData(BasemInfo basemInfo){
                    //hashmap保存表列与数据
            ContentValues initialValues = new ContentValues();
            initialValues.put(列名._ID,baseInfo.getID());
            `
                    `
                    `
                    `
            initialValues.put(列名.NAME,baseInfo.getNAME());
            return  mSQLiteDatabase.insert(数据库表名, null, initialValues);
        }
    

    测试之前的环境配置

    用这个框架测试之前建立一个新的数据库,用于各种测试,每个测试结束后自动删除数据库,所以不用担心对原有的数据库造成干扰。

    @RunWith(RobolectricTestRunner.class)//Robolectric是一个单元测试框架,可以对Android SDK jar进行消除
    @Config(constants = BuildConfig.class, sdk = 21, manifest = Config.NONE)//配置环境sdk版本等等
    /**
     * 该类用于测试数据库的一些增删改查的方法
     * 测试用类
     */
    public class TestMyDataBaseAdapter {
    
        public MyDataBaseAdapter myDataBaseAdapter;
        private SQLiteDatabase mSQliteDatabase;
        private Context mContext;
        //用来添加一条模拟数据(自定义的数据bean类,收集数据且对应数据库字段)
        private static BaseInfo testBaseInfo;
    
        @Before
        public void setUp() {
            //创建并打开数据库
            myDataBaseAdapter =new MyDataBaseAdapter(RuntimeEnvironment.application);
            //获得测试环境
            mContext = RuntimeEnvironment.application;
            mSQliteDatabase = myDataBaseAdapter.getSQLiteDatabase();
            //输出log
            ShadowLog.stream=System.out;
            /**
             * 测试用的模拟数据
             */
            testBaseInfo=new BaseInfo(
                    4,//数据id=4
                    张三,//下面均为虚拟测试数据(每个数据对应数据库表的字段,根据被测的函数模拟即可)
                    0,
                    null,
                    "测试1",
                    0,
                    1000,
                    "a",
                    false,
                    0,
                    0,
                    0,
                    0,
                    null,
                    null,
                    (byte)1,
                    (byte)0,
                    0,
                    0
            );
        }
    
        @After
        public void tearDown() {
            //结束测试关闭数据库
            myDataBaseAdapter.close();
        }
    
        /**
         * 根据id更新name
         *
         */
        @Test
        public void update() {
            //数据库表插入测试数据
            myDataBaseAdapter.insertTestData(testBaseInfo);
            //调用被测试的方法update,修改id=4的name值为李四(原本为张三)
            //输入期望的值
            int expectValues=李四;
            myDataBaseAdapter.update(testBaseInfo.getID(),expectValues);
            Cursor cursor= myDataBaseAdapter.getDataByTimerId(testBaseInfo.getID());
            //利用Cursor查出来真实的值(也可以直接用Sql语句)
            cursor.moveToFirst();
            String t actualValues=cursor.getString(MyDataBaseAdapter.NAME_INDEX);
            //对比两者值是否相同
            cursor.close();
            Assert.assertEquals(expectValues,actualValues);
    
        }
    
        /**
         * 更新Xxxx
         */
        @Test
        public void updateXxxx() {
             1.测试数据插入数据库
             2.调用被测函数,修改对应参数的值(期望值)
             3.取出该数据(真实值)
             4.期望值与真实值比较
        }
    
         /**
         * 插入Xxxx
         */
        @Test
        public void insertXxxx() {
             1.调用被测函数,插入一条数据(期望值)
             2.取出该数据(真实值)
             3.期望值与真实值比较
        }
                ·
                ·
                ·
      
    }
    

    查找,删除等也可以用类似的思想单元测试。
    正在学习安卓,希望能够多积累,多提升

    相关文章

      网友评论

          本文标题:Android-针对Dao层的单元测试

          本文链接:https://www.haomeiwen.com/subject/ljpomftx.html