Android单元测试之四:仪器化测试

Android单元测试之四:仪器化测试

仪器化测试

  在某些情况下,虽然可以通过模拟的手段来隔离 Android 依赖,但代价很大,这种情况下可以考虑仪器化的单元测试,有助于减少编写和维护模拟代码所需的工作量。
  仪器化测试是在真机或模拟器上运行的测试,它们可以利用 Android framework APIs 和 supporting APIs 。如果测试用例需要访问仪器(instrumentation)信息(如应用程序的 Context ),或者需要 Android 框架组件的真正实现(如 Parcelable 或 SharedPreferences 对象),那么应该创建仪器化单元测试,由于要跑到真机或模拟器上,所以会慢一些。

如何进行仪器化测试

  测试使用 SharedPreferences 的工具类,使用 SharedPreferences 需要访问 Context 类以及 SharedPreferences 的具体实现,采用模拟隔离的话代价会比较大,所以采用仪器化测试比较合适。

配置

1dependencies { 2 ... 3 androidTestCompile 'com.android.support:support-annotations:26.1.0' 4 androidTestImplementation 'com.android.support.test:runner:1.0.2' 5 androidTestCompile 'com.android.support.test:rules:1.0.2' 6} 7 8 9defaultConfig { 10 ... 11 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12}

测试

被测试类

1package com.zm.androidUnitTest; 2 3import android.content.Context; 4import android.content.SharedPreferences; 5 6/** 7 * Author: zhangmiao 8 * Date: 2018/9/25 9 */ 10public class SharedPreferenceDao { 11 private SharedPreferences sp; 12 13 public SharedPreferenceDao(SharedPreferences sp) { 14 this.sp = sp; 15 } 16 17 public SharedPreferenceDao(Context context) { 18 this(context.getSharedPreferences("config", Context.MODE_PRIVATE)); 19 } 20 21 public void put(String key, String value) { 22 SharedPreferences.Editor editor = sp.edit(); 23 editor.putString(key, value); 24 editor.apply(); 25 } 26 27 public String get(String key) { 28 return sp.getString(key, null); 29 } 30}

测试类

1package com.zm.androidUnitTest; 2 3import android.support.test.runner.AndroidJUnit4; 4 5import org.junit.Assert; 6import org.junit.Before; 7import org.junit.Test; 8import org.junit.runner.RunWith; 9 10/** 11 * Author: zhangmiao 12 * Date: 2018/9/25 13 */ 14@RunWith(AndroidJUnit4.class) 15public class SharedPreferenceDaoTest { 16 public static final String TEST_KEY = "name"; 17 public static final String TEST_STRING = "zhangmiao"; 18 19 SharedPreferenceDao spDao; 20 21 @Before 22 public void setUp() { 23 spDao = new SharedPreferenceDao(App.getAppContext()); 24 } 25 26 @Test 27 public void sharedPreferenceDaoWriteRead() { 28 spDao.put(TEST_KEY, TEST_STRING); 29 Assert.assertEquals(TEST_STRING, spDao.get(TEST_KEY)); 30 } 31}

  运行方式和本地单元测试一样,这个过程会向连接的设备安装 apk。
测试结果

  通过测试结果可以清晰看到状态 passed ,仔细看打印的 log ,可以发现,这个过程向模拟器安装了两个 apk 文件,分别是 AndroidUnitTest-debug.apk 和 AndroidUnitTest-debug-androidTest.apk , instrumented 测试相关的逻辑在 AndroidUnitTest-debug-androidTest.apk 中。

参考文章

https://www.jianshu.com/p/aa51a3e007e2

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )

Android单元测试之四:仪器化测试 - HelloWorld