ContentProvider单元测试

发表于:2013-11-06 11:30

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:stevenhu_223    来源:51Testing软件测试网采编

  3.创建测试ContentProvider组件的测试代码
  ProviderTestCase2<T extends ContentProvider>为Android测试框架提供的用于测试ContentProvider的测试类,T即为待测试的Target,该Target必须为ContentProvider类型(继承ContentProvider)。
  TestProvider.java文件中的代码实现对ProviderToBeTest的单元测试,代码如下:
package com.steven.hu.cpt.test;
import com.steven.hu.cpt.Family;
import com.steven.hu.cpt.ProviderToBeTest;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.test.ProviderTestCase2;
import android.test.mock.MockContentResolver;
import android.util.Log;
import android.webkit.WebChromeClient.CustomViewCallback;
public class TestProvider extends ProviderTestCase2<ProviderToBeTest>
{
// 测试框架提供的虚拟ContentResolver,该类继承ContentResolver
private MockContentResolver mMockResolver;
private SQLiteDatabase mDatabase;
private final MemberInfo[] TEST_MEMBERS =
{
new MemberInfo("name0", 0, "gender0"),
new MemberInfo("name1", 1, "gender1"),
new MemberInfo("name2", 2, "gender2"),
new MemberInfo("name3", 3, "gender3"),
new MemberInfo("name4", 4, "gender4"),
new MemberInfo("name5", 5, "gender5"),
new MemberInfo("name6", 6, "gender6"),
new MemberInfo("name7", 7, "gender7"),
new MemberInfo("name8", 8, "gender8"),
new MemberInfo("name9", 9, "gender9")
};
public TestProvider()
{
super(ProviderToBeTest.class, Family.AUTHRITY);
}
@Override
protected void setUp() throws Exception
{
// TODO Auto-generated method stub
super.setUp();
mMockResolver = getMockContentResolver();
mDatabase = getProvider().getOpenHelperForTest().getWritableDatabase();
}
public void testUriAndGetType()
{
String mimeType = mMockResolver.getType(Family.Member.FAMILY_CONTENT_URI);
assertEquals("famliy/com.steven.hu.genealogy", mimeType);
// mimeType为空,因为MEMBER_CONTENT_URI没有适配member/#
/*
* mimeType = mMockResolver.getType(Family.Member.MEMBER_CONTENT_URI);
* assertEquals("member/com.steven.hu.genealogy", mimeType);
*/
// 测试成功,MEMBER_CONTENT_URI后追加1,为member/1适配member/#,#代码任意值
Uri noteIdUri = ContentUris.withAppendedId(Family.Member.MEMBER_CONTENT_URI, 1);
mimeType = mMockResolver.getType(noteIdUri);
assertEquals("member/com.steven.hu.genealogy", mimeType);
}
private class MemberInfo
{
String name;
int age;
String gender;
public MemberInfo(String n, int a, String g)
{
name = n;
age = a;
gender = g;
}
public ContentValues getContentValues()
{
ContentValues values = new ContentValues();
values.put(Family.Member.NAME, name);
values.put(Family.Member.AGE, age);
values.put(Family.Member.GENDER, gender);
return values;
}
}
// 测试数据插入(注:每一个测试用例执行完后,对应的测试数据库会自动清空。)
public void testInsert()
{
MemberInfo memberInfo = new MemberInfo("steven", 100, "man");
// 返回表中一行数据对应的uri
Uri rowUri = mMockResolver.insert(
Family.Member.FAMILY_CONTENT_URI,
memberInfo.getContentValues());
// 查询返回插入的数据
Cursor cursor = mMockResolver.query(
Family.Member.FAMILY_CONTENT_URI,
null,
null,
null,
null);
// 测试是否只是插入一行数据
assertEquals(1, cursor.getCount());
// 测试表中的第一个条数据是否存在,若cursor为空,则cursor.moveToFirst()返回fase
assertTrue(cursor.moveToFirst());
// 获取列字段的index
int nameIndex = cursor.getColumnIndex(Family.Member.NAME);
int ageIndex = cursor.getColumnIndex(Family.Member.AGE);
int genderIndex = cursor.getColumnIndex(Family.Member.GENDER);
// 测试数据库表中的信息是否和原信息一致
assertEquals(memberInfo.name, cursor.getString(nameIndex));
assertEquals(memberInfo.age, cursor.getInt(ageIndex));
assertEquals(memberInfo.gender, cursor.getString(genderIndex));
}
// 建立测试数据-->向数据表中插入数据,以便进行测试
private void insertData()
{
for (int i = 0; i < TEST_MEMBERS.length; i++)
{
mDatabase.insertOrThrow(Family.Member.TABLE_NAME, null, TEST_MEMBERS[i]
.getContentValues());
}
}
// 测试查询多条记录
public void testQueryRecords()
{
Cursor cursor = mMockResolver.query(
Family.Member.FAMILY_CONTENT_URI,
null,
null,
null,
null);
// 测试数据库中的内容是否为空
assertEquals(0, cursor.getCount());
// 建立测试数据
insertData();
// 再次查询
cursor = mMockResolver.query(
Family.Member.FAMILY_CONTENT_URI,
null,
null,
null,
null);
assertEquals(TEST_MEMBERS.length, cursor.getCount());
/**
* 测试通过SQL条件语句查询出的数据
*/
// 定义查询name字段内容的SQL语句
final String NAME_SELECTION = Family.Member.NAME + " = " + "?";
//条件语句-->查询name列字段值分别为name0,name2,name7的三行数据
final String SELECTION_COLUMNS_NAME = NAME_SELECTION + " OR " + NAME_SELECTION + " OR "
+ NAME_SELECTION;
final String[] SELECTION_ARGS =
{
"name0", "name2", "name7"
};
// 查询出的三行数据中包含name,age,gender列字段对应的值(顺序不能颠倒)
final String[] TEST_PROJECTION =
{
Family.Member.NAME, Family.Member.AGE, Family.Member.GENDER
};
// 定义查询排序顺序(ASC为升序,DESC为降序)
final String SORT_ORDER = Family.Member.NAME + " ASC";
// 查询列字段
Cursor projectionCursor = mMockResolver.query(
Family.Member.FAMILY_CONTENT_URI,
TEST_PROJECTION,
null,
null,
null);
// 测试查询所得的列字段数
assertEquals(TEST_PROJECTION.length, projectionCursor.getColumnCount());
// 测试查询所得列字段名
assertEquals(TEST_PROJECTION[0], projectionCursor.getColumnName(0));
assertEquals(TEST_PROJECTION[1], projectionCursor.getColumnName(1));
assertEquals(TEST_PROJECTION[2], projectionCursor.getColumnName(2));
//根据SQL条件语句查询数据
projectionCursor = mMockResolver.query(
Family.Member.FAMILY_CONTENT_URI,
TEST_PROJECTION,  //get the name, age, and gender columns
SELECTION_COLUMNS_NAME, //select on the name column
SELECTION_ARGS, // select names "name0", "name2", or "name7"
SORT_ORDER // sort ascending on the name column
);
//测试条件查询出的name列字段内容数量
assertEquals(SELECTION_ARGS.length, projectionCursor.getCount());
int index = 0;
while (projectionCursor.moveToNext())
{
//测试查询出的name列字段内容
assertEquals(SELECTION_ARGS[index], projectionCursor.getString(0));
index++;
}
assertEquals(SELECTION_ARGS.length, index);
}
// 测试查询单条记录
public void testQueryRecord()
{
//查询出gender字段值为gender2的一行数据
final String SELECTION_COLUMNS_GENDER = Family.Member.GENDER + " = " + "?";
final String[] SELECTION_ARGS = { "gender2"};
//查询顺序为升序
final String SORT_ORDER = Family.Member.GENDER + " ASC";
//查询出的一行数据中只有_id和gender字段对应的值
final String[] TEST_PROJECTION = {Family.Member._ID, Family.Member.GENDER};
//给MEMBER_CONTENT_URI追加id为1
Uri memberIdUri = ContentUris.withAppendedId(Family.Member.MEMBER_CONTENT_URI, 1);
Cursor cursor = mMockResolver.query(
memberIdUri,
null,
null,
null,
null
);
assertEquals(0,cursor.getCount());
//建立测试数据
insertData();
//使用面向表格全部数据的uri查询
cursor = mMockResolver.query(
Family.Member.FAMILY_CONTENT_URI,
TEST_PROJECTION,
SELECTION_COLUMNS_GENDER,
SELECTION_ARGS,
SORT_ORDER
);
assertEquals(1, cursor.getCount());
//移至第一行,测试数据存在
assertTrue(cursor.moveToFirst());
//获取查询得到数据对应的id
int inputMemberId = cursor.getInt(0);
//给MEMBER_CONTENT_URI追加id为查询所得数据对应的id
memberIdUri = ContentUris.withAppendedId(Family.Member.MEMBER_CONTENT_URI, inputMemberId);
//使用单条记录对应的uri查询
cursor = mMockResolver.query(
memberIdUri,
TEST_PROJECTION,
SELECTION_COLUMNS_GENDER,
SELECTION_ARGS,
SORT_ORDER
);
assertEquals(1, cursor.getCount());
assertTrue(cursor.moveToFirst());
//测试追加到uri中的id与uri查询出的数据所对应的id是否一致
assertEquals(inputMemberId, cursor.getInt(0));
//注:查询字段对应值顺序不能颠倒
assertEquals("gender2", cursor.getString(1));
/*for (int i = 0; i < cursor.getCount(); i ++)
{
Log.d("TestProvider", "Id-->" + cursor.getInt(0));
Log.d("TestProvider", "name-->" + cursor.getString(1));
Log.d("TestProvider", "age-->" + cursor.getInt(2));
Log.d("TestProvider", "gender-->" + cursor.getString(3));
cursor.moveToNext();
}   */
}
//测试删除
public void testDeletes()
{
final String SELECTION_COLUMNS_AGE = Family.Member.AGE + " = " + "?";
final String[] SELECTION_ARGS = { "0" };
int rowsDeleted = mMockResolver.delete(
Family.Member.FAMILY_CONTENT_URI,
SELECTION_COLUMNS_AGE,
SELECTION_ARGS
);
//在执行删除数据前还未向表中插入数据,所以删除行数为0
assertEquals(0, rowsDeleted);
//建立数据
insertData();
//执行删除
rowsDeleted = mMockResolver.delete(
Family.Member.FAMILY_CONTENT_URI,
SELECTION_COLUMNS_AGE,
SELECTION_ARGS
);
//测试是否删除一行数据
assertEquals(1, rowsDeleted);
//查询表中已被删除的数据
Cursor cursor = mMockResolver.query(
Family.Member.FAMILY_CONTENT_URI,
null,
SELECTION_COLUMNS_AGE,
SELECTION_ARGS,
null
);
//测试数据是否被成功删除
assertEquals(0, cursor.getCount());
}
// 测试结束后会自动清空数据库中的数据,此处为了验证结束后insertData方法是否正确插入数据
@Override
protected void tearDown() throws Exception
{
// TODO Auto-generated method stub
super.tearDown();
insertData();
}
}
  最后,工程全部建立完后,点击TestProvider.java--->鼠标右键--->Run As--->Android Junit Test即可完成测试。
33/3<123
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号