单元测试其实分为两种:一种为纯java代码测试,一般位于test包下;另一种为UI测试,一般位于androiTest包下。

本篇用到的单元测试框架主要有:

Junit,Mockito,Robolectric,Espresso

一、Junit

详细资料请参考

1、添加依赖

dependencies {    testCompile "junit:junit:4.12"}

2、创建test文件夹

app    src        main            java                com.woaikakashen                    java代码        test            java                com.woaika.kashen                    测试代码

3、生成对应的test类

java被测试类:Student.classtest测试类:StudentTest.class

生成方式:
通过AndroidStudio创建,选中Student.class 点击右键,选择GoTo--->Test来快速创建单元测试方法

运行:选中测试类中的方法右键Run方法名。

二、Mockito

详细资料请参考资料1
详细资料请参考资料2

1、介绍

用来为提供函数返回结果的模拟(mock)及对函数调用过程的验证。
关键词

mock: 针对真实的类或者对象,创建一个模拟(代理)的对象。

stub: 针对一个类或者对象的方法,进行模拟调用及输出。

2、添加依赖

dependencies {   testCompile "org.mockito:mockito-core:2.11.0"}

3、加载方式

方法一:

    @Test    public void testIsNotNull(){        Person mPerson = mock(Person.class); //<--使用mock方法        assertNotNull(mPerson);    }

方法二:

    @Mock //<--使用@Mock注解    Person mPerson;    @Before    public void setup(){        MockitoAnnotations.initMocks(this); //<--初始化    }

4、常用语法

1.  打桩方法2.  验证方法3.  参数匹配器4.  其他方法

三、Robolectric

详细资料请参考

1、介绍

利用Android SDK和资源来编写测试用例,并将所有的测试用例运行在java虚拟机内。不需要使用模拟器或真机来测试。

2、添加依赖

dependencies {    testCompile "junit:junit:4.12"    testCompile "org.robolectric:robolectric:3.0"}

3、注解配置TestRunner

@RunWith(RobolectricTestRunner.class)@Config(constants = BuildConfig.class, sdk = 21)public class SampleActivityTest {}

4、常用语法

四、Espresso

详细资料请参考资料1

详细资料请参考资料2

Espresso需要依赖Android设备.这将导致我们将花费更多时间在编译apk和AndroidTest apk的安装上

4.1、添加依赖

androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.2', {        exclude group: 'com.android.support', module: 'support-annotations'}

4.2、设置测试执行器

这个运行器是基于InstrumentationTestRunnerGoogleInstrumentationTestRunner ,运行JUnit3和JUnit4来测试你的Android应用程序。

defaultConfig {        ...        testInstrumentationRunner 'android.support.test.runner.AndroidJUnitRunner'    }

4.3、创建androidTest文件夹

app    src        main            java                com.woaikakashen                    java代码        androidTest            java               com.woaikakashen                    UI测试代码        test            java                com.woaika.kashen                    纯测试代码

4.4、常用注解

@Rule:
public ActivityTestRule mActivityRule = new ActivityTestRule<>(            MainActivity.class);
定义一个测试规则,构造函数参数指定一个需要被测试的页面。当打开app会打开对应的页面执行所定义的测试用例。
@Test:
用来定义一个测试用例

4.5、常用语法

1、访问UI元素

onView()方法来访问UI元素, withId()进行id访问,使用withText()进行文本匹配,然后在执行相应的动作,最后在验证

eg:

//验证id为tvLoanBig的text内容是否为极速大额贷onView(withId(R.id.tvLoanBig)).check(matches(withText("极速大额贷")));
2、AdapterView

onData 方法来获取DataInteraction对象,然后在来访问目标元素。Espresso处理加载目标元素到当前层次结构。

3、执行动作

调用ViewInteraction.perform()DataInteraction.perform()。可以指定一个或者多个动作,Espresso会按照指定的顺序,依次发送动作事件,这些动作是线程安全的.

ViewActions可以提供一些列常用的方法,我们可以利用写方法来操作UI元素。

  • ViewActions.click(): 点击事件
  • ViewActions.typeText(): 输入指定的文字内容
  • ViewActions.scrollTo(): 滑动
  • ViewActions.pressKey(): 按下按键
  • ViewActions.clearText(): 清空文本
4、校验结果

调用ViewInteraction.check()DataInteraction.check()方法,可以判断UI元素的状态,如果断言失败,会抛出AssertionFailedError异常。

比如:
- doesNotExist: 断言某一个view不存在
- matches: 断言某个view存在,且符合一列的匹配
- selectedDescendentsMatch:断言指定的子元素存在,且他们的状态符合一些列的匹配

4.6、Espresso 自动化测试- RecyclerView

从测试的角度上来看 RecyclerView不是一个 AdapterView,这意味着你不能使用 onData()去跟你的list items交互。

1、添加对应的库
dependencies {    // ...   androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0');}

但是这样子的话。gradle就会出现报错了,出现一些依赖关系的冲突,所以我们需要去除一些重复的依赖关系。

dependencies {    // ...    androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') {        exclude group: 'com.android.support', module: 'appcompat'        exclude group: 'com.android.support', module: 'support-v4'        exclude module: 'recyclerview-v7'    }}
2、常用语法

主要用到RecyclerViewActions类

2.1 actionOnItemAtPosition
//点击position为5的itemonView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.actionOnItemAtPosition(5, click()));
2.2 actionOnItem
//点击带有 "百度有钱花" 字符串的itemonView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.actionOnItem(hasDescendant(withText("百度有钱花")), click()));

hasDescendant 指代的是对应的item的后代中有包含对应文本的内容的.不过使用这个需要小心 因为很有可能会出现两个同样内容的

2.3 scrollToPosition
//滚动到position为5的位置onView(withId(R.id.rvLoanAll)).perform(RecyclerViewActions.scrollToPosition(5));

4.7、Espresso 自动化测试- 异步代码测试

由于成本过高,需要大量代码,而且需要实现idlingResource接口,请查阅:

详细请参考资料

//Espresso的IdlingResource异步接口依赖:compile('com.android.support.test.espresso:espresso-idling-resource:3.0.1') {        exclude module: 'support-annotations'    }androidTestCompile('com.android.support.test.espresso:espresso-idling-resource:3.0.1') {        exclude module: 'support-annotations'}

更多相关文章

  1. android内置的一些测试程序
  2. android软键盘状态监听最稳的方法,属性动画手动调整布局,再也不怕
  3. Android中的SrollView滚动详解
  4. Android(安卓)完全退出应用方法
  5. 转:Android(安卓)测试 Appium、Robotium、monkey等框架或者工具对
  6. Android中onActivityResult方法总结
  7. android Support Annotations(注解支持)
  8. 异步加载注意的事项
  9. Android9.0 SIM卡初始化---更新数据(代码 高通9.0代码)

随机推荐

  1. sqlserver数据库危险扩展删除和恢复代码
  2. SQLServer中汇总功能的使用GROUPING,ROLL
  3. 监控 log文件大小的存储过程
  4. sqlserver 千万数量级分页存储过程代码
  5. 大数据量分页存储过程效率测试附测试代码
  6. SQLServer导入数据图文方法
  7. 数据库备份 SQLServer的备份和灾难恢复
  8. 一个用来统计相同姓名人数的SQl语句
  9. sqlserver另类非递归的无限级分类(存储过
  10. 小系统单据自动生成存储过程