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.期望值与真实值比较
}
·
·
·
}
查找,删除等也可以用类似的思想单元测试。
正在学习安卓,希望能够多积累,多提升