Instrumentation测试进阶练习

原创 2018年04月16日 13:59:24

本篇文章主要讲解两个练习,如何测试Content Provider和Application

练习: 测试Content Provider

下面是一个Content Provider 的测试案例 (原文中并无此案例)

假设存在一个 ContentProvider, 支持插入数据和查询数据 (仅为测试, 无实际意义,为减少篇幅已删除部分非关键代码)

package com.lulu.androidtestdemo.instrumentation;

// more
public class MyContentProvider extends ContentProvider {

    public static final String AUTHORITIES = "com.lulu.androidtestdemo.MyContentProvider";
    public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITIES + "/content");
    private SQLiteOpenHelper mDbHelper;
    public static final int CODE_TEST = 1;
    private static final UriMatcher mUriMatcher;

    static{
        mUriMatcher = new UriMatcher(0);

        // 添加 Uri的匹配规则,实现 uri 对应判断是哪个表的操作
        mUriMatcher.addURI("*", "/content", CODE_TEST);
    }

    public MyContentProvider() {
    }

    @Override
    public boolean onCreate() {
        mDbHelper = new DbHelper(getContext());
        return true;
    }
    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Uri ret = null;
        int code = mUriMatcher.match(uri);
        SQLiteDatabase db = mDbHelper.getWritableDatabase();
        switch (code) {
            case CODE_TEST:
                long id = db.insert(TEST_TABLE_NAME, null, values);
                // 数据库添加完成之后返回的 ID,必须和 Uri参数拼接在一起,再返回
                ret = ContentUris.withAppendedId(uri, id);
                break;
        }
        db.close();
        return ret;
    }
    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
                        String[] selectionArgs, String sortOrder) {
        Cursor ret = null;
        SQLiteDatabase db = mDbHelper.getReadableDatabase();
        int code = mUriMatcher.match(uri);
        switch (code) {
            case CODE_TEST:
                ret = db.query(TEST_TABLE_NAME, projection, selection,
                        selectionArgs, null, null, sortOrder);
                break;
        }
        return ret;
    }
    // more
    public SQLiteOpenHelper getDbHelper() {
        return mDbHelper;
    }

    public static final String TEST_TABLE_NAME = "testTable";
    public static final String TEST_TABLE_COL_CONTENT = "content";

    public class DbHelper extends SQLiteOpenHelper {
        private static final String CREATE_TABLE_COST =
                "create table if not exists " + TEST_TABLE_NAME +
                        "( _id integer primary key autoincrement," +
                        TEST_TABLE_COL_CONTENT + " text" +
                        ")";
        public DbHelper(Context context) {
            super(context, "myapp", null, 1);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE_COST);
        }
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        }
    }
}

通过继承 ProviderTestCase2 类, 测试 insert 方法是否生效, 本测试用例执行通过.

/**
 * Created by zhanglulu on 2018/3/2.
 */
@RunWith(AndroidJUnit4.class)
public class MyContentProviderTest extends ProviderTestCase2<MyContentProvider>{

    public MockContentResolver mMockResolver;

    public MyContentProviderTest() {
        super(MyContentProvider.class, MyContentProvider.AUTHORITIES);
    }

    @Before
    @Override
    public void setUp() throws Exception {
        setContext(InstrumentationRegistry.getTargetContext());
        super.setUp();
        mMockResolver = getMockContentResolver();
    }
    @Test
    public void insert() throws Exception {
        ContentValues values = new ContentValues();
        values.put(MyContentProvider.TEST_TABLE_COL_CONTENT, "保存测试信息");
        Uri insert = mMockResolver.insert(MyContentProvider.CONTENT_URI, values);
        Cursor cursor = mMockResolver.query(MyContentProvider.CONTENT_URI,
                null, null,
                null, null);
        assertTrue(cursor.moveToNext());
        assertEquals(1, cursor.getCount());
        String testStr =
                cursor.getString(cursor.getColumnIndex(MyContentProvider.TEST_TABLE_COL_CONTENT));
        assertEquals(testStr, "保存测试信息");
    }
}

注意: 写上面的这个测试用例非常的坑 !!!

  1. @Before和@Test 两个注解务必要加上, 网上找到很多资料都是比较旧的没有加上这两个注解导致测试无法运行.
  2. 最坑的是上述的setContext()方法务必添加, 而且添加的位置务必在super.setUp()方法之前. 官方文档竟然放在了这个super方法的下面!导致无法运行测试

