测试技术之Android测试
白羽 2018-05-21 来源 :网络 阅读 1606 评论 0

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


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


  测试还提供了以下优点:

  快速反馈失败。

  开发周期的早期问题检测。

  安全地重构代码,让你优化代码而不用担心回归。

  稳定开发速度,帮助你减少技术债务。

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


  资源

  在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 测试。


   本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标软件测试之测试技术频道! 

 


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved