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

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

你可能感兴趣的:(Android-针对Dao层的单元测试)