Android测试:Testing Apps on Android

原文:https://developer.android.com...html

测试你的App是开发过程当中的重要组成部分。经过对应用程序持续的运行测试,你能够验证程序的正确性、功能和可用在发布以前。java

测试还提供了如下优势:android

  • 快速反馈失败。
  • 开发周期的早期问题检测。
  • 安全地重构代码,让你优化代码而不用担忧回归。
  • 稳定开发速度,帮助你减小技术债务。

这里的特指测试经过代码实现的“单元”测试。因此,它能够更早、更快的帮咱们发现问题,使咱们的代码重构更有信心;单元测试虽然前期编写会比较耗时,可是它能够有效的代码的质量,不会致使项目后期代码充满坏味道,严重拖慢开发进度;因此,减小你技术债务。安全

资源


在Android测试库、Android平台和开源社区都提供了帮助你编写Android应用测试的工具:框架

Espesso

Espresso是android应用开发自带测试库。他是一款白盒风格的UI测试工具。UI测试就都是黑盒的么?为何会是白盒风格。工具

说白盒是由于,经过Espresso编写测试调用Android控件的方式和 Android开发中是同样的。
来看一段Android开发中,Activity中编写的代码。布局

/** Called when the user clicks the Send button */
public void sendMessage(View view) {
    // Do something in response to button
    Intent intent = new Intent(this, DisplayMessageActivity.class);
    EditText editText = (EditText) findViewById(R.id.edit_message);
    String message = editText.getText().toString();
    intent.putExtra(EXTRA_MESSAGE, message);
    startActivity(intent);
}

经过 R.id.edit_message 调用布局文件中输入框中的内容,并转交到另一个Activity处理。单元测试

再来看一段 Espesso 的测试代码:测试

@Test
public void InputEditCase() throws InterruptedException{

    onView(withId(R.id.edit_message)).perform(typeText(STRING_TO_BE_TYPED));
    onView(withId(R.id.send_button)).perform(click());

    onView(withId(R.id.display_message)).check(matches(isDisplayed()));
    onView(withId(R.id.display_message)).check(matches(withText("hello," +STRING_TO_BE_TYPED)));
}

一样使用的是 R.id.edit_message 的定位方式来查找控件,是否是白盒?咱们一般的黑盒UI自动化测试是经过UI属性查看工具(如:UIAutomatorViewer)肯定元素的属性来进行定位的。Espesso不须要,你看代码就行了,准确点是看Android的布局文件的控件定义。优化

可是,Espesso的运行是基于 SDK 的,因此,要想运行一条用例必须在Android模拟器(或真机)上安装App,启动App,而后基于UI的操做来运行测试用例。

Robolectric


Robolectric是一款第三方的开源的Android单元测试框架。运行在JVM上,因此它运行速度上会比 Espesso快上不少。

@RunWith(RobolectricTestRunner.class)
public class MyActivityTest {

    @Test
    public void clickingButton_shouldChangeResultsViewText() throws Exception {
        MyActivity activity = Robolectric.setupActivity(MyActivity.class);

        Button button = (Button) activity.findViewById(R.id.button);
        TextView results = (TextView) activity.findViewById(R.id.results);

        button.performClick();
        assertThat(results.getText().toString()).isEqualTo("Robolectric Rocks!");
    }
}

来一段官方Demo,robolectric的作法是经过实现一套JVM能运行的Android代码,而后在单元测试运行的时候去截取android相关的代码调用,而后转到他们的他们实现的代码去执行这个调用的过程。

你不明白原理也不要紧,反正知道Robolectric的运行不须要你真正的打开App去执行测试,就像运行一段普通的Java代码同样。因此速度上固然就很快了。

AndroidJUnitRunner


AndroidJUnitRunner本质上不算是个测试工具,它只是Google基于Junit针对Anroid封装的一个测试用例运行器而已。至于它用来运行Espesso仍是Uiautomator的用例都是能够的。那Robolectric呢?没看到上面的例子中Robolectric有本身的运行器叫RobolectricTestRunner

@RunWith(AndroidJUnit4.class)
public class MainActiveTest{
 
   ……

}

若是看到测试类是用 AndroidJUnit4 注释的,说明用的就是AndroidJUnitRunner运行器的。

测试应用


最后,更好的编写测试用例的平台,固然是Google家的亲儿子了。器大活好不粘人!(如今才发现不是去幼儿园的车,晚了,把车门给我捍死,一个都不许下车。)

Android Studio 以简化测试为设计宗旨。 您只需完成几回点击,即可创建一个在本地 JVM 上运行的 JUnit 测试,或创建一个在设备上运行的仪器测试。

固然,您也能够经过集成测试框架来扩展测试能力,例如能够集成 Mockito 在本地单元测试中测试 Android API 调用,以及集成 Espresso 或 UI Automator 在仪器测试中演练用户交互。您能够利用 Espresso 测试记录器自动生成 Espresso 测试。

相关文章
相关标签/搜索