Android-针对Dao层的单元测试

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.期望值与真实值比较
    }
            ·
            ·
            ·
  
}

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,099评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,828评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,540评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,848评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,971评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,132评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,193评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,934评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,376评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,687评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,846评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,537评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,175评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,887评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,134评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,674评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,741评论 2 351

推荐阅读更多精彩内容

  • Android单元测试介绍 处于高速迭代开发中的Android项目往往需要除黑盒测试外更加可靠的质量保障,这正是单...
    东经315度阅读 3,100评论 6 37
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,892评论 25 707
  • 今天,家里请客 一早起来,买菜,这是我对大家的爱,二姐帮忙来带孩子,让我非常的轻松,这是二姐对我的爱~~让孩子今天...
    Lulu轻悦阅读 312评论 0 0
  • “你现在有什么立场说这些话么?” 这句话是在喝醉的一个晚上,发疯了似的找他远在喵本的朋友要到了他的电话,他说的第一...
    拂夜子归阅读 176评论 0 0
  • 哈哈,第一时间po出照片!对的,这就是我,正在做平板支撑,两分多钟的时间,又爽又累。虽然是上个月办的健身卡,但是很...
    鱼泡泡不是泡沫阅读 353评论 8 1