截图为证:

坑啊

练习: 测试Application

创建工程

创建一个待测试Application , 并且不要忘记在AndroidMainfest.xml中声明.

public class MyApplication extends Application {
    public static final List<String> list = new ArrayList<String>();
}

对Application对象创建本地单元测试

src/src/test 目录下创建单元测试. 验证 MyApplication.list 字段不为null.

对Application对象创建 Instrumented 测试

创建下面基于JUnit 3测试框架的Instrumented测试

package com.lulu.androidtestdemo.instrumentation;

import android.content.pm.PackageInfo;
import android.test.ApplicationTestCase;
import android.test.MoreAsserts;

import com.lulu.androidtestdemo.MyApplication;

import org.junit.Test;

/**
 * Created by zhanglulu on 2018/2/26.
 */

public class ApplicationTest extends ApplicationTestCase<MyApplication> {

    public MyApplication application;

    public ApplicationTest() {
        super(MyApplication.class);
    }


    @Override
    protected void setUp() throws Exception {
        super.setUp();
        createApplication();
        application = getApplication();
    }

    @Test
    public void testCorrectVersion() throws Exception {
        PackageInfo info = application.getPackageManager().getPackageInfo(application.getPackageName(), 0);
        assertNotNull(info);
        MoreAsserts.assertMatchesRegex("\\d\\.\\d", info.versionName);
    }
}

敲行代码再睡觉

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013144863/article/details/79959733

测试

-
  • 1970年01月01日 08:00

Android白盒测试之Instrumentation初探(一)

一、Instrumentation简介 Instrumentation是Android 测试的核心框架,可使用它进行Android应用的单元测试和自动化测试。Instrumentation可以在主程序...
  • yiwaChen
  • yiwaChen
  • 2016-09-07 23:34:30
  • 4593

Android 使用Instrumentation进行自动化测试

使用Instrumentation 进行代码的自动测试。
  • Mr_DV_BKHM
  • Mr_DV_BKHM
  • 2016-05-24 16:19:11
  • 387

单元测试instrumentation入门---eclipse

前言:
  • harvic880925
  • harvic880925
  • 2014-07-18 10:59:18
  • 4216

SQL进阶练习题

SQL进阶练习题是对SQL基础练习题的深入,有些题目会用到多层嵌套,对新手培养逻辑思维有一定的益处。有些题目的解法不止一种,这里只给出了个人喜好的解法。如果有想探讨多种解法的朋友可以留下邮箱,我这里有...
  • xu200yang
  • xu200yang
  • 2017-04-07 12:15:38
  • 678

Hadoop入门进阶步步高(四)-测试Hadoop

四、测试Hadoop一个简单的求每年温度最大值的程序。1、准备两个文本测试数据准备两个名为data1.txt及data2.txt的文件,用于做为计算的输入数据,将其放于/home/fenglibin/...
  • fenglibing
  • fenglibing
  • 2014-06-15 22:11:56
  • 7027

Instrumentation测试进阶

本篇主要讲解通过Instrumentation如何测试Android组件, 如何生成测试覆盖率报告等. 测试Android 组件 Activity测试 测试Activity,需要...
  • u013144863
  • u013144863
  • 2018-04-16 13:58:26
  • 5

Android自动化测试框架开发(三)Instrumentation测试框架

本篇开始将介绍几个重量级的测试框架,首先介绍的是Android最早推出的便于进行程序深入的,系统性的单元测试的框架–Instrumentation。Instrumentation从android2.3...
  • Missueverday
  • Missueverday
  • 2016-05-11 11:10:59
  • 1462

Instrumentation安卓官方简介(个人认为是HighLevel抽象出来的最简洁明了的阐述)

官方连接:http://developer.android.com/tools/testing/testing_android.html中间Instrumentation段落 (百度出来的Instru...
  • zhubaitian
  • zhubaitian
  • 2014-09-26 12:45:49
  • 2833

本地测试和Instrumentation测试练习

本篇讲解两个练习, 本地单元测试和Instrumentation测试. 练习: 创建本地单元测试 在接下来的练习中你将学到在Android 工程中如何创建一个简单的JUnit 4测试....
  • u013144863
  • u013144863
  • 2018-04-16 13:57:50
  • 11
收藏助手
不良信息举报
您举报文章:Instrumentation测试进阶练习
举报原因:
原因补充:

(最多只允许输入30个字